From 080540fb6bb1c7eca27dbdb94942b2f5807d0627 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 5 Mar 2024 05:02:55 +0000 Subject: [PATCH] Deploy Sphinx documentation --- .buildinfo | 4 + .nojekyll | 0 _images/compiler_pipeline.png | Bin 0 -> 36891 bytes _images/joint_transforms.png | Bin 0 -> 479613 bytes _sources/basics.rst.txt | 214 ++ _sources/configuration.rst.txt | 152 + _sources/debugging.rst.txt | 86 + _sources/faq.rst.txt | 130 + _sources/index.rst.txt | 190 ++ _sources/installation.rst.txt | 86 + _sources/limitations.rst.txt | 56 + _sources/modules/devices.rst.txt | 204 ++ _sources/modules/fem.rst.txt | 392 +++ _sources/modules/functions.rst.txt | 1992 +++++++++++ _sources/modules/interoperability.rst.txt | 291 ++ _sources/modules/render.rst.txt | 38 + _sources/modules/runtime.rst.txt | 1554 +++++++++ _sources/modules/sim.rst.txt | 157 + _sources/modules/sparse.rst.txt | 32 + _static/basic.css | 903 +++++ _static/check-solid.svg | 4 + _static/clipboard.min.js | 7 + _static/copy-button.svg | 5 + _static/copybutton.css | 94 + _static/copybutton.js | 248 ++ _static/copybutton_funcs.js | 73 + _static/custom.css | 37 + _static/debug.css | 69 + _static/doctools.js | 156 + _static/documentation_options.js | 14 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 199 ++ _static/logo-dark-mode.png | Bin 0 -> 8504 bytes _static/logo-light-mode.png | Bin 0 -> 10324 bytes _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 258 ++ _static/scripts/furo-extensions.js | 0 _static/scripts/furo.js | 3 + _static/scripts/furo.js.LICENSE.txt | 7 + _static/scripts/furo.js.map | 1 + _static/searchtools.js | 566 ++++ _static/skeleton.css | 296 ++ _static/sphinx_highlight.js | 144 + _static/styles/furo-extensions.css | 2 + _static/styles/furo-extensions.css.map | 1 + _static/styles/furo.css | 2 + _static/styles/furo.css.map | 1 + basics.html | 526 +++ configuration.html | 555 ++++ debugging.html | 407 +++ faq.html | 440 +++ genindex.html | 2154 ++++++++++++ index.html | 574 ++++ installation.html | 391 +++ limitations.html | 383 +++ modules/devices.html | 642 ++++ modules/fem.html | 2106 ++++++++++++ modules/functions.html | 3195 ++++++++++++++++++ modules/interoperability.html | 799 +++++ modules/render.html | 894 +++++ modules/runtime.html | 2819 ++++++++++++++++ modules/sim.html | 3670 +++++++++++++++++++++ modules/sparse.html | 952 ++++++ objects.inv | Bin 0 -> 5977 bytes py-modindex.html | 329 ++ search.html | 292 ++ searchindex.js | 1 + 68 files changed, 29797 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 _images/compiler_pipeline.png create mode 100644 _images/joint_transforms.png create mode 100644 _sources/basics.rst.txt create mode 100644 _sources/configuration.rst.txt create mode 100644 _sources/debugging.rst.txt create mode 100644 _sources/faq.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/installation.rst.txt create mode 100644 _sources/limitations.rst.txt create mode 100644 _sources/modules/devices.rst.txt create mode 100644 _sources/modules/fem.rst.txt create mode 100644 _sources/modules/functions.rst.txt create mode 100644 _sources/modules/interoperability.rst.txt create mode 100644 _sources/modules/render.rst.txt create mode 100644 _sources/modules/runtime.rst.txt create mode 100644 _sources/modules/sim.rst.txt create mode 100644 _sources/modules/sparse.rst.txt create mode 100644 _static/basic.css create mode 100644 _static/check-solid.svg create mode 100644 _static/clipboard.min.js create mode 100644 _static/copy-button.svg create mode 100644 _static/copybutton.css create mode 100644 _static/copybutton.js create mode 100644 _static/copybutton_funcs.js create mode 100644 _static/custom.css create mode 100644 _static/debug.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/logo-dark-mode.png create mode 100644 _static/logo-light-mode.png create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/scripts/furo-extensions.js create mode 100644 _static/scripts/furo.js create mode 100644 _static/scripts/furo.js.LICENSE.txt create mode 100644 _static/scripts/furo.js.map create mode 100644 _static/searchtools.js create mode 100644 _static/skeleton.css create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/styles/furo-extensions.css create mode 100644 _static/styles/furo-extensions.css.map create mode 100644 _static/styles/furo.css create mode 100644 _static/styles/furo.css.map create mode 100644 basics.html create mode 100644 configuration.html create mode 100644 debugging.html create mode 100644 faq.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 installation.html create mode 100644 limitations.html create mode 100644 modules/devices.html create mode 100644 modules/fem.html create mode 100644 modules/functions.html create mode 100644 modules/interoperability.html create mode 100644 modules/render.html create mode 100644 modules/runtime.html create mode 100644 modules/sim.html create mode 100644 modules/sparse.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..167c155a --- /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: 337e1038544dd3049be648e1e3ea241c +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_images/compiler_pipeline.png b/_images/compiler_pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..f3475577b971e46a42ee1bf622def4b3a05048d5 GIT binary patch literal 36891 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

G7Q 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≥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 |J9Ft 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 F{uctL%I*LF literal 0 HcmV?d00001 diff --git a/_sources/basics.rst.txt b/_sources/basics.rst.txt new file mode 100644 index 00000000..ee2d32aa --- /dev/null +++ b/_sources/basics.rst.txt @@ -0,0 +1,214 @@ +Basics +====== + +Initialization +-------------- + +Before use Warp should be explicitly initialized with the ``wp.init()`` method as follows:: + + import warp as wp + + wp.init() + +Warp will print some startup information about the compute devices available, driver versions, and the location +for any generated kernel code, e.g.: + +.. code:: bat + + Warp 1.0.0 initialized: + CUDA Toolkit: 11.8, Driver: 12.1 + Devices: + "cpu" | AMD64 Family 25 Model 33 Stepping 0, AuthenticAMD + "cuda:0" | NVIDIA GeForce RTX 4080 (sm_89) + Kernel cache: C:\Users\mmacklin\AppData\Local\NVIDIA\warp\Cache\1.0.0 + + +Kernels +------- + +In Warp, compute kernels are defined as Python functions and annotated with the ``@wp.kernel`` decorator, as follows:: + + @wp.kernel + def simple_kernel(a: wp.array(dtype=wp.vec3), + b: wp.array(dtype=wp.vec3), + c: wp.array(dtype=float)): + + # get thread index + tid = wp.tid() + + # load two vec3s + x = a[tid] + y = b[tid] + + # compute the dot product between vectors + r = wp.dot(x, y) + + # write result back to memory + c[tid] = r + +Because Warp kernels are compiled to native C++/CUDA code, all the function input arguments must be statically typed. This allows +Warp to generate fast code that executes at essentially native speeds. Because kernels may be run on either the CPU +or GPU, they cannot access arbitrary global state from the Python environment. Instead they must read and write data +through their input parameters such as arrays. + +Warp kernels functions have a 1:1 correspondence with CUDA kernels, to launch a kernel with 1024 threads, we use +:func:`wp.launch() ` as follows:: + + wp.launch(kernel=simple_kernel, # kernel to launch + dim=1024, # number of threads + inputs=[a, b, c], # parameters + device="cuda") # execution device + +Inside the kernel we can retrieve the *thread index* of the each thread using the ``wp.tid()`` builtin function:: + + # get thread index + i = wp.tid() + +Kernels can be launched with 1D, 2D, 3D, or 4D grids of threads, e.g.: to launch a 2D grid of threads to process a 1024x1024 image we could write:: + + wp.launch(kernel=compute_image, + dim=(1024, 1024), + inputs=[img], + device="cuda") + +Then, inside the kernel we can retrieve a 2D thread index as follows:: + + # get thread index + i, j = wp.tid() + + # write out a color value for each pixel + color[i, j] = wp.vec3(r, g, b) + +.. _example-cache-management: + +Example: Changing the kernel cache directory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following example illustrates how the location for generated and compiled +kernel code can be changed before and after calling ``wp.init()``. + +.. code:: python + + import os + + import warp as wp + + example_dir = os.path.dirname(os.path.realpath(__file__)) + + # set default cache directory before wp.init() + wp.config.kernel_cache_dir = os.path.join(example_dir, "tmp", "warpcache1") + + wp.init() + + print("+++ Current cache directory: ", wp.config.kernel_cache_dir) + + # change cache directory after wp.init() + wp.build.init_kernel_cache(os.path.join(example_dir, "tmp", "warpcache2")) + + print("+++ Current cache directory: ", wp.config.kernel_cache_dir) + + # clear kernel cache (forces fresh kernel builds every time) + wp.build.clear_kernel_cache() + + + @wp.kernel + def basic(x: wp.array(dtype=float)): + tid = wp.tid() + x[tid] = float(tid) + + + device = "cpu" + n = 10 + x = wp.zeros(n, dtype=float, device=device) + + wp.launch(kernel=basic, dim=n, inputs=[x], device=device) + print(x.numpy()) + +Arrays +------ + +Memory allocations are exposed via the ``wp.array`` type. Arrays wrap an underlying memory allocation that may live in +either host (CPU), or device (GPU) memory. Arrays are strongly typed and store a linear sequence of built-in values +(``float,``, ``int``, ``vec3``, ``matrix33``, etc). + +Arrays can be allocated similar to PyTorch:: + + # allocate an uninitialized array of vec3s + v = wp.empty(shape=n, dtype=wp.vec3, device="cuda") + + # allocate a zero-initialized array of quaternions + q = wp.zeros(shape=n, dtype=wp.quat, device="cuda") + + # allocate and initialize an array from a NumPy array + # will be automatically transferred to the specified device + a = np.ones((10, 3), dtype=np.float32) + v = wp.from_numpy(a, dtype=wp.vec3, device="cuda") + +By default, Warp arrays that are initialized from external data (e.g.: NumPy, Lists, Tuples) will create a copy the data to new memory for the +device specified. However, it is possible for arrays to alias external memory using the ``copy=False`` parameter to the +array constructor provided the input is contiguous and on the same device. See the :doc:`/modules/interoperability` +section for more details on sharing memory with external frameworks. + +To read GPU array data back to CPU memory we can use the ``array.numpy()`` method:: + + # bring data from device back to host + view = device_array.numpy() + +This will automatically synchronize with the GPU to ensure that any outstanding work has finished, and will +copy the array back to CPU memory where it is passed to NumPy. Calling ``array.numpy()`` on a CPU array will return +a zero-copy NumPy view onto the Warp data. + +User Functions +-------------- + +Users can write their own functions using the ``@wp.func`` decorator, for example:: + + @wp.func + def square(x: float): + return x*x + +User functions can be called freely from within kernels inside the same module and accept arrays as inputs. + +Compilation Model +----------------- + +Warp uses a Python->C++/CUDA compilation model that generates kernel code from Python function definitions. All kernels belonging to a Python module are runtime compiled into dynamic libraries and PTX, the result is then cached between application restarts for fast startup times. + +Note that compilation is triggered on the first kernel launch for that module. Any kernels registered in the module with ``@wp.kernel`` will be included in the shared library. + +.. image:: ./img/compiler_pipeline.png + + +Language Details +---------------- + +To support GPU computation and differentiability, there are some differences from the CPython runtime. + +Built-in Types +^^^^^^^^^^^^^^ + +Warp supports a number of built-in math types similar to high-level shading languages, for example ``vec2, vec3, vec4, mat22, mat33, mat44, quat, array``. All built-in types have value semantics so that expressions such as ``a = b`` generate a copy of the variable b rather than a reference. + +Strong Typing +^^^^^^^^^^^^^ + +Unlike Python, in Warp all variables must be typed. Types are inferred from source expressions and function signatures using the Python typing extensions. All kernel parameters must be annotated with the appropriate type, for example: :: + + @wp.kernel + def simple_kernel(a: wp.array(dtype=vec3), + b: wp.array(dtype=vec3), + c: float): + +Tuple initialization is not supported, instead variables should be explicitly typed: :: + + # invalid + a = (1.0, 2.0, 3.0) + + # valid + a = wp.vec3(1.0, 2.0, 3.0) + + +Limitations and Unsupported Features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +See :doc:`limitations` for a list of Warp limitations and unsupported features. diff --git a/_sources/configuration.rst.txt b/_sources/configuration.rst.txt new file mode 100644 index 00000000..de3bc67a --- /dev/null +++ b/_sources/configuration.rst.txt @@ -0,0 +1,152 @@ +Runtime Settings +================ + +Warp has settings at the global, module, and kernel level that can be used to fine-tune the compilation and verbosity +of Warp programs. In cases in which a setting can be changed at multiple levels (e.g ``enable_backward``), +the setting at the more-specific scope takes precedence. + +Global Settings +--------------- + +To change a setting, prepend ``wp.config.`` to the name of the variable and assign a value to it. +Some settings may be changed on the fly, while others need to be set prior to calling ``wp.init()`` to take effect. + +For example, the location of the user kernel cache can be changed with: + +.. code-block:: python + + import os + + import warp as wp + + example_dir = os.path.dirname(os.path.realpath(__file__)) + + # set default cache directory before wp.init() + wp.config.kernel_cache_dir = os.path.join(example_dir, "tmp", "warpcache1") + + wp.init() + + +Basic Global Settings +^^^^^^^^^^^^^^^^^^^^^ + + ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +| Field | Type |Default Value| Description | ++================================================+=========+=============+==========================================================================+ +|``verify_fp`` | Boolean | ``False`` | If ``True``, Warp will check that inputs and outputs are finite before | +| | | | and/or after various operations. **Has performance implications.** | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``verify_cuda`` | Boolean | ``False`` | If ``True``, Warp will check for CUDA errors after every launch and | +| | | | memory operation. CUDA error verification cannot be used during graph | +| | | | capture. **Has performance implications.** | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``print_launches`` | Boolean | ``False`` | If ``True``, Warp will print details of every kernel launch to standard | +| | | | out (e.g. launch dimensions, inputs, outputs, device, etc.). | +| | | | **Has performance implications.** | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``mode`` | String |``"release"``| Controls whether to compile Warp kernels in debug or release mode. | +| | | | Valid choices are ``"release"`` or ``"debug"``. | +| | | | **Has performance implications.** | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``max_unroll`` | Integer | Global | The maximum fixed-size loop to unroll. Note that ``max_unroll`` does not | +| | | setting | consider the total number of iterations in nested loops. This can result | +| | | | in a large amount of automatically generated code if each nested loop is | +| | | | below the ``max_unroll`` threshold. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``verbose`` | Boolean | ``False`` | If ``True``, additional information will be printed to standard out | +| | | | during code generation, compilation, etc. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``quiet`` | Boolean | ``False`` | If ``True``, Warp module initialization messages will be disabled. | +| | | | This setting does not affect error messages and warnings. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``kernel_cache_dir`` | String | ``None`` | The path to the directory used for the user kernel cache. Subdirectories | +| | | | named ``gen`` and ``bin`` will be created in this directory. If ``None``,| +| | | | a directory will be automatically determined using | +| | | | `appdirs.user_cache_directory `_ | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``enable_backward`` | Boolean | ``True`` | If ``True``, backward passes of kernels will be compiled by default. | +| | | | Disabling this setting can reduce kernel compilation times. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``enable_graph_capture_module_load_by_default`` | Boolean | ``True`` | If ``True``, ``wp.capture_begin()`` will call ``wp.force_load()`` to | +| | | | compile and load Warp kernels from all imported modules before capture. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ +|``enable_mempools_at_init`` | Boolean | ``False`` | If ``True``, ``wp.init()`` will enable pooled allocators on all CUDA | +| | | | devices that support memory pools. | +| | | | Pooled allocators are generally faster and can be used during CUDA graph | +| | | | capture. For the caveats, see CUDA Pooled Allocators documentation. | ++------------------------------------------------+---------+-------------+--------------------------------------------------------------------------+ + + +Advanced Global Settings +^^^^^^^^^^^^^^^^^^^^^^^^ + ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +| Field | Type |Default Value| Description | ++====================+=========+=============+==========================================================================+ +|``cache_kernels`` | Boolean | ``True`` | If ``True``, kernels that have already been compiled from previous | +| | | | application launches will not be recompiled. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``cuda_output`` | String | ``None`` | The preferred CUDA output format for kernels. Valid choices are ``None``,| +| | | | ``"ptx"``, and ``"cubin"``. If ``None``, a format will be determined | +| | | | automatically. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``ptx_target_arch`` | Integer | 70 | The target architecture for PTX generation. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``llvm_cuda`` | Boolean | ``False`` | If ``True``, Clang/LLVM will be used to compile CUDA code instead of | +| | | | NVTRC. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ + +Module Settings +--------------- + +Module-level settings to control runtime compilation and code generation may be changed by passing a dictionary of +option pairs to ``wp.set_module_options()``. + +For example, compilation of backward passes for the kernel in an entire module can be disabled with: + +.. code:: python + + wp.set_module_options({"enable_backward": False}) + +The options for a module can also be queried using ``wp.get_module_options()``. + ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +| Field | Type |Default Value| Description | ++====================+=========+=============+==========================================================================+ +|``mode`` | String | Global | Controls whether to compile the module's kernels in debug or release | +| | | setting | mode by default. Valid choices are ``"release"`` or ``"debug"``. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``max_unroll`` | Integer | Global | The maximum fixed-size loop to unroll. Note that ``max_unroll`` does not | +| | | setting | consider the total number of iterations in nested loops. This can result | +| | | | in a large amount of automatically generated code if each nested loop is | +| | | | below the ``max_unroll`` threshold. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``enable_backward`` | Boolean | Global | If ``True``, backward passes of kernels will be compiled by default. | +| | | setting | Valid choices are ``"release"`` or ``"debug"``. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``fast_math`` | Boolean | ``False`` | If ``True``, CUDA kernels will be compiled with the ``--use_fast_math`` | +| | | | compiler option, which enables some fast math operations that are faster | +| | | | but less accurate. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ +|``cuda_output`` | String | ``None`` | The preferred CUDA output format for kernels. Valid choices are ``None``,| +| | | | ``"ptx"``, and ``"cubin"``. If ``None``, a format will be determined | +| | | | automatically. The module-level setting takes precedence over the global | +| | | | setting. | ++--------------------+---------+-------------+--------------------------------------------------------------------------+ + +Kernel Settings +--------------- + +``enable_backward`` is currently the only setting that can also be configured on a per-kernel level. +Backward-pass compilation can be disabled by passing an argument into the ``@wp.kernel`` decorator +as in the following example: + +.. code-block:: python + + @wp.kernel(enable_backward=False) + def scale_2( + x: wp.array(dtype=float), + y: wp.array(dtype=float), + ): + y[0] = x[0] ** 2.0 diff --git a/_sources/debugging.rst.txt b/_sources/debugging.rst.txt new file mode 100644 index 00000000..4ce66e0d --- /dev/null +++ b/_sources/debugging.rst.txt @@ -0,0 +1,86 @@ +Debugging +========= + +Printing Values +--------------- + +Often one of the best debugging methods is to simply print values from kernels. Warp supports printing all built-in +types using the ``print()`` function, e.g.:: + + v = wp.vec3(1.0, 2.0, 3.0) + + print(v) + +In addition, formatted C-style printing is available through the ``wp.printf()`` function, e.g.:: + + x = 1.0 + i = 2 + + wp.printf("A float value %f, an int value: %d", x, i) + +.. note:: Formatted printing is only available for scalar types (e.g.: ``int`` and ``float``) not vector types. + +Printing Launches +----------------- + +For complex applications it can be difficult to understand the order-of-operations that lead to a bug. To help diagnose +these issues Warp supports a simple option to print out all launches and arguments to the console:: + + wp.config.print_launches = True + + +Step-Through Debugging +---------------------- + +It is possible to attach IDE debuggers such as Visual Studio to Warp processes to step through generated kernel code. +Users should first compile the kernels in debug mode by setting:: + + wp.config.mode = "debug" + +This setting ensures that line numbers, and debug symbols are generated correctly. After launching the Python process, +the debugger should be attached, and a breakpoint inserted into the generated code. + +.. note:: Generated kernel code is not a 1:1 correspondence with the original Python code, but individual operations can still be replayed and variables inspected. + +Also see :github:`warp/tests/walkthrough_debug.py` for an example of how to debug Warp kernel code running on the CPU. + +Generated Code +-------------- + +The generated code for kernels is stored in a central cache location in the user's home directory, the cache location +is printed at startup when ``wp.init()`` is called, for example: + +.. code-block:: console + + Warp 0.8.1 initialized: + CUDA Toolkit: 11.8, Driver: 11.8 + Devices: + "cpu" | AMD64 Family 25 Model 33 Stepping 0, AuthenticAMD + "cuda:0" | NVIDIA GeForce RTX 3090 (sm_86) + "cuda:1" | NVIDIA GeForce RTX 2080 Ti (sm_75) + Kernel cache: C:\Users\LukasW\AppData\Local\NVIDIA Corporation\warp\Cache\0.8.1 + +The kernel cache has ``gen`` and ``bin`` folders that contain the generated C++/CUDA code and the compiled binaries +respectively. Occasionally it can be useful to inspect the generated code for debugging / profiling. + +Bounds Checking +--------------- + +Warp will perform bounds checking in debug build configurations to ensure that all array accesses lie within the defined +shape. + +CUDA Verification +----------------- + +It is possible to generate out-of-bounds memory access violations through poorly formed kernel code or inputs. In this +case the CUDA runtime will detect the violation and put the CUDA context into an error state. Subsequent kernel launches +may silently fail which can lead to hard to diagnose issues. + +If a CUDA error is suspected a simple verification method is to enable:: + + wp.config.verify_cuda = True + +This setting will check the CUDA context after every operation to ensure that it is still valid. If an error is +encountered it will raise an exception that often helps to narrow down the problematic kernel. + +.. note:: Verifying CUDA state at each launch requires synchronizing CPU and GPU which has a significant overhead. Users should ensure this setting is only used during debugging. diff --git a/_sources/faq.rst.txt b/_sources/faq.rst.txt new file mode 100644 index 00000000..927d39d2 --- /dev/null +++ b/_sources/faq.rst.txt @@ -0,0 +1,130 @@ +FAQ +=== + +How does Warp relate to other Python projects for GPU programming, e.g.: Numba, Taichi, cuPy, PyTorch, etc.? +------------------------------------------------------------------------------------------------------------ + +Warp is inspired by many of these projects, and is closely related to +Numba and Taichi which both expose kernel programming to Python. These +frameworks map to traditional GPU programming models, so many of the +high-level concepts are similar, however there are some functionality +and implementation differences. + +Compared to Numba, Warp supports a smaller subset of Python, but +offering auto-differentiation of kernel programs, which is useful for +machine learning. Compared to Taichi Warp uses C++/CUDA as an +intermediate representation, which makes it convenient to implement and +expose low-level routines. In addition, we are building in +data structures to support geometry processing (meshes, sparse volumes, +point clouds, USD data) as first-class citizens that are not exposed in +other runtimes. + +Warp does not offer a full tensor-based programming model like PyTorch +and JAX, but is designed to work well with these frameworks through data +sharing mechanisms like ``__cuda_array_interface__``. For computations +that map well to tensors (e.g.: neural-network inference) it makes sense +to use these existing tools. For problems with a lot of e.g.: sparsity, +conditional logic, heterogeneous workloads (like the ones we often find in +simulation and graphics), then the kernel-based programming model like +the one in Warp are often more convenient since users have control over +individual threads. + +Does Warp support all of the Python language? +--------------------------------------------- + +No, Warp supports a subset of Python that maps well to the GPU. Our goal +is to not have any performance cliffs so that users can expect +consistently good behavior from kernels that is close to native code. +Examples of unsupported concepts that don’t map well to the GPU are +dynamic types, list comprehensions, exceptions, garbage collection, etc. + +When should I call ``wp.synchronize()``? +---------------------------------------- + +One of the common sources of confusion for new users is when calls to +``wp.synchronize()`` are necessary. The answer is “almost never”! +Synchronization is quite expensive, and should generally be avoided +unless necessary. Warp naturally takes care of synchronization between +operations (e.g.: kernel launches, device memory copies). + +For example, the following requires no manual synchronization, as the +conversion to NumPy will automatically synchronize: + +.. code:: python + + # run some kernels + wp.launch(kernel_1, dim, [array_x, array_y], device="cuda") + wp.launch(kernel_2, dim, [array_y, array_z], device="cuda") + + # bring data back to host (and implicitly synchronize) + x = array_z.numpy() + +The *only* case where manual synchronization is needed is when copies +are being performed back to CPU asynchronously, e.g.: + +.. code:: python + + # copy data back to cpu from gpu, all copies will happen asynchronously to Python + wp.copy(cpu_array_1, gpu_array_1) + wp.copy(cpu_array_2, gpu_array_2) + wp.copy(cpu_array_3, gpu_array_3) + + # ensure that the copies have finished + wp.synchronize() + + # return a numpy wrapper around the cpu arrays, note there is no implicit synchronization here + a1 = cpu_array_1.numpy() + a2 = cpu_array_2.numpy() + a3 = cpu_array_3.numpy() + +What happens when you differentiate a function like ``wp.abs(x)``? +------------------------------------------------------------------ + +Non-smooth functions such as ``y=|x|`` do not have a single unique +gradient at ``x=0``, rather they have what is known as a +``subgradient``, which is formally the convex hull of directional +derivatives at that point. The way that Warp (and most +auto-differentiation frameworks) handles these points is to pick an +arbitrary gradient from this set, e.g.: for ``wp.abs()``, it will +arbitrarily choose the gradient to be 1.0 at the origin. You can find +the implementation for these functions in ``warp/native/builtin.h``. + +Most optimizers (particularly ones that exploit stochasticity), are not +sensitive to the choice of which gradient to use from the subgradient, +although there are exceptions. + +Does Warp support multi-GPU programming? +---------------------------------------- + +Yes! Since version ``0.4.0`` we support allocating, launching, and +copying between multiple GPUs in a single process. We follow the naming +conventions of PyTorch and use aliases such as ``cuda:0``, ``cuda:1``, +``cpu`` to identify individual devices. + +Should I switch to Warp over IsaacGym / PhysX? +---------------------------------------------- + +Warp is not a replacement for IsaacGym, IsaacSim, or PhysX - while Warp +does offer some physical simulation capabilities this is primarily aimed +at developers who need differentiable physics, rather than a fully +featured physics engine. Warp is also integrated with IsaacGym and is +great for performing auxiliary tasks such as reward and observation +computations for reinforcement learning. + +Why assignments to Warp arrays aren't supported outside of kernels? +------------------------------------------------------------------- + +Reading or writing data that is living on the GPU can only be achieved through +launching CUDA kernels, whereas any code defined outside of these kernels is +exclusively evaluated on the CPU by Python's runtime. + +We recommend to either initialize Warp arrays from other native arrays +(e.g.: Python list, NumPy array, ...) or by launching a kernel to set its values. + +For the common use case of wanting to fill an array with a given value, we +also support the following forms: + +- `wp.full(8, 1.23, dtype=float)`: initializes a new array of 8 float values set + to `1.23`. +- `arr.fill_(1.23)`: sets the content of an existing float array to `1.23`. +- `arr[:4].fill(1.23)`: sets the four first values of an existing float array to `1.23`. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..9924be8d --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,190 @@ +NVIDIA Warp Documentation +========================= + +Warp is a Python framework for writing high-performance simulation and graphics code. Warp takes +regular Python functions and JIT compiles them to efficient kernel code that can run on the CPU or GPU. + +Warp is designed for spatial computing and comes with a rich set of primitives that make it easy to write +programs for physics simulation, perception, robotics, and geometry processing. In addition, Warp kernels +are differentiable and can be used as part of machine-learning pipelines with frameworks such as PyTorch and JAX. + +Below are some examples of simulations implemented using Warp: + +.. image:: ./img/header.png + +Quickstart +========== + +The easiest way is to install Warp is from PyPi: + +.. code-block:: sh + + $ pip install warp-lang + +Pre-built binary packages for Windows, Linux and macOS are also available on the `Releases `__ page. To install in your local Python environment extract the archive and run the following command from the root directory: + +.. code-block:: sh + + $ pip install . + +Basic example +------------- + +An example first program that computes the lengths of random 3D vectors is given below:: + + import warp as wp + import numpy as np + + wp.init() + + num_points = 1024 + + @wp.kernel + def length(points: wp.array(dtype=wp.vec3), + lengths: wp.array(dtype=float)): + + # thread index + tid = wp.tid() + + # compute distance of each point from origin + lengths[tid] = wp.length(points[tid]) + + + # allocate an array of 3d points + points = wp.array(np.random.rand(num_points, 3), dtype=wp.vec3) + lengths = wp.zeros(num_points, dtype=float) + + # launch kernel + wp.launch(kernel=length, + dim=len(points), + inputs=[points, lengths]) + + print(lengths) + +Additional examples +------------------- +The `examples `__ directory in +the Github repository contains a number of scripts that show how to +implement different simulation methods using the Warp API. Most examples +will generate USD files containing time-sampled animations in the +same directory as the example. Before running examples users should +ensure that the ``usd-core`` package is installed using: + +:: + + pip install usd-core + +USD files can be viewed or rendered inside NVIDIA +`Omniverse `__, +Pixar's UsdView, and Blender. Note that Preview in macOS is not +recommended as it has limited support for time-sampled animations. + +Built-in unit tests can be run from the command-line as follows: + +:: + + python -m warp.tests + +Omniverse +--------- + +A Warp Omniverse extension is available in the extension registry inside +Omniverse Kit or USD Composer. + +Enabling the extension will automatically install and initialize the +Warp Python module inside the Kit Python environment. Please see the +`Omniverse Warp Documentation `__ +for more details on how to use Warp in Omniverse. + + +Learn More +---------- + +Please see the following resources for additional background on Warp: + +- `GTC 2022 + Presentation `__ +- `GTC 2021 + Presentation `__ +- `SIGGRAPH Asia 2021 Differentiable Simulation + Course `__ + +The underlying technology in Warp has been used in a number of research +projects at NVIDIA including the following publications: + +- Accelerated Policy Learning with Parallel Differentiable Simulation - + Xu, J., Makoviychuk, V., Narang, Y., Ramos, F., Matusik, W., Garg, + A., & Macklin, M. + `(2022) `__ +- DiSECt: Differentiable Simulator for Robotic Cutting - Heiden, E., + Macklin, M., Narang, Y., Fox, D., Garg, A., & Ramos, F + `(2021) `__ +- gradSim: Differentiable Simulation for System Identification and + Visuomotor Control - Murthy, J. Krishna, Miles Macklin, Florian + Golemo, Vikram Voleti, Linda Petrini, Martin Weiss, Breandan + Considine et + al. `(2021) `__ + +Citing +------ + +If you use Warp in your research please use the following citation: + +.. code:: bibtex + + @misc{warp2022, + title= {Warp: A High-performance Python Framework for GPU Simulation and Graphics}, + author = {Miles Macklin}, + month = {March}, + year = {2022}, + note= {NVIDIA GPU Technology Conference (GTC)}, + howpublished = {\url{https://github.com/nvidia/warp}} + } + +License +------- + +Warp is provided under the NVIDIA Software License, please see +`LICENSE.md `_ for the full license text. + +Full Table of Contents +---------------------- + +.. toctree:: + :maxdepth: 2 + :caption: User's Guide + + installation + basics + modules/devices + modules/interoperability + configuration + debugging + limitations + faq + +.. toctree:: + :maxdepth: 2 + :caption: Core Reference + + modules/runtime + modules/functions + +.. toctree:: + :maxdepth: 2 + :caption: Simulation Reference + + modules/sim + modules/sparse + modules/fem + modules/render + +.. toctree:: + :hidden: + :caption: Project Links + + GitHub + PyPI + Discord + +:ref:`Full Index ` diff --git a/_sources/installation.rst.txt b/_sources/installation.rst.txt new file mode 100644 index 00000000..d27c460e --- /dev/null +++ b/_sources/installation.rst.txt @@ -0,0 +1,86 @@ +Installation +============ + +Warp supports Python versions 3.7 onwards. It can run on x86-64 and ARMv8 CPUs on Windows, Linux, and macOS. GPU support requires a CUDA capable NVIDIA GPU and driver (minimum GeForce GTX 9xx). + +The easiest way to install Warp is from `PyPI `_: + +.. code-block:: sh + + $ pip install warp-lang + +Pre-built binary packages are also available on the `Releases `__ page. To install in your local Python environment extract the archive and run the following command from the root directory: + +.. code-block:: sh + + $ pip install . + +Dependencies +------------ + +Warp supports Python versions 3.7 or later and requires `NumPy `_ to be installed. + +The following optional dependencies are required to support certain features: + +* `usd-core `_: Required for some Warp examples, ``warp.sim.parse_usd()``, and ``warp.render.UsdRenderer``. +* `JAX `_: Required for JAX interoperability (see :ref:`jax-interop`). +* `PyTorch `_: Required for PyTorch interoperability (see :ref:`pytorch-interop`). +* `NVTX for Python `_: Required to use :class:`wp.ScopedTimer(use_nvtx=True) `. + +Building the Warp documentation requires: + +* `Sphinx `_ +* `Furo `_ +* `Sphinx-copybutton `_ + +Building from source +-------------------- + +For developers who want to build the library themselves the following tools are required: + +* Microsoft Visual Studio (Windows), minimum version 2019 +* GCC (Linux), minimum version 7.2 +* `CUDA Toolkit `_, minimum version 11.5 +* `Git Large File Storage `_ + +After cloning the repository, users should run: + +.. code-block:: console + + $ python build_lib.py + +This will generate the ``warp.dll`` / ``warp.so`` core library respectively. It +will search for the CUDA Toolkit in the default install directory. This path can +be overridden by setting the ``CUDA_PATH`` environment variable. Alternatively, +the path to the CUDA Toolkit can be passed to the build command as +``--cuda_path="..."``. After building, the Warp package should be installed using: + + +.. code-block:: console + + $ pip install -e . + +Which ensures that subsequent modifications to the library will be +reflected in the Python package. + +Conda environments +------------------ + +Some modules, such as ``usd-core``, don't support the latest Python version. +To manage running Warp and other projects on different Python versions one can +make use of an environment management system such as +`Conda `_. + +**WARNING:** When building and running Warp in a different environment, make sure +the build environment has the same C++ runtime library version, or an older +one, than the execution environment. Otherwise Warp's shared libraries may end +up looking for a newer runtime library version than the one available in the +execution environment. For example on Linux this error could occur: + +``OSError: <...>/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by <...>/warp/warp/bin/warp.so)`` + +This can be solved by installing a newer C++ runtime version in the runtime +conda environment using ``conda install -c conda-forge libstdcxx-ng=12.1`` or +newer. Or, the build environment's C++ toolchain can be downgraded using +``conda install -c conda-forge libstdcxx-ng=8.5``. Or, one can ``activate`` or +``deactivate`` conda environments as needed for building vs. running Warp. diff --git a/_sources/limitations.rst.txt b/_sources/limitations.rst.txt new file mode 100644 index 00000000..5640103f --- /dev/null +++ b/_sources/limitations.rst.txt @@ -0,0 +1,56 @@ +Limitations +=========== + +.. currentmodule:: warp + +This section summarizes various limitations and currently unsupported features in Warp. +Requests for new features can be made at `GitHub Discussions `_, +and issues can be opened at `GitHub Issues `_. + +Unsupported Features +-------------------- + +To achieve good performance on GPUs some dynamic language features are not supported: + +* Lambda functions +* List comprehensions +* Exceptions +* Recursion +* Runtime evaluation of expressions, e.g.: eval() +* Dynamic structures such as lists, sets, dictionaries, etc. + +Kernels +------- + +* Strings cannot be passed into kernels. +* Short-circuit evaluation is not supported. +* :func:`wp.atomic_add() ` does not support ``wp.int64``. +* :func:`wp.tid() ` cannot be called from user functions. +* CUDA thread blocks use a fixed size 256 threads per block. + +Arrays +------ + +* Arrays can have a maximum of four dimensions. +* Each dimension of a Warp array cannot be greater than the maximum value representable by a 32-bit signed integer, + :math:`2^{31}-1`. +* There are currently no data types that support complex numbers. + +Structs +------- + +* Structs cannot have generic members, i.e. of type ``typing.Any``. + +Volumes +------- + +* The sparse-volume *topology* cannot be changed after the tiles for the :class:`Volume` have been allocated. + +Multiple Processes +------------------ + +* A CUDA context created in the parent process cannot be used in a *forked* child process. + Use the spawn start method instead, or avoid creating CUDA contexts in the parent process. +* There can be issues with using same user kernel cache directory when running with multiple processes. + A workaround is to use a separate cache directory for every process. + See :ref:`example-cache-management` for how the cache directory may be changed. diff --git a/_sources/modules/devices.rst.txt b/_sources/modules/devices.rst.txt new file mode 100644 index 00000000..23f5bbda --- /dev/null +++ b/_sources/modules/devices.rst.txt @@ -0,0 +1,204 @@ +Devices +======= + +Warp assigns unique string aliases to all supported compute devices in the system. There is currently a single CPU device exposed as ``"cpu"``. Each CUDA-capable GPU gets an alias of the form ``"cuda:i"``, where ``i`` is the CUDA device ordinal. This convention should be familiar to users of other popular frameworks like PyTorch. + +It is possible to explicitly target a specific device with each Warp API call using the ``device`` argument:: + + a = wp.zeros(n, device="cpu") + wp.launch(kernel, dim=a.size, inputs=[a], device="cpu") + + b = wp.zeros(n, device="cuda:0") + wp.launch(kernel, dim=b.size, inputs=[b], device="cuda:0") + + c = wp.zeros(n, device="cuda:1") + wp.launch(kernel, dim=c.size, inputs=[c], device="cuda:1") + +.. note:: + + A Warp CUDA device (``"cuda:i"``) corresponds to the primary CUDA context of device ``i``. + This is compatible with frameworks like PyTorch and other software that uses the CUDA Runtime API. + It makes interoperability easy because GPU resources like memory can be shared with Warp. + +.. autoclass:: warp.context.Device + :members: + :exclude-members: init_streams + +Default Device +-------------- + +To simplify writing code, Warp has the concept of **default device**. When the ``device`` argument is omitted from a Warp API call, the default device will be used. + +During Warp initialization, the default device is set to be ``"cuda:0"`` if CUDA is available. Otherwise, the default device is ``"cpu"``. + +The function ``wp.set_device()`` can be used to change the default device:: + + wp.set_device("cpu") + a = wp.zeros(n) + wp.launch(kernel, dim=a.size, inputs=[a]) + + wp.set_device("cuda:0") + b = wp.zeros(n) + wp.launch(kernel, dim=b.size, inputs=[b]) + + wp.set_device("cuda:1") + c = wp.zeros(n) + wp.launch(kernel, dim=c.size, inputs=[c]) + +.. note:: + + For CUDA devices, ``wp.set_device()`` does two things: it sets the Warp default device and it makes the device's CUDA context current. This helps to minimize the number of CUDA context switches in blocks of code targeting a single device. + +For PyTorch users, this function is similar to ``torch.cuda.set_device()``. It is still possible to specify a different device in individual API calls, like in this snippet:: + + # set default device + wp.set_device("cuda:0") + + # use default device + a = wp.zeros(n) + + # use explicit devices + b = wp.empty(n, device="cpu") + c = wp.empty(n, device="cuda:1") + + # use default device + wp.launch(kernel, dim=a.size, inputs=[a]) + + wp.copy(b, a) + wp.copy(c, a) + +Scoped Devices +-------------- + +Another way to manage the default device is using ``wp.ScopedDevice`` objects. They can be arbitrarily nested and restore the previous default device on exit:: + + with wp.ScopedDevice("cpu"): + # alloc and launch on "cpu" + a = wp.zeros(n) + wp.launch(kernel, dim=a.size, inputs=[a]) + + with wp.ScopedDevice("cuda:0"): + # alloc on "cuda:0" + b = wp.zeros(n) + + with wp.ScopedDevice("cuda:1"): + # alloc and launch on "cuda:1" + c = wp.zeros(n) + wp.launch(kernel, dim=c.size, inputs=[c]) + + # launch on "cuda:0" + wp.launch(kernel, dim=b.size, inputs=[b]) + +.. note:: + + For CUDA devices, ``wp.ScopedDevice`` makes the device's CUDA context current and restores the previous CUDA context on exit. This is handy when running Warp scripts as part of a bigger pipeline, because it avoids any side effects of changing the CUDA context in the enclosed code. + +Example: Using ``wp.ScopedDevice`` with multiple GPUs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following example shows how to allocate arrays and launch kernels on all available CUDA devices. + +.. code:: python + + import warp as wp + + wp.init() + + + @wp.kernel + def inc(a: wp.array(dtype=float)): + tid = wp.tid() + a[tid] = a[tid] + 1.0 + + + # get all CUDA devices + devices = wp.get_cuda_devices() + device_count = len(devices) + + # number of launches + iters = 1000 + + # list of arrays, one per device + arrs = [] + + # loop over all devices + for device in devices: + # use a ScopedDevice to set the target device + with wp.ScopedDevice(device): + # allocate array + a = wp.zeros(250 * 1024 * 1024, dtype=float) + arrs.append(a) + + # launch kernels + for _ in range(iters): + wp.launch(inc, dim=a.size, inputs=[a]) + + # synchronize all devices + wp.synchronize() + + # print results + for i in range(device_count): + print(f"{arrs[i].device} -> {arrs[i].numpy()}") + + +Current CUDA Device +------------------- + +Warp uses the device alias ``"cuda"`` to target the current CUDA device. This allows external code to manage the CUDA device on which to execute Warp scripts. It is analogous to the PyTorch ``"cuda"`` device, which should be familiar to Torch users and simplify interoperation. + +In this snippet, we use PyTorch to manage the current CUDA device and invoke a Warp kernel on that device:: + + def example_function(): + # create a Torch tensor on the current CUDA device + t = torch.arange(10, dtype=torch.float32, device="cuda") + + a = wp.from_torch(t) + + # launch a Warp kernel on the current CUDA device + wp.launch(kernel, dim=a.size, inputs=[a], device="cuda") + + # use Torch to set the current CUDA device and run example_function() on that device + torch.cuda.set_device(0) + example_function() + + # use Torch to change the current CUDA device and re-run example_function() on that device + torch.cuda.set_device(1) + example_function() + +.. note:: + + Using the device alias ``"cuda"`` can be problematic if the code runs in an environment where another part of the code can unpredictably change the CUDA context. Using an explicit CUDA device like ``"cuda:i"`` is recommended to avoid such issues. + +Device Synchronization +---------------------- + +CUDA kernel launches and memory operations can execute asynchronously. This allows for overlapping compute and memory operations on different devices. Warp allows synchronizing the host with outstanding asynchronous operations on a specific device:: + + wp.synchronize_device("cuda:1") + +The ``wp.synchronize_device()`` function offers more fine-grained synchronization than ``wp.synchronize()``, as the latter waits for *all* devices to complete their work. + +Custom CUDA Contexts +-------------------- + +Warp is designed to work with arbitrary CUDA contexts so it can easily integrate into different workflows. + +Applications built on the CUDA Runtime API target the *primary context* of each device. The Runtime API hides CUDA context management under the hood. In Warp, device ``"cuda:i"`` represents the primary context of device ``i``, which aligns with the CUDA Runtime API. + +Applications built on the CUDA Driver API work with CUDA contexts directly and can create custom CUDA contexts on any device. Custom CUDA contexts can be created with specific affinity or interop features that benefit the application. Warp can work with these CUDA contexts as well. + +The special device alias ``"cuda"`` can be used to target the current CUDA context, whether this is a primary or custom context. + +In addition, Warp allows registering new device aliases for custom CUDA contexts, so that they can be explicitly targeted by name. If the ``CUcontext`` pointer is available, it can be used to create a new device alias like this:: + + wp.map_cuda_device("foo", ctypes.c_void_p(context_ptr)) + +Alternatively, if the custom CUDA context was made current by the application, the pointer can be omitted:: + + wp.map_cuda_device("foo") + +In either case, mapping the custom CUDA context allows us to target the context directly using the assigned alias:: + + with wp.ScopedDevice("foo"): + a = wp.zeros(n) + wp.launch(kernel, dim=a.size, inputs=[a]) diff --git a/_sources/modules/fem.rst.txt b/_sources/modules/fem.rst.txt new file mode 100644 index 00000000..bb971d69 --- /dev/null +++ b/_sources/modules/fem.rst.txt @@ -0,0 +1,392 @@ +warp.fem +===================== + +.. currentmodule:: warp.fem + +The ``warp.fem`` module is designed to facilitate solving physical systems described as differential +equations. For example, it can solve PDEs for diffusion, convection, fluid flow, and elasticity problems +using finite-element-based (FEM) Galerkin methods, and allows users to quickly experiment with various FEM +formulations and discretization schemes. + +Integrands +---------- + +The core functionality of the FEM toolkit is the ability to integrate constant, linear, and bilinear forms +over various domains and using arbitrary interpolation basis. + +The main mechanism is the :py:func:`.integrand` decorator, for instance: :: + + @integrand + def linear_form( + s: Sample, + v: Field, + ): + return v(s) + + + @integrand + def diffusion_form(s: Sample, u: Field, v: Field, nu: float): + return nu * wp.dot( + grad(u, s), + grad(v, s), + ) + +Integrands are normal warp kernels, meaning any usual warp function can be used. +However, they accept a few special parameters: + + - :class:`.Sample` contains information about the current integration sample point, such as the element index and coordinates in element. + - :class:`.Field` designates an abstract field, which will be replaced at call time by the actual field type: for instance a :class:`.DiscreteField`, :class:`.field.TestField` or :class:`.field.TrialField` defined over an arbitrary :class:`.FunctionSpace`. + A field `u` can be evaluated at a given sample `s` using the :func:`.inner` operator, i.e, ``inner(u, s)``, or as a shortcut using the usual call operator, ``u(s)``. + Several other operators are available, such as :func:`.grad`; see the :ref:`Operators` section. + - :class:`.Domain` designates an abstract integration domain. Several operators are also provided for domains, for example in the example below evaluating the normal at the current sample position: :: + + @integrand + def boundary_form( + s: Sample, + domain: Domain, + u: Field, + ): + nor = normal(domain, s) + return wp.dot(u(s), nor) + +Integrands cannot be used directly with :func:`warp.launch`, but must be called through :func:`.integrate` or :func:`.interpolate` instead. +The root integrand (`integrand` argument passed to :func:`integrate` or :func:`interpolate` call) will automatically get passed :class:`.Sample` and :class:`.Domain` parameters. +:class:`.Field` parameters must be passed as a dictionary in the `fields` argument of the launcher function, and all other standard Warp types arguments must be +passed as a dictionary in the `values` argument of the launcher function, for instance: :: + + integrate(diffusion_form, fields={"u": trial, "v": test}, values={"nu": viscosity}) + + +Basic workflow +-------------- + +The typical steps for solving a linear PDE are as follow: + + - Define a :class:`.Geometry` (grid, mesh, etc). At the moment, 2D and 3D regular grids, triangle, quadrilateral, tetrahedron and hexahedron meshes are supported. + - Define one or more :class:`.FunctionSpace`, by equipping the geometry elements with shape functions. See :func:`.make_polynomial_space`. At the moment, continuous/discontinuous Lagrange (:math:`P_{k[d]}, Q_{k[d]}`) and Serendipity (:math:`S_k`) shape functions of order :math:`k \leq 3` are supported. + - Define an integration :class:`.GeometryDomain`, for instance the geometry's cells (:class:`.Cells`) or boundary sides (:class:`.BoundarySides`). + - Integrate linear forms to build the system's right-hand-side. Define a test function over the function space using :func:`.make_test`, + a :class:`.Quadrature` formula (or let the module choose one based on the function space degree), and call :func:`.integrate` with the linear form integrand. + The result is a :class:`warp.array` containing the integration result for each of the function space degrees of freedom. + - Integrate bilinear forms to build the system's left-hand-side. Define a trial function over the function space using :func:`.make_trial`, + then call :func:`.integrate` with the bilinear form integrand. + The result is a :class:`warp.sparse.BsrMatrix` containing the integration result for each pair of test and trial function space degrees of freedom. + Note that the trial and test functions do not have to be defined over the same function space, so that Mixed FEM is supported. + - Solve the resulting linear system using the solver of your choice + + +The following excerpt from the introductory example ``warp/examples/fem/example_diffusion.py`` outlines this procedure: :: + + # Grid geometry + geo = Grid2D(n=50, cell_size=2) + + # Domain and function spaces + domain = Cells(geometry=geo) + scalar_space = make_polynomial_space(geo, degree=3) + + # Right-hand-side (forcing term) + test = make_test(space=scalar_space, domain=domain) + rhs = integrate(linear_form, fields={"v": test}) + + # Weakly-imposed boundary conditions on Y sides + boundary = BoundarySides(geo) + bd_test = make_test(space=scalar_space, domain=boundary) + bd_trial = make_trial(space=scalar_space, domain=boundary) + bd_matrix = integrate(y_mass_form, fields={"u": bd_trial, "v": bd_test}) + + # Diffusion form + trial = make_trial(space=scalar_space, domain=domain) + matrix = integrate(diffusion_form, fields={"u": trial, "v": test}, values={"nu": viscosity}) + + # Assemble linear system (add diffusion and boundary condition matrices) + bsr_axpy(x=bd_matrix, y=matrix, alpha=boundary_strength, beta=1) + + # Solve linear system using Conjugate Gradient + x = wp.zeros_like(rhs) + bsr_cg(matrix, b=rhs, x=x) + + +.. note:: + The :func:`.integrate` function does not check that the passed integrands are actually linear or bilinear forms; it is up to the user to ensure that they are. + To solve non-linear PDEs, one can use an iterative procedure and pass the current value of the studied function :class:`.DiscreteField` argument to the integrand, on which + arbitrary operations are permitted. However, the result of the form must remain linear in the test and trial fields. + +Introductory examples +--------------------- + +``warp.fem`` ships with a list of examples in the ``warp/examples/fem`` directory illustrating common model problems. + + - ``example_diffusion.py``: 2D diffusion with homogeneous Neumann and Dirichlet boundary conditions + * ``example_diffusion_3d.py``: 3D variant of the diffusion problem + - ``example_convection_diffusion.py``: 2D convection-diffusion using semi-Lagrangian advection + * ``example_diffusion_dg0.py``: 2D convection-diffusion using finite-volume and upwind transport + * ``example_diffusion_dg.py``: 2D convection-diffusion using Discontinuous Galerkin with upwind transport and Symmetric Interior Penalty + - ``example_stokes.py``: 2D incompressible Stokes flow using mixed :math:`P_k/P_{k-1}` or :math:`Q_k/P_{(k-1)d}` elements + - ``example_navier_stokes.py``: 2D Navier-Stokes flow using mixed :math:`P_k/P_{k-1}` elements + - ``example_mixed_elasticity.py``: 2D linear elasticity using mixed continuous/discontinuous :math:`S_k/P_{(k-1)d}` elements + + +Advanced usages +--------------- + +High-order (curved) geometries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is possible to convert any :class:`.Geometry` (grids and explicit meshes) into a curved, high-order variant by deforming them +with an arbitrary-order displacement field using the :meth:`~.DiscreteField.make_deformed_geometry` method. +The process looks as follow: :: + + # Define a base geometry + base_geo = fem.Grid3D(res=resolution) + + # Define a displacement field on the base geometry + deformation_space = fem.make_polynomial_space(base_geo, degree=deformation_degree, dtype=wp.vec3) + deformation_field = deformation_space.make_field() + + # Populate the field value by interpolating an expression + fem.interpolate(deformation_field_expr, dest=deformation_field) + + # Construct the deformed geometry from the displacement field + deform_geo = deformation_field.make_deformed_geometry() + + # Define new function spaces on the deformed geometry + scalar_space = fem.make_polynomial_space(deformed_geo, degree=scalar_space_degree) + +See also ``example_deformed_geometry.py`` for a complete example. + +Particle-based quadrature +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :class:`.PicQuadrature` provides a way to define Particle-In-Cell quadratures from a set or arbitrary particles, +which can be helpful to develop MPM-like methods. +The particles are automatically bucketed to the geometry cells when the quadrature is initialized. +This is illustrated by the ``example_stokes_transfer.py`` and ``example_apic_fluid.py`` examples. + +Partitioning +^^^^^^^^^^^^ + +The FEM toolkit makes it possible to perform integration on a subset of the domain elements, +possibly re-indexing degrees of freedom so that the linear system contains the local ones only. +This is useful for distributed computation (see ``warp/examples/fem/example_diffusion_mgpu.py``), or simply to limit the simulation domain to a subset of active cells (see ``warp/examples/fem/example_stokes_transfer.py``). + +A partition of the simulation geometry can be defined using subclasses of :class:`.GeometryPartition` +such as :class:`.LinearGeometryPartition` or :class:`.ExplicitGeometryPartition`. + +Function spaces can then be partitioned according to the geometry partition using :func:`.make_space_partition`. +The resulting :class:`.SpacePartition` object allows translating between space-wide and partition-wide node indices, +and differentiating interior, frontier and exterior nodes. + +Memory management +^^^^^^^^^^^^^^^^^ + +Several ``warp.fem`` functions require allocating temporary buffers to perform their computations. +If such functions are called many times in a tight loop, those many allocations and de-allocations may degrade performance. +To overcome this issue, a :class:`.cache.TemporaryStore` object may be created to persist and reuse temporary allocations across calls, +either globally using :func:`set_default_temporary_store` or at a per-function granularity using the corresponding argument. + +.. _Operators: + +Operators +--------- +.. autofunction:: position(domain: Domain, s: Sample) +.. autofunction:: normal(domain: Domain, s: Sample) +.. autofunction:: lookup(domain: Domain, x) +.. autofunction:: measure(domain: Domain, s: Sample) +.. autofunction:: measure_ratio(domain: Domain, s: Sample) +.. autofunction:: deformation_gradient(domain: Domain, s: Sample) + +.. autofunction:: degree(f: Field) +.. autofunction:: inner(f: Field, s: Sample) +.. autofunction:: outer(f: Field, s: Sample) +.. autofunction:: grad(f: Field, s: Sample) +.. autofunction:: grad_outer(f: Field, s: Sample) +.. autofunction:: div(f: Field, s: Sample) +.. autofunction:: div_outer(f: Field, s: Sample) +.. autofunction:: at_node(f: Field, s: Sample) + +.. autofunction:: D(f: Field, s: Sample) +.. autofunction:: curl(f: Field, s: Sample) +.. autofunction:: jump(f: Field, s: Sample) +.. autofunction:: average(f: Field, s: Sample) +.. autofunction:: grad_jump(f: Field, s: Sample) +.. autofunction:: grad_average(f: Field, s: Sample) + +.. autofunction:: warp.fem.operator.operator + +Integration +----------- + +.. autofunction:: integrate +.. autofunction:: interpolate + +.. autofunction:: integrand + +.. class:: Sample + + Per-sample point context for evaluating fields and related operators in integrands. + +.. autoclass:: Field + +.. autoclass:: Domain + +Geometry +-------- + +.. autoclass:: Grid2D + :show-inheritance: + +.. autoclass:: Trimesh2D + :show-inheritance: + +.. autoclass:: Quadmesh2D + :show-inheritance: + +.. autoclass:: Grid3D + :show-inheritance: + +.. autoclass:: Tetmesh + :show-inheritance: + +.. autoclass:: Hexmesh + :show-inheritance: + +.. autoclass:: LinearGeometryPartition + +.. autoclass:: ExplicitGeometryPartition + +.. autoclass:: Cells + :show-inheritance: + +.. autoclass:: Sides + :show-inheritance: + +.. autoclass:: BoundarySides + :show-inheritance: + +.. autoclass:: FrontierSides + :show-inheritance: + +.. autoclass:: Polynomial + :members: + +.. autoclass:: RegularQuadrature + :show-inheritance: + +.. autoclass:: NodalQuadrature + :show-inheritance: + +.. autoclass:: ExplicitQuadrature + :show-inheritance: + +.. autoclass:: PicQuadrature + :show-inheritance: + +Function Spaces +--------------- + +.. autofunction:: make_polynomial_space + +.. autofunction:: make_polynomial_basis_space + +.. autofunction:: make_collocated_function_space + +.. autofunction:: make_space_partition + +.. autofunction:: make_space_restriction + +.. autoclass:: ElementBasis + :members: + +.. autoclass:: SymmetricTensorMapper + :show-inheritance: + +.. autoclass:: SkewSymmetricTensorMapper + :show-inheritance: + +.. autoclass:: PointBasisSpace + :show-inheritance: + +Fields +------ + +.. autofunction:: make_test + +.. autofunction:: make_trial + +.. autofunction:: make_restriction + +Boundary Conditions +------------------- + +.. autofunction:: normalize_dirichlet_projector + +.. autofunction:: project_linear_system + +Memory management +----------------- + +.. autofunction:: set_default_temporary_store + +.. autofunction:: borrow_temporary + +.. autofunction:: borrow_temporary_like + + +Interfaces +---------- + +Interface classes are not meant to be constructed directly, but can be derived from extend the built-in functionality. + +.. autoclass:: Geometry + :members: cell_count, side_count, boundary_side_count + +.. autoclass:: GeometryPartition + :members: cell_count, side_count, boundary_side_count, frontier_side_count + +.. autoclass:: GeometryDomain + :members: ElementKind, element_kind, dimension, element_count + +.. autoclass:: Quadrature + :members: domain, total_point_count + +.. autoclass:: FunctionSpace + :members: dtype, topology, geometry, dimension, degree, trace, make_field + +.. autoclass:: SpaceTopology + :members: dimension, geometry, node_count, element_node_indices, trace + +.. autoclass:: BasisSpace + :members: topology, geometry, node_positions + +.. autoclass:: warp.fem.space.shape.ShapeFunction + +.. autoclass:: SpacePartition + :members: node_count, owned_node_count, interior_node_count, space_node_indices + +.. autoclass:: SpaceRestriction + :members: node_count + +.. autoclass:: DofMapper + +.. autoclass:: FieldLike + +.. autoclass:: DiscreteField + :show-inheritance: + :members: dof_values, trace, make_deformed_geometry + +.. autoclass:: warp.fem.field.FieldRestriction + +.. autoclass:: warp.fem.field.SpaceField + :show-inheritance: + +.. autoclass:: warp.fem.field.TestField + :show-inheritance: + +.. autoclass:: warp.fem.field.TrialField + :show-inheritance: + +.. autoclass:: TemporaryStore + :members: clear + +.. autoclass:: warp.fem.cache.Temporary + :members: array, detach, release diff --git a/_sources/modules/functions.rst.txt b/_sources/modules/functions.rst.txt new file mode 100644 index 00000000..78f75ec3 --- /dev/null +++ b/_sources/modules/functions.rst.txt @@ -0,0 +1,1992 @@ +.. + Autogenerated File - Do not edit. Run build_docs.py to generate. + +.. functions: +.. currentmodule:: warp + +Kernel Reference +================ + +Scalar Types +------------ +.. class:: int8 +.. class:: uint8 +.. class:: int16 +.. class:: uint16 +.. class:: int32 +.. class:: uint32 +.. class:: int64 +.. class:: uint64 +.. class:: float16 +.. class:: float32 +.. class:: float64 +.. class:: bool + + +Vector Types +------------ +.. class:: vec2b +.. class:: vec2ub +.. class:: vec2s +.. class:: vec2us +.. class:: vec2i +.. class:: vec2ui +.. class:: vec2l +.. class:: vec2ul +.. class:: vec2h +.. class:: vec2f +.. class:: vec2d +.. class:: vec3b +.. class:: vec3ub +.. class:: vec3s +.. class:: vec3us +.. class:: vec3i +.. class:: vec3ui +.. class:: vec3l +.. class:: vec3ul +.. class:: vec3h +.. class:: vec3f +.. class:: vec3d +.. class:: vec4b +.. class:: vec4ub +.. class:: vec4s +.. class:: vec4us +.. class:: vec4i +.. class:: vec4ui +.. class:: vec4l +.. class:: vec4ul +.. class:: vec4h +.. class:: vec4f +.. class:: vec4d +.. class:: mat22h +.. class:: mat22f +.. class:: mat22d +.. class:: mat33h +.. class:: mat33f +.. class:: mat33d +.. class:: mat44h +.. class:: mat44f +.. class:: mat44d +.. class:: quath +.. class:: quatf +.. class:: quatd +.. class:: transformh +.. class:: transformf +.. class:: transformd +.. class:: spatial_vectorh +.. class:: spatial_vectorf +.. class:: spatial_vectord +.. class:: spatial_matrixh +.. class:: spatial_matrixf +.. class:: spatial_matrixd + +Generic Types +------------- +.. class:: Int +.. class:: Float +.. class:: Scalar +.. class:: Vector +.. class:: Matrix +.. class:: Quaternion +.. class:: Transformation +.. class:: Array + +Query Types +------------- +.. autoclass:: bvh_query_t +.. autoclass:: hash_grid_query_t +.. autoclass:: mesh_query_aabb_t +.. autoclass:: mesh_query_point_t +.. autoclass:: mesh_query_ray_t + + +Scalar Math +--------------- +.. function:: min(x: Scalar, y: Scalar) -> Scalar + + Return the minimum of two scalars. + + +.. function:: min(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + Return the element-wise minimum of two vectors. + + +.. function:: min(v: Vector[Any,Scalar]) -> Scalar + :noindex: + :nocontentsentry: + + Return the minimum element of a vector ``v``. + + +.. function:: max(x: Scalar, y: Scalar) -> Scalar + + Return the maximum of two scalars. + + +.. function:: max(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + Return the element-wise maximum of two vectors. + + +.. function:: max(v: Vector[Any,Scalar]) -> Scalar + :noindex: + :nocontentsentry: + + Return the maximum element of a vector ``v``. + + +.. function:: clamp(x: Scalar, a: Scalar, b: Scalar) -> Scalar + + Clamp the value of ``x`` to the range [a, b]. + + +.. function:: abs(x: Scalar) -> Scalar + + Return the absolute value of ``x``. + + +.. function:: sign(x: Scalar) -> Scalar + + Return -1 if ``x`` < 0, return 1 otherwise. + + +.. function:: step(x: Scalar) -> Scalar + + Return 1.0 if ``x`` < 0.0, return 0.0 otherwise. + + +.. function:: nonzero(x: Scalar) -> Scalar + + Return 1.0 if ``x`` is not equal to zero, return 0.0 otherwise. + + +.. function:: sin(x: Float) -> Float + + Return the sine of ``x`` in radians. + + +.. function:: cos(x: Float) -> Float + + Return the cosine of ``x`` in radians. + + +.. function:: acos(x: Float) -> Float + + Return arccos of ``x`` in radians. Inputs are automatically clamped to [-1.0, 1.0]. + + +.. function:: asin(x: Float) -> Float + + Return arcsin of ``x`` in radians. Inputs are automatically clamped to [-1.0, 1.0]. + + +.. function:: sqrt(x: Float) -> Float + + Return the square root of ``x``, where ``x`` is positive. + + +.. function:: cbrt(x: Float) -> Float + + Return the cube root of ``x``. + + +.. function:: tan(x: Float) -> Float + + Return the tangent of ``x`` in radians. + + +.. function:: atan(x: Float) -> Float + + Return the arctangent of ``x`` in radians. + + +.. function:: atan2(y: Float, x: Float) -> Float + + Return the 2-argument arctangent, atan2, of the point ``(x, y)`` in radians. + + +.. function:: sinh(x: Float) -> Float + + Return the sinh of ``x``. + + +.. function:: cosh(x: Float) -> Float + + Return the cosh of ``x``. + + +.. function:: tanh(x: Float) -> Float + + Return the tanh of ``x``. + + +.. function:: degrees(x: Float) -> Float + + Convert ``x`` from radians into degrees. + + +.. function:: radians(x: Float) -> Float + + Convert ``x`` from degrees into radians. + + +.. function:: log(x: Float) -> Float + + Return the natural logarithm (base-e) of ``x``, where ``x`` is positive. + + +.. function:: log2(x: Float) -> Float + + Return the binary logarithm (base-2) of ``x``, where ``x`` is positive. + + +.. function:: log10(x: Float) -> Float + + Return the common logarithm (base-10) of ``x``, where ``x`` is positive. + + +.. function:: exp(x: Float) -> Float + + Return the value of the exponential function :math:`e^x`. + + +.. function:: pow(x: Float, y: Float) -> Float + + Return the result of ``x`` raised to power of ``y``. + + +.. function:: round(x: Float) -> Float + + Return the nearest integer value to ``x``, rounding halfway cases away from zero. + This is the most intuitive form of rounding in the colloquial sense, but can be slower than other options like :func:`warp.rint()`. + Differs from :func:`numpy.round()`, which behaves the same way as :func:`numpy.rint()`. + + +.. function:: rint(x: Float) -> Float + + Return the nearest integer value to ``x``, rounding halfway cases to nearest even integer. + It is generally faster than :func:`warp.round()`. Equivalent to :func:`numpy.rint()`. + + +.. function:: trunc(x: Float) -> Float + + Return the nearest integer that is closer to zero than ``x``. + In other words, it discards the fractional part of ``x``. + It is similar to casting ``float(int(x))``, but preserves the negative sign when x is in the range [-0.0, -1.0). + Equivalent to :func:`numpy.trunc()` and :func:`numpy.fix()`. + + +.. function:: floor(x: Float) -> Float + + Return the largest integer that is less than or equal to ``x``. + + +.. function:: ceil(x: Float) -> Float + + Return the smallest integer that is greater than or equal to ``x``. + + +.. function:: frac(x: Float) -> Float + + Retrieve the fractional part of x. + In other words, it discards the integer part of x and is equivalent to ``x - trunc(x)``. + + + + +Vector Math +--------------- +.. function:: dot(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Scalar + + Compute the dot product between two vectors. + + +.. function:: dot(x: Quaternion[Float], y: Quaternion[Float]) -> Scalar + :noindex: + :nocontentsentry: + + Compute the dot product between two quaternions. + + +.. function:: ddot(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Scalar + + Compute the double dot product between two matrices. + + +.. function:: argmin(v: Vector[Any,Scalar]) -> uint32 + + Return the index of the minimum element of a vector ``v``. [1]_ + + +.. function:: argmax(v: Vector[Any,Scalar]) -> uint32 + + Return the index of the maximum element of a vector ``v``. [1]_ + + +.. function:: outer(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Matrix[Any,Any,Scalar] + + Compute the outer product ``x*y^T`` for two vectors. + + +.. function:: cross(x: Vector[3,Scalar], y: Vector[3,Scalar]) -> Vector[3,Scalar] + + Compute the cross product of two 3D vectors. + + +.. function:: skew(x: Vector[3,Scalar]) + + Compute the skew-symmetric 3x3 matrix for a 3D vector ``x``. + + +.. function:: length(x: Vector[Any,Float]) -> Scalar + + Compute the length of a vector ``x``. + + +.. function:: length(x: Quaternion[Float]) -> Scalar + :noindex: + :nocontentsentry: + + Compute the length of a quaternion ``x``. + + +.. function:: length_sq(x: Vector[Any,Scalar]) -> Scalar + + Compute the squared length of a 2D vector ``x``. + + +.. function:: length_sq(x: Quaternion[Scalar]) -> Scalar + :noindex: + :nocontentsentry: + + Compute the squared length of a quaternion ``x``. + + +.. function:: normalize(x: Vector[Any,Float]) -> Vector[Any,Scalar] + + Compute the normalized value of ``x``. If ``length(x)`` is 0 then the zero vector is returned. + + +.. function:: normalize(x: Quaternion[Float]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + Compute the normalized value of ``x``. If ``length(x)`` is 0, then the zero quaternion is returned. + + +.. function:: transpose(m: Matrix[Any,Any,Scalar]) + + Return the transpose of the matrix ``m``. + + +.. function:: inverse(m: Matrix[2,2,Float]) -> Matrix[Any,Any,Float] + + Return the inverse of a 2x2 matrix ``m``. + + +.. function:: inverse(m: Matrix[3,3,Float]) -> Matrix[Any,Any,Float] + :noindex: + :nocontentsentry: + + Return the inverse of a 3x3 matrix ``m``. + + +.. function:: inverse(m: Matrix[4,4,Float]) -> Matrix[Any,Any,Float] + :noindex: + :nocontentsentry: + + Return the inverse of a 4x4 matrix ``m``. + + +.. function:: determinant(m: Matrix[2,2,Float]) -> Scalar + + Return the determinant of a 2x2 matrix ``m``. + + +.. function:: determinant(m: Matrix[3,3,Float]) -> Scalar + :noindex: + :nocontentsentry: + + Return the determinant of a 3x3 matrix ``m``. + + +.. function:: determinant(m: Matrix[4,4,Float]) -> Scalar + :noindex: + :nocontentsentry: + + Return the determinant of a 4x4 matrix ``m``. + + +.. function:: trace(m: Matrix[Any,Any,Scalar]) -> Scalar + + Return the trace of the matrix ``m``. + + +.. function:: diag(d: Vector[Any,Scalar]) -> Matrix[Any,Any,Scalar] + + Returns a matrix with the components of the vector ``d`` on the diagonal. + + +.. function:: get_diag(m: Matrix[Any,Any,Scalar]) -> Vector[Any,Scalar] + + Returns a vector containing the diagonal elements of the square matrix ``m``. + + +.. function:: cw_mul(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + + Component-wise multiplication of two 2D vectors. + + +.. function:: cw_mul(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + Component-wise multiplication of two 2D vectors. + + +.. function:: cw_div(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + + Component-wise division of two 2D vectors. + + +.. function:: cw_div(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + Component-wise division of two 2D vectors. + + +.. function:: vector(w: Vector[3,Float], v: Vector[3,Float]) + + Construct a 6D screw vector from two 3D vectors. + + +.. function:: vector(*arg_types: Scalar, length: int32, dtype: Scalar) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + Construct a vector of with given length and dtype. + + +.. function:: matrix(pos: Vector[3,Float], rot: Quaternion[Float], scale: Vector[3,Float]) -> Matrix[Any,Any,Float] + + Construct a 4x4 transformation matrix that applies the transformations as + Translation(pos)*Rotation(rot)*Scale(scale) when applied to column vectors, i.e.: y = (TRS)*x + + +.. function:: matrix(*arg_types: Scalar, shape: Tuple[int, int], dtype: Scalar) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + Construct a matrix. If the positional ``arg_types`` are not given, then matrix will be zero-initialized. + + +.. function:: identity(n: int32, dtype: Scalar) -> Matrix[Any,Any,Scalar] + + Create an identity matrix with shape=(n,n) with the type given by ``dtype``. + + +.. function:: svd3(A: Matrix[3,3,Float], U: Matrix[3,3,Float], sigma: Vector[3,Float], V: Matrix[3,3,Scalar]) -> None + + Compute the SVD of a 3x3 matrix ``A``. The singular values are returned in ``sigma``, + while the left and right basis vectors are returned in ``U`` and ``V``. + + +.. function:: qr3(A: Matrix[3,3,Float], Q: Matrix[3,3,Float], R: Matrix[3,3,Float]) -> None + + Compute the QR decomposition of a 3x3 matrix ``A``. The orthogonal matrix is returned in ``Q``, + while the upper triangular matrix is returned in ``R``. + + +.. function:: eig3(A: Matrix[3,3,Float], Q: Matrix[3,3,Float], d: Vector[3,Float]) -> None + + Compute the eigendecomposition of a 3x3 matrix ``A``. The eigenvectors are returned as the columns of ``Q``, + while the corresponding eigenvalues are returned in ``d``. + + + + +Quaternion Math +--------------- +.. function:: quaternion() -> Quaternion[Float] + + Construct a zero-initialized quaternion. Quaternions are laid out as + [ix, iy, iz, r], where ix, iy, iz are the imaginary part, and r the real part. + + +.. function:: quaternion(x: Float, y: Float, z: Float, w: Float) -> Quaternion[Float] + :noindex: + :nocontentsentry: + + Create a quaternion using the supplied components (type inferred from component type). + + +.. function:: quaternion(i: Vector[3,Float], r: Float) -> Quaternion[Float] + :noindex: + :nocontentsentry: + + Create a quaternion using the supplied vector/scalar (type inferred from scalar type). + + +.. function:: quaternion(q: Quaternion[Float]) + :noindex: + :nocontentsentry: + + Construct a quaternion of type dtype from another quaternion of a different dtype. + + +.. function:: quat_identity() -> quatf + + Construct an identity quaternion with zero imaginary part and real part of 1.0 + + +.. function:: quat_from_axis_angle(axis: Vector[3,Float], angle: Float) -> Quaternion[Scalar] + + Construct a quaternion representing a rotation of angle radians around the given axis. + + +.. function:: quat_to_axis_angle(q: Quaternion[Float], axis: Vector[3,Float], angle: Float) -> None + + Extract the rotation axis and angle radians a quaternion represents. + + +.. function:: quat_from_matrix(m: Matrix[3,3,Float]) -> Quaternion[Scalar] + + Construct a quaternion from a 3x3 matrix. + + +.. function:: quat_rpy(roll: Float, pitch: Float, yaw: Float) -> Quaternion[Scalar] + + Construct a quaternion representing a combined roll (z), pitch (x), yaw rotations (y) in radians. + + +.. function:: quat_inverse(q: Quaternion[Float]) -> Quaternion[Scalar] + + Compute quaternion conjugate. + + +.. function:: quat_rotate(q: Quaternion[Float], p: Vector[3,Float]) -> Vector[3,Scalar] + + Rotate a vector by a quaternion. + + +.. function:: quat_rotate_inv(q: Quaternion[Float], p: Vector[3,Float]) -> Vector[3,Scalar] + + Rotate a vector by the inverse of a quaternion. + + +.. function:: quat_slerp(q0: Quaternion[Float], q1: Quaternion[Float], t: Float) -> Quaternion[Scalar] + + Linearly interpolate between two quaternions. + + +.. function:: quat_to_matrix(q: Quaternion[Float]) -> Matrix[3,3,Scalar] + + Convert a quaternion to a 3x3 rotation matrix. + + + + +Transformations +--------------- +.. function:: transformation(p: Vector[3,Float], q: Quaternion[Float]) -> Transformation[Scalar] + + Construct a rigid-body transformation with translation part ``p`` and rotation ``q``. + + +.. function:: transform_identity() -> transformf + + Construct an identity transform with zero translation and identity rotation. + + +.. function:: transform_get_translation(t: Transformation[Float]) -> Vector[3,Scalar] + + Return the translational part of a transform ``t``. + + +.. function:: transform_get_rotation(t: Transformation[Float]) -> Quaternion[Scalar] + + Return the rotational part of a transform ``t``. + + +.. function:: transform_multiply(a: Transformation[Float], b: Transformation[Float]) -> Transformation[Scalar] + + Multiply two rigid body transformations together. + + +.. function:: transform_point(t: Transformation[Scalar], p: Vector[3,Scalar]) -> Vector[3,Scalar] + + Apply the transform to a point ``p`` treating the homogeneous coordinate as w=1 (translation and rotation). + + +.. function:: transform_point(m: Matrix[4,4,Scalar], p: Vector[3,Scalar]) -> Vector[3,Scalar] + :noindex: + :nocontentsentry: + + Apply the transform to a point ``p`` treating the homogeneous coordinate as w=1. + The transformation is applied treating ``p`` as a column vector, e.g.: ``y = M*p``. + Note this is in contrast to some libraries, notably USD, which applies transforms to row vectors, ``y^T = p^T*M^T``. + If the transform is coming from a library that uses row-vectors, then users should transpose the transformation + matrix before calling this method. + + +.. function:: transform_vector(t: Transformation[Scalar], v: Vector[3,Scalar]) -> Vector[3,Scalar] + + Apply the transform to a vector ``v`` treating the homogeneous coordinate as w=0 (rotation only). + + +.. function:: transform_vector(m: Matrix[4,4,Scalar], v: Vector[3,Scalar]) -> Vector[3,Scalar] + :noindex: + :nocontentsentry: + + Apply the transform to a vector ``v`` treating the homogeneous coordinate as w=0. + The transformation is applied treating ``v`` as a column vector, e.g.: ``y = M*v`` + note this is in contrast to some libraries, notably USD, which applies transforms to row vectors, ``y^T = v^T*M^T``. + If the transform is coming from a library that uses row-vectors, then users should transpose the transformation + matrix before calling this method. + + +.. function:: transform_inverse(t: Transformation[Float]) -> Transformation[Float] + + Compute the inverse of the transformation ``t``. + + + + +Spatial Math +--------------- +.. function:: spatial_adjoint(r: Matrix[3,3,Float], s: Matrix[3,3,Float]) -> Matrix[6,6,Scalar] + + Construct a 6x6 spatial inertial matrix from two 3x3 diagonal blocks. + + +.. function:: spatial_dot(a: Vector[6,Float], b: Vector[6,Float]) -> Scalar + + Compute the dot product of two 6D screw vectors. + + +.. function:: spatial_cross(a: Vector[6,Float], b: Vector[6,Float]) -> Vector[6,Float] + + Compute the cross product of two 6D screw vectors. + + +.. function:: spatial_cross_dual(a: Vector[6,Float], b: Vector[6,Float]) -> Vector[6,Float] + + Compute the dual cross product of two 6D screw vectors. + + +.. function:: spatial_top(a: Vector[6,Float]) + + Return the top (first) part of a 6D screw vector. + + +.. function:: spatial_bottom(a: Vector[6,Float]) + + Return the bottom (second) part of a 6D screw vector. + + +.. function:: spatial_jacobian(S: Array[Vector[6,Float]], joint_parents: Array[int32], joint_qd_start: Array[int32], joint_start: int32, joint_count: int32, J_start: int32, J_out: Array[Float]) -> None + + +.. function:: spatial_mass(I_s: Array[Matrix[6,6,Float]], joint_start: int32, joint_count: int32, M_start: int32, M: Array[Float]) -> None + + + + +Utility +--------------- +.. function:: mlp(weights: Array[float32], bias: Array[float32], activation: Callable, index: int32, x: Array[float32], out: Array[float32]) -> None + + Evaluate a multi-layer perceptron (MLP) layer in the form: ``out = act(weights*x + bias)``. + + :param weights: A layer's network weights with dimensions ``(m, n)``. + :param bias: An array with dimensions ``(n)``. + :param activation: A ``wp.func`` function that takes a single scalar float as input and returns a scalar float as output + :param index: The batch item to process, typically each thread will process one item in the batch, in which case + index should be ``wp.tid()`` + :param x: The feature matrix with dimensions ``(n, b)`` + :param out: The network output with dimensions ``(m, b)`` + + :note: Feature and output matrices are transposed compared to some other frameworks such as PyTorch. + All matrices are assumed to be stored in flattened row-major memory layout (NumPy default). + + +.. function:: printf() -> None + + Allows printing formatted strings using C-style format specifiers. + + +.. function:: print(value: Any) -> None + + Print variable to stdout + + +.. function:: breakpoint() -> None + + Debugger breakpoint + + +.. function:: tid() -> int + + Return the current thread index for a 1D kernel launch. Note that this is the *global* index of the thread in the range [0, dim) + where dim is the parameter passed to kernel launch. This function may not be called from user-defined Warp functions. + + +.. function:: tid() -> Tuple[int, int] + :noindex: + :nocontentsentry: + + Return the current thread indices for a 2D kernel launch. Use ``i,j = wp.tid()`` syntax to retrieve the + coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions. + + +.. function:: tid() -> Tuple[int, int, int] + :noindex: + :nocontentsentry: + + Return the current thread indices for a 3D kernel launch. Use ``i,j,k = wp.tid()`` syntax to retrieve the + coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions. + + +.. function:: tid() -> Tuple[int, int, int, int] + :noindex: + :nocontentsentry: + + Return the current thread indices for a 4D kernel launch. Use ``i,j,k,l = wp.tid()`` syntax to retrieve the + coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions. + + +.. function:: select(cond: bool, arg1: Any, arg2: Any) + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: bool, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: int8, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: uint8, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: int16, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: uint16, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: int32, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: uint32, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: int64, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(cond: uint64, arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2`` + + +.. function:: select(arr: Array[Any], arg1: Any, arg2: Any) + :noindex: + :nocontentsentry: + + Select between two arguments, if ``arr`` is null then return ``arg1``, otherwise return ``arg2`` + + +.. function:: atomic_add(a: Array[Any], i: int32, value: Any) + + Atomically add ``value`` onto ``a[i]``. + + +.. function:: atomic_add(a: Array[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j]``. + + +.. function:: atomic_add(a: Array[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_add(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_add(a: FabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i]``. + + +.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j]``. + + +.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i]``. + + +.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j]``. + + +.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically add ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_sub(a: Array[Any], i: int32, value: Any) + + Atomically subtract ``value`` onto ``a[i]``. + + +.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j]``. + + +.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_sub(a: FabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i]``. + + +.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j]``. + + +.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i]``. + + +.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j]``. + + +.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k]``. + + +.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Atomically subtract ``value`` onto ``a[i,j,k,l]``. + + +.. function:: atomic_min(a: Array[Any], i: int32, value: Any) + + Compute the minimum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: Array[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: Array[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: FabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: Array[Any], i: int32, value: Any) + + Compute the maximum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: Array[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: Array[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: FabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any) + :noindex: + :nocontentsentry: + + Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array. + +Note that for vectors and matrices the operation is only atomic on a per-component basis. + + +.. function:: lerp(a: Float, b: Float, t: Float) -> Float + + Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t`` + + +.. function:: lerp(a: Vector[Any,Float], b: Vector[Any,Float], t: Float) -> Vector[Any,Float] + :noindex: + :nocontentsentry: + + Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t`` + + +.. function:: lerp(a: Matrix[Any,Any,Float], b: Matrix[Any,Any,Float], t: Float) -> Matrix[Any,Any,Float] + :noindex: + :nocontentsentry: + + Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t`` + + +.. function:: lerp(a: Quaternion[Float], b: Quaternion[Float], t: Float) -> Quaternion[Float] + :noindex: + :nocontentsentry: + + Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t`` + + +.. function:: lerp(a: Transformation[Float], b: Transformation[Float], t: Float) -> Transformation[Float] + :noindex: + :nocontentsentry: + + Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t`` + + +.. function:: smoothstep(edge0: Float, edge1: Float, x: Float) -> Float + + Smoothly interpolate between two values ``edge0`` and ``edge1`` using a factor ``x``, + and return a result between 0 and 1 using a cubic Hermite interpolation after clamping. + + +.. function:: expect_near(arg1: Float, arg2: Float, tolerance: Float) -> None + + Prints an error to stdout if ``arg1`` and ``arg2`` are not closer than tolerance in magnitude + + +.. function:: expect_near(arg1: vec3f, arg2: vec3f, tolerance: float32) -> None + :noindex: + :nocontentsentry: + + Prints an error to stdout if any element of ``arg1`` and ``arg2`` are not closer than tolerance in magnitude + + + + +Geometry +--------------- +.. function:: bvh_query_aabb(id: uint64, lower: vec3f, upper: vec3f) -> bvh_query_t + + Construct an axis-aligned bounding box query against a BVH object. This query can be used to iterate over all bounds + inside a BVH. + + :param id: The BVH identifier + :param lower: The lower bound of the bounding box in BVH space + :param upper: The upper bound of the bounding box in BVH space + + +.. function:: bvh_query_ray(id: uint64, start: vec3f, dir: vec3f) -> bvh_query_t + + Construct a ray query against a BVH object. This query can be used to iterate over all bounds + that intersect the ray. + + :param id: The BVH identifier + :param start: The start of the ray in BVH space + :param dir: The direction of the ray in BVH space + + +.. function:: bvh_query_next(query: bvh_query_t, index: int32) -> bool + + Move to the next bound returned by the query. + The index of the current bound is stored in ``index``, returns ``False`` if there are no more overlapping bound. + + +.. function:: mesh_query_point(id: uint64, point: vec3f, max_dist: float32) -> mesh_query_point_t + + Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space. + + Identifies the sign of the distance using additional ray-casts to determine if the point is inside or outside. + This method is relatively robust, but does increase computational cost. + See below for additional sign determination methods. + + :param id: The mesh identifier + :param point: The point in space to query + :param max_dist: Mesh faces above this distance will not be considered by the query + + +.. function:: mesh_query_point_no_sign(id: uint64, point: vec3f, max_dist: float32) -> mesh_query_point_t + + Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space. + + This method does not compute the sign of the point (inside/outside) which makes it faster than other point query methods. + + :param id: The mesh identifier + :param point: The point in space to query + :param max_dist: Mesh faces above this distance will not be considered by the query + + +.. function:: mesh_query_furthest_point_no_sign(id: uint64, point: vec3f, min_dist: float32) -> mesh_query_point_t + + Computes the furthest point on the mesh with identifier `id` to the given point in space. + + This method does not compute the sign of the point (inside/outside). + + :param id: The mesh identifier + :param point: The point in space to query + :param min_dist: Mesh faces below this distance will not be considered by the query + + +.. function:: mesh_query_point_sign_normal(id: uint64, point: vec3f, max_dist: float32, epsilon: float32) -> mesh_query_point_t + + Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space. + + Identifies the sign of the distance (inside/outside) using the angle-weighted pseudo normal. + This approach to sign determination is robust for well conditioned meshes that are watertight and non-self intersecting. + It is also comparatively fast to compute. + + :param id: The mesh identifier + :param point: The point in space to query + :param max_dist: Mesh faces above this distance will not be considered by the query + :param epsilon: Epsilon treating distance values as equal, when locating the minimum distance vertex/face/edge, as a + fraction of the average edge length, also for treating closest point as being on edge/vertex default 1e-3 + + +.. function:: mesh_query_point_sign_winding_number(id: uint64, point: vec3f, max_dist: float32, accuracy: float32, threshold: float32) -> mesh_query_point_t + + Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given point in space. + + Identifies the sign using the winding number of the mesh relative to the query point. This method of sign determination is robust for poorly conditioned meshes + and provides a smooth approximation to sign even when the mesh is not watertight. This method is the most robust and accurate of the sign determination meshes + but also the most expensive. + + .. note:: The :class:`Mesh` object must be constructed with ``support_winding_number=True`` for this method to return correct results. + + :param id: The mesh identifier + :param point: The point in space to query + :param max_dist: Mesh faces above this distance will not be considered by the query + :param accuracy: Accuracy for computing the winding number with fast winding number method utilizing second-order dipole approximation, default 2.0 + :param threshold: The threshold of the winding number to be considered inside, default 0.5 + + +.. function:: mesh_query_ray(id: uint64, start: vec3f, dir: vec3f, max_t: float32) -> mesh_query_ray_t + + Computes the closest ray hit on the :class:`Mesh` with identifier ``id``. + + :param id: The mesh identifier + :param start: The start point of the ray + :param dir: The ray direction (should be normalized) + :param max_t: The maximum distance along the ray to check for intersections + + +.. function:: mesh_query_aabb(id: uint64, lower: vec3f, upper: vec3f) -> mesh_query_aabb_t + + Construct an axis-aligned bounding box query against a :class:`Mesh`. + This query can be used to iterate over all triangles inside a volume. + + :param id: The mesh identifier + :param lower: The lower bound of the bounding box in mesh space + :param upper: The upper bound of the bounding box in mesh space + + +.. function:: mesh_query_aabb_next(query: mesh_query_aabb_t, index: int32) -> bool + + Move to the next triangle overlapping the query bounding box. + The index of the current face is stored in ``index``, returns ``False`` if there are no more overlapping triangles. + + +.. function:: mesh_eval_position(id: uint64, face: int32, bary_u: float32, bary_v: float32) -> vec3f + + Evaluates the position on the :class:`Mesh` given a face index and barycentric coordinates. + + +.. function:: mesh_eval_velocity(id: uint64, face: int32, bary_u: float32, bary_v: float32) -> vec3f + + Evaluates the velocity on the :class:`Mesh` given a face index and barycentric coordinates. + + +.. function:: hash_grid_query(id: uint64, point: vec3f, max_dist: float32) -> hash_grid_query_t + + Construct a point query against a :class:`HashGrid`. This query can be used to iterate over all neighboring points within a fixed radius from the query point. + + +.. function:: hash_grid_query_next(query: hash_grid_query_t, index: int32) -> bool + + Move to the next point in the hash grid query. The index of the current neighbor is stored in ``index``, returns ``False`` + if there are no more neighbors. + + +.. function:: hash_grid_point_id(id: uint64, index: int32) -> int + + Return the index of a point in the :class:`HashGrid`. This can be used to reorder threads such that grid + traversal occurs in a spatially coherent order. + + Returns -1 if the :class:`HashGrid` has not been reserved. + + +.. function:: intersect_tri_tri(v0: vec3f, v1: vec3f, v2: vec3f, u0: vec3f, u1: vec3f, u2: vec3f) -> int + + Tests for intersection between two triangles (v0, v1, v2) and (u0, u1, u2) using Moller's method. Returns > 0 if triangles intersect. + + +.. function:: mesh_get(id: uint64) -> Mesh + + Retrieves the mesh given its index. [1]_ + + +.. function:: mesh_eval_face_normal(id: uint64, face: int32) -> vec3f + + Evaluates the face normal the mesh given a face index. + + +.. function:: mesh_get_point(id: uint64, index: int32) -> vec3f + + Returns the point of the mesh given a index. + + +.. function:: mesh_get_velocity(id: uint64, index: int32) -> vec3f + + Returns the velocity of the mesh given a index. + + +.. function:: mesh_get_index(id: uint64, index: int32) -> int + + Returns the point-index of the mesh given a face-vertex index. + + +.. function:: closest_point_edge_edge(p1: vec3f, q1: vec3f, p2: vec3f, q2: vec3f, epsilon: float32) -> vec3f + + Finds the closest points between two edges. Returns barycentric weights to the points on each edge, as well as the closest distance between the edges. + + :param p1: First point of first edge + :param q1: Second point of first edge + :param p2: First point of second edge + :param q2: Second point of second edge + :param epsilon: Zero tolerance for determining if points in an edge are degenerate. + :param out: vec3 output containing (s,t,d), where `s` in [0,1] is the barycentric weight for the first edge, `t` is the barycentric weight for the second edge, and `d` is the distance between the two edges at these two closest points. + + + + +Volumes +--------------- +.. function:: volume_sample_f(id: uint64, uvw: vec3f, sampling_mode: int32) -> float + + Sample the volume given by ``id`` at the volume local-space point ``uvw``. + Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.` + + +.. function:: volume_sample_grad_f(id: uint64, uvw: vec3f, sampling_mode: int32, grad: vec3f) -> float + + Sample the volume and its gradient given by ``id`` at the volume local-space point ``uvw``. + Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.` + + +.. function:: volume_lookup_f(id: uint64, i: int32, j: int32, k: int32) -> float + + Returns the value of voxel with coordinates ``i``, ``j``, ``k``. + If the voxel at this index does not exist, this function returns the background value + + +.. function:: volume_store_f(id: uint64, i: int32, j: int32, k: int32, value: float32) -> None + + Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``. + + +.. function:: volume_sample_v(id: uint64, uvw: vec3f, sampling_mode: int32) -> vec3f + + Sample the vector volume given by ``id`` at the volume local-space point ``uvw``. + Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.` + + +.. function:: volume_lookup_v(id: uint64, i: int32, j: int32, k: int32) -> vec3f + + Returns the vector value of voxel with coordinates ``i``, ``j``, ``k``. + If the voxel at this index does not exist, this function returns the background value. + + +.. function:: volume_store_v(id: uint64, i: int32, j: int32, k: int32, value: vec3f) -> None + + Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``. + + +.. function:: volume_sample_i(id: uint64, uvw: vec3f) -> int + + Sample the :class:`int32` volume given by ``id`` at the volume local-space point ``uvw``. + + +.. function:: volume_lookup_i(id: uint64, i: int32, j: int32, k: int32) -> int + + Returns the :class:`int32` value of voxel with coordinates ``i``, ``j``, ``k``. + If the voxel at this index does not exist, this function returns the background value. + + +.. function:: volume_store_i(id: uint64, i: int32, j: int32, k: int32, value: int32) -> None + + Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``. + + +.. function:: volume_index_to_world(id: uint64, uvw: vec3f) -> vec3f + + Transform a point ``uvw`` defined in volume index space to world space given the volume's intrinsic affine transformation. + + +.. function:: volume_world_to_index(id: uint64, xyz: vec3f) -> vec3f + + Transform a point ``xyz`` defined in volume world space to the volume's index space given the volume's intrinsic affine transformation. + + +.. function:: volume_index_to_world_dir(id: uint64, uvw: vec3f) -> vec3f + + Transform a direction ``uvw`` defined in volume index space to world space given the volume's intrinsic affine transformation. + + +.. function:: volume_world_to_index_dir(id: uint64, xyz: vec3f) -> vec3f + + Transform a direction ``xyz`` defined in volume world space to the volume's index space given the volume's intrinsic affine transformation. + + + + +Random +--------------- +.. function:: rand_init(seed: int32) -> uint32 + + Initialize a new random number generator given a user-defined seed. Returns a 32-bit integer representing the RNG state. + + +.. function:: rand_init(seed: int32, offset: int32) -> uint32 + :noindex: + :nocontentsentry: + + Initialize a new random number generator given a user-defined seed and an offset. + This alternative constructor can be useful in parallel programs, where a kernel as a whole should share a seed, + but each thread should generate uncorrelated values. In this case usage should be ``r = rand_init(seed, tid)`` + + +.. function:: randi(state: uint32) -> int + + Return a random integer in the range [0, 2^32). + + +.. function:: randi(state: uint32, min: int32, max: int32) -> int + :noindex: + :nocontentsentry: + + Return a random integer between [min, max). + + +.. function:: randf(state: uint32) -> float + + Return a random float between [0.0, 1.0). + + +.. function:: randf(state: uint32, min: float32, max: float32) -> float + :noindex: + :nocontentsentry: + + Return a random float between [min, max). + + +.. function:: randn(state: uint32) -> float + + Sample a normal distribution. + + +.. function:: sample_cdf(state: uint32, cdf: Array[float32]) -> int + + Inverse-transform sample a cumulative distribution function. + + +.. function:: sample_triangle(state: uint32) -> vec2f + + Uniformly sample a triangle. Returns sample barycentric coordinates. + + +.. function:: sample_unit_ring(state: uint32) -> vec2f + + Uniformly sample a ring in the xy plane. + + +.. function:: sample_unit_disk(state: uint32) -> vec2f + + Uniformly sample a disk in the xy plane. + + +.. function:: sample_unit_sphere_surface(state: uint32) -> vec3f + + Uniformly sample a unit sphere surface. + + +.. function:: sample_unit_sphere(state: uint32) -> vec3f + + Uniformly sample a unit sphere. + + +.. function:: sample_unit_hemisphere_surface(state: uint32) -> vec3f + + Uniformly sample a unit hemisphere surface. + + +.. function:: sample_unit_hemisphere(state: uint32) -> vec3f + + Uniformly sample a unit hemisphere. + + +.. function:: sample_unit_square(state: uint32) -> vec2f + + Uniformly sample a unit square. + + +.. function:: sample_unit_cube(state: uint32) -> vec3f + + Uniformly sample a unit cube. + + +.. function:: poisson(state: uint32, lam: float32) -> uint32 + + Generate a random sample from a Poisson distribution. + + :param state: RNG state + :param lam: The expected value of the distribution + + +.. function:: noise(state: uint32, x: float32) -> float + + Non-periodic Perlin-style noise in 1D. + + +.. function:: noise(state: uint32, xy: vec2f) -> float + :noindex: + :nocontentsentry: + + Non-periodic Perlin-style noise in 2D. + + +.. function:: noise(state: uint32, xyz: vec3f) -> float + :noindex: + :nocontentsentry: + + Non-periodic Perlin-style noise in 3D. + + +.. function:: noise(state: uint32, xyzt: vec4f) -> float + :noindex: + :nocontentsentry: + + Non-periodic Perlin-style noise in 4D. + + +.. function:: pnoise(state: uint32, x: float32, px: int32) -> float + + Periodic Perlin-style noise in 1D. + + +.. function:: pnoise(state: uint32, xy: vec2f, px: int32, py: int32) -> float + :noindex: + :nocontentsentry: + + Periodic Perlin-style noise in 2D. + + +.. function:: pnoise(state: uint32, xyz: vec3f, px: int32, py: int32, pz: int32) -> float + :noindex: + :nocontentsentry: + + Periodic Perlin-style noise in 3D. + + +.. function:: pnoise(state: uint32, xyzt: vec4f, px: int32, py: int32, pz: int32, pt: int32) -> float + :noindex: + :nocontentsentry: + + Periodic Perlin-style noise in 4D. + + +.. function:: curlnoise(state: uint32, xy: vec2f, octaves: uint32, lacunarity: float32, gain: float32) -> vec2f + + Divergence-free vector field based on the gradient of a Perlin noise function. [1]_ + + +.. function:: curlnoise(state: uint32, xyz: vec3f, octaves: uint32, lacunarity: float32, gain: float32) -> vec3f + :noindex: + :nocontentsentry: + + Divergence-free vector field based on the curl of three Perlin noise functions. [1]_ + + +.. function:: curlnoise(state: uint32, xyzt: vec4f, octaves: uint32, lacunarity: float32, gain: float32) -> vec3f + :noindex: + :nocontentsentry: + + Divergence-free vector field based on the curl of three Perlin noise functions. [1]_ + + + + +Other +--------------- +.. function:: lower_bound(arr: Array[Scalar], value: Scalar) -> int + + Search a sorted array ``arr`` for the closest element greater than or equal to ``value``. + + +.. function:: lower_bound(arr: Array[Scalar], arr_begin: int32, arr_end: int32, value: Scalar) -> int + :noindex: + :nocontentsentry: + + Search a sorted array ``arr`` in the range [arr_begin, arr_end) for the closest element greater than or equal to ``value``. + + + + +Operators +--------------- +.. function:: add(x: Scalar, y: Scalar) -> Scalar + + +.. function:: add(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: add(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: add(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: add(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: sub(x: Scalar, y: Scalar) -> Scalar + + +.. function:: sub(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: sub(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: sub(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: sub(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: bit_and(x: Int, y: Int) -> Int + + +.. function:: bit_or(x: Int, y: Int) -> Int + + +.. function:: bit_xor(x: Int, y: Int) -> Int + + +.. function:: lshift(x: Int, y: Int) -> Int + + +.. function:: rshift(x: Int, y: Int) -> Int + + +.. function:: invert(x: Int) -> Int + + +.. function:: mul(x: Scalar, y: Scalar) -> Scalar + + +.. function:: mul(x: Vector[Any,Scalar], y: Scalar) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Scalar, y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Quaternion[Scalar], y: Scalar) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Scalar, y: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Scalar, y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Matrix[Any,Any,Scalar], y: Scalar) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Matrix[Any,Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Vector[Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Scalar, y: Transformation[Scalar]) -> Transformation[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mul(x: Transformation[Scalar], y: Scalar) -> Transformation[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: mod(x: Scalar, y: Scalar) -> Scalar + + +.. function:: div(x: Scalar, y: Scalar) -> Scalar + + +.. function:: div(x: Vector[Any,Scalar], y: Scalar) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: div(x: Scalar, y: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: div(x: Matrix[Any,Any,Scalar], y: Scalar) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: div(x: Scalar, y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: div(x: Quaternion[Scalar], y: Scalar) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: div(x: Scalar, y: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: floordiv(x: Scalar, y: Scalar) -> Scalar + + +.. function:: pos(x: Scalar) -> Scalar + + +.. function:: pos(x: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: pos(x: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: pos(x: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: neg(x: Scalar) -> Scalar + + +.. function:: neg(x: Vector[Any,Scalar]) -> Vector[Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: neg(x: Quaternion[Scalar]) -> Quaternion[Scalar] + :noindex: + :nocontentsentry: + + +.. function:: neg(x: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar] + :noindex: + :nocontentsentry: + + +.. function:: unot(b: bool) -> bool + + +.. function:: unot(b: int8) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: uint8) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: int16) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: uint16) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: int32) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: uint32) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: int64) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(b: uint64) -> bool + :noindex: + :nocontentsentry: + + +.. function:: unot(a: Array[Any]) -> bool + :noindex: + :nocontentsentry: + + +.. rubric:: Footnotes +.. [1] Note: function gradients not implemented for backpropagation. diff --git a/_sources/modules/interoperability.rst.txt b/_sources/modules/interoperability.rst.txt new file mode 100644 index 00000000..e12b4cd8 --- /dev/null +++ b/_sources/modules/interoperability.rst.txt @@ -0,0 +1,291 @@ +Interoperability +================ + +Warp can interop with other Python-based frameworks such as NumPy through standard interface protocols. + +NumPy +----- + +Warp arrays may be converted to a NumPy array through the ``warp.array.numpy()`` method. When the Warp array lives on +the ``cpu`` device this will return a zero-copy view onto the underlying Warp allocation. If the array lives on a +``cuda`` device then it will first be copied back to a temporary buffer and copied to NumPy. + +Warp CPU arrays also implement the ``__array_interface__`` protocol and so can be used to construct NumPy arrays +directly:: + + w = wp.array([1.0, 2.0, 3.0], dtype=float, device="cpu") + a = np.array(w) + print(a) + > [1. 2. 3.] + +.. _pytorch-interop: + +PyTorch +------- + +Warp provides helper functions to convert arrays to/from PyTorch. Please see the ``warp.torch`` module for more details. Example usage is shown below:: + + import warp.torch + + w = wp.array([1.0, 2.0, 3.0], dtype=float, device="cpu") + + # convert to Torch tensor + t = warp.to_torch(w) + + # convert from Torch tensor + w = warp.from_torch(t) + +These helper functions allow the conversion of Warp arrays to/from PyTorch tensors without copying the underlying data. +At the same time, if available, gradient arrays and tensors are converted to/from PyTorch autograd tensors, allowing the use of Warp arrays +in PyTorch autograd computations. + +Example: Optimization using ``warp.from_torch()`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +An example usage of minimizing a loss function over an array of 2D points written in Warp via PyTorch's Adam optimizer using ``warp.from_torch`` is as follows:: + + import warp as wp + import torch + + wp.init() + + @wp.kernel() + def loss(xs: wp.array(dtype=float, ndim=2), l: wp.array(dtype=float)): + tid = wp.tid() + wp.atomic_add(l, 0, xs[tid, 0] ** 2.0 + xs[tid, 1] ** 2.0) + + # indicate requires_grad so that Warp can accumulate gradients in the grad buffers + xs = torch.randn(100, 2, requires_grad=True) + l = torch.zeros(1, requires_grad=True) + opt = torch.optim.Adam([xs], lr=0.1) + + wp_xs = wp.from_torch(xs) + wp_l = wp.from_torch(l) + + tape = wp.Tape() + with tape: + # record the loss function kernel launch on the tape + wp.launch(loss, dim=len(xs), inputs=[wp_xs], outputs=[wp_l], device=wp_xs.device) + + for i in range(500): + tape.zero() + tape.backward(loss=wp_l) # compute gradients + # now xs.grad will be populated with the gradients computed by Warp + opt.step() # update xs (and thereby wp_xs) + + # these lines are only needed for evaluating the loss + # (the optimization just needs the gradient, not the loss value) + wp_l.zero_() + wp.launch(loss, dim=len(xs), inputs=[wp_xs], outputs=[wp_l], device=wp_xs.device) + print(f"{i}\tloss: {l.item()}") + +Example: Optimization using ``warp.to_torch`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Less code is needed when we declare the optimization variables directly in Warp and use ``warp.to_torch`` to convert them to PyTorch tensors. +Here, we revisit the same example from above where now only a single conversion to a torch tensor is needed to supply Adam with the optimization variables:: + + import warp as wp + import numpy as np + import torch + + wp.init() + + @wp.kernel() + def loss(xs: wp.array(dtype=float, ndim=2), l: wp.array(dtype=float)): + tid = wp.tid() + wp.atomic_add(l, 0, xs[tid, 0] ** 2.0 + xs[tid, 1] ** 2.0) + + # initialize the optimization variables in Warp + xs = wp.array(np.random.randn(100, 2), dtype=wp.float32, requires_grad=True) + l = wp.zeros(1, dtype=wp.float32, requires_grad=True) + # just a single wp.to_torch call is needed, Adam optimizes using the Warp array gradients + opt = torch.optim.Adam([wp.to_torch(xs)], lr=0.1) + + tape = wp.Tape() + with tape: + wp.launch(loss, dim=len(xs), inputs=[xs], outputs=[l], device=xs.device) + + for i in range(500): + tape.zero() + tape.backward(loss=l) + opt.step() + + l.zero_() + wp.launch(loss, dim=len(xs), inputs=[xs], outputs=[l], device=xs.device) + print(f"{i}\tloss: {l.numpy()[0]}") + +Example: Optimization using ``torch.autograd.function`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +One can insert Warp kernel launches in a PyTorch graph by defining a ``torch.autograd.function`` class, which +requires forward and backward functions to be defined. After mapping incoming torch arrays to Warp arrays, a Warp kernel +may be launched in the usual way. In the backward pass, the same kernel's adjoint may be launched by +setting ``adjoint = True`` in :func:`wp.launch() `. Alternatively, the user may choose to rely on Warp's tape. +In the following example, we demonstrate how Warp may be used to evaluate the Rosenbrock function in an optimization context:: + + import warp as wp + import numpy as np + import torch + + wp.init() + + pvec2 = wp.types.vector(length=2, dtype=wp.float32) + + # Define the Rosenbrock function + @wp.func + def rosenbrock(x: float, y: float): + return (1.0 - x) ** 2.0 + 100.0 * (y - x**2.0) ** 2.0 + + @wp.kernel + def eval_rosenbrock( + xs: wp.array(dtype=pvec2), + # outputs + z: wp.array(dtype=float), + ): + i = wp.tid() + x = xs[i] + z[i] = rosenbrock(x[0], x[1]) + + + class Rosenbrock(torch.autograd.Function): + @staticmethod + def forward(ctx, xy, num_points): + # ensure Torch operations complete before running Warp + wp.synchronize_device() + + ctx.xy = wp.from_torch(xy, dtype=pvec2, requires_grad=True) + ctx.num_points = num_points + + # allocate output + ctx.z = wp.zeros(num_points, requires_grad=True) + + wp.launch( + kernel=eval_rosenbrock, + dim=ctx.num_points, + inputs=[ctx.xy], + outputs=[ctx.z] + ) + + # ensure Warp operations complete before returning data to Torch + wp.synchronize_device() + + return wp.to_torch(ctx.z) + + @staticmethod + def backward(ctx, adj_z): + # ensure Torch operations complete before running Warp + wp.synchronize_device() + + # map incoming Torch grads to our output variables + ctx.z.grad = wp.from_torch(adj_z) + + wp.launch( + kernel=eval_rosenbrock, + dim=ctx.num_points, + inputs=[ctx.xy], + outputs=[ctx.z], + adj_inputs=[ctx.xy.grad], + adj_outputs=[ctx.z.grad], + adjoint=True + ) + + # ensure Warp operations complete before returning data to Torch + wp.synchronize_device() + + # return adjoint w.r.t. inputs + return (wp.to_torch(ctx.xy.grad), None) + + + num_points = 1500 + learning_rate = 5e-2 + + torch_device = wp.device_to_torch(wp.get_device()) + + rng = np.random.default_rng(42) + xy = torch.tensor(rng.normal(size=(num_points, 2)), dtype=torch.float32, requires_grad=True, device=torch_device) + opt = torch.optim.Adam([xy], lr=learning_rate) + + for _ in range(10000): + # step + opt.zero_grad() + z = Rosenbrock.apply(xy, num_points) + z.backward(torch.ones_like(z)) + + opt.step() + + # minimum at (1, 1) + xy_np = xy.numpy(force=True) + print(np.mean(xy_np, axis=0)) + +.. automodule:: warp.torch + :members: + :undoc-members: + +CuPy/Numba +---------- + +Warp GPU arrays support the ``__cuda_array_interface__`` protocol for sharing data with other Python GPU frameworks. +Currently this is one-directional, so that Warp arrays can be used as input to any framework that also supports the +``__cuda_array_interface__`` protocol, but not the other way around. + +.. _jax-interop: + +JAX +--- + +Interoperability with JAX arrays is supported through the following methods. +Internally these use the DLPack protocol to exchange data in a zero-copy way with JAX. + +It may be preferable to use the :ref:`DLPack` protocol directly for better performance and control over stream synchronization behaviour. + +.. automodule:: warp.jax + :members: + :undoc-members: + +.. _DLPack: + +DLPack +------ + +Warp supports the DLPack protocol included in the Python Array API standard v2022.12. +See the `Python Specification for DLPack `_ for reference. + +The canonical way to import an external array into Warp is using the ``warp.from_dlpack()`` function:: + + warp_array = warp.from_dlpack(external_array) + +The external array can be a PyTorch tensor, Jax array, or any other array type compatible with this version of the DLPack protocol. +For CUDA arrays, this approach requires the producer to perform stream synchronization which ensures that operations on the array +are ordered correctly. The ``warp.from_dlpack()`` function asks the producer to synchronize the current Warp stream on the device where +the array resides. Thus it should be safe to use the array in Warp kernels on that device without any additional synchronization. + +The canonical way to export a Warp array to an external framework is to use the ``from_dlpack()`` function in that framework:: + + jax_array = jax.dlpack.from_dlpack(warp_array) + torch_tensor = torch.utils.dlpack.from_dlpack(warp_array) + +For CUDA arrays, this will synchronize the current stream of the consumer framework with the current Warp stream on the array's device. +Thus it should be safe to use the wrapped array in the consumer framework, even if the array was previously used in a Warp kernel +on the device. + +Alternatively, arrays can be shared by explicitly creating PyCapsules using a ``to_dlpack()`` function provided by the producer framework. +This approach may be used for older versions of frameworks that do not support the v2022.12 standard:: + + warp_array1 = warp.from_dlpack(jax.dlpack.to_dlpack(jax_array)) + warp_array2 = warp.from_dlpack(torch.utils.dlpack.to_dlpack(torch_tensor)) + + jax_array = jax.dlpack.from_dlpack(warp.to_dlpack(warp_array)) + torch_tensor = torch.utils.dlpack.from_dlpack(warp.to_dlpack(warp_array)) + +This approach is generally faster because it skips any stream synchronization, but another solution must be used to ensure correct +ordering of operations. In situations where no synchronization is required, using this approach can yield better performance. +This may be a good choice in situations like these: + + - The external framework is using the synchronous CUDA default stream. + - Warp and the external framework are using the same CUDA stream. + - Another synchronization mechanism is already in place. + +.. automodule:: warp.dlpack + :members: + :undoc-members: diff --git a/_sources/modules/render.rst.txt b/_sources/modules/render.rst.txt new file mode 100644 index 00000000..4988c875 --- /dev/null +++ b/_sources/modules/render.rst.txt @@ -0,0 +1,38 @@ +warp.render +=============================== + +.. currentmodule:: warp.render + +The ``warp.render`` module provides a set of renderers that can be used for visualizing scenes involving shapes of various types. + +Built on top of these stand-alone renderers, the ``warp.sim.render`` module provides renderers that can be used to visualize scenes directly from ``warp.sim.ModelBuilder`` objects and update them from ``warp.sim.State`` objects. + +.. + .. toctree:: + :maxdepth: 2 + +Stand-alone renderers +--------------------- + +The ``OpenGLRenderer`` provides an interactive renderer to play back animations in real time, the ``UsdRenderer`` provides a renderer that exports the scene to a USD file that can be rendered in a renderer of your choice. + +.. autoclass:: UsdRenderer + :members: + + +.. autoclass:: OpenGLRenderer + :members: + +Simulation renderers +-------------------- + +Based on these renderers from ``warp.render``, the ``SimRendererUsd`` (which equals ``SimRenderer``) and ``SimRendererOpenGL`` classes from ``warp.sim.render`` are derived to populate the renderers directly from ``warp.sim.ModelBuilder`` scenes and update them from ``warp.sim.State`` objects. + +.. currentmodule:: warp.sim.render + +.. autoclass:: SimRendererUsd + :members: + +.. autoclass:: SimRendererOpenGL + :members: + diff --git a/_sources/modules/runtime.rst.txt b/_sources/modules/runtime.rst.txt new file mode 100644 index 00000000..c6a9cdaf --- /dev/null +++ b/_sources/modules/runtime.rst.txt @@ -0,0 +1,1554 @@ +Runtime Reference +================= + +.. currentmodule:: warp + +This section describes the Warp Python runtime API, how to manage memory, launch kernels, and high-level functionality +for dealing with objects such as meshes and volumes. The APIs described in this section are intended to be used at +the *Python Scope* and run inside the CPython interpreter. For a comprehensive list of functions available at +the *Kernel Scope*, please see the :doc:`functions` section. + +Kernels +------- + +Kernels are launched with the :func:`wp.launch() ` function on a specific device (CPU/GPU):: + + wp.launch(simple_kernel, dim=1024, inputs=[a, b, c], device="cuda") + +Kernels may be launched with multi-dimensional grid bounds. In this case threads are not assigned a single index, +but a coordinate in an n-dimensional grid, e.g.:: + + wp.launch(complex_kernel, dim=(128, 128, 3), ...) + +Launches a 3D grid of threads with dimension 128 x 128 x 3. To retrieve the 3D index for each thread use the following syntax:: + + i,j,k = wp.tid() + +.. note:: + Currently kernels launched on CPU devices will be executed in serial. + Kernels launched on CUDA devices will be launched in parallel with a fixed block-size. + +.. note:: + Note that all the kernel inputs must live on the target device, or a runtime exception will be raised. + +.. autofunction:: launch + +Large Kernel Launches +##################### + +A limitation of Warp is that each dimension of the grid used to launch a kernel must be representable as a 32-bit +signed integer. Therefore, no single dimension of a grid should exceed :math:`2^{31}-1`. + +Warp also currently uses a fixed block size of 256 (CUDA) threads per block. +By default, Warp will try to process one element from the Warp grid in one CUDA thread. +This is not always possible for kernels launched with multi-dimensional grid bounds, as there are +`hardware limitations `_ +on CUDA block dimensions. + +Warp will automatically resort to using +`grid-stride loops `_ when +it is not possible for a CUDA thread to process only one element from the Warp grid +When this happens, some CUDA threads may process more than one element from the Warp grid. +Users can also set the ``max_blocks`` parameter to fine-tune the grid-striding behavior of kernels, even for kernels that are otherwise +able to process one Warp-grid element per CUDA thread. + +Runtime Kernel Specialization +############################# + +It is often desirable to specialize kernels for different types, constants, or functions. +We can achieve this through the use of runtime kernel specialization using Python closures. + +For example, we might require a variety of kernels that execute particular functions for each item in an array. +We might also want this function call to be valid for a variety of data types. Making use of closure and generics, we can generate +these kernels using a single kernel definition: :: + + def make_kernel(func, dtype): + def closure_kernel_fn(data: wp.array(dtype=dtype), out: wp.array(dtype=dtype)): + tid = wp.tid() + out[tid] = func(data[tid]) + + return wp.Kernel(closure_kernel_fn) + +In practice, we might use our kernel generator, ``make_kernel()`` as follows: :: + + @wp.func + def sqr(x: Any) -> Any: + return x * x + + @wp.func + def cube(x: Any) -> Any: + return sqr(x) * x + + sqr_float = make_kernel(sqr, wp.float32) + cube_double = make_kernel(cube, wp.float64) + + arr = [1.0, 2.0, 3.0] + N = len(arr) + + data_float = wp.array(arr, dtype=wp.float32, device=device) + data_double = wp.array(arr, dtype=wp.float64, device=device) + + out_float = wp.zeros(N, dtype=wp.float32, device=device) + out_double = wp.zeros(N, dtype=wp.float64, device=device) + + wp.launch(sqr_float, dim=N, inputs=[data_float], outputs=[out_float], device=device) + wp.launch(cube_double, dim=N, inputs=[data_double], outputs=[out_double], device=device) + +We can specialize kernel definitions over warp constants similarly. The following generates kernels that add a specified constant +to a generic-typed array value: :: + + def make_add_kernel(key, constant): + def closure_kernel_fn(data: wp.array(dtype=Any), out: wp.array(dtype=Any)): + tid = wp.tid() + out[tid] = data[tid] + constant + + return wp.Kernel(closure_kernel_fn, key=key) + + add_ones_int = make_add_kernel("add_one", wp.constant(1)) + add_ones_vec3 = make_add_kernel("add_ones_vec3", wp.constant(wp.vec3(1.0, 1.0, 1.0))) + + a = wp.zeros(2, dtype=int) + b = wp.zeros(2, dtype=wp.vec3) + + a_out = wp.zeros_like(a) + b_out = wp.zeros_like(b) + + wp.launch(add_ones_int, dim=a.size, inputs=[a], outputs=[a_out], device=device) + wp.launch(add_ones_vec3, dim=b.size, inputs=[b], outputs=[b_out], device=device) + + +Arrays +------ + +Arrays are the fundamental memory abstraction in Warp; they are created through the following global constructors: :: + + wp.empty(shape=1024, dtype=wp.vec3, device="cpu") + wp.zeros(shape=1024, dtype=float, device="cuda") + wp.full(shape=1024, value=10, dtype=int, device="cuda") + + +Arrays can also be constructed directly from ``numpy`` ndarrays as follows: :: + + r = np.random.rand(1024) + + # copy to Warp owned array + a = wp.array(r, dtype=float, device="cpu") + + # return a Warp array wrapper around the NumPy data (zero-copy) + a = wp.array(r, dtype=float, copy=False, device="cpu") + + # return a Warp copy of the array data on the GPU + a = wp.array(r, dtype=float, device="cuda") + +Note that for multi-dimensional data the ``dtype`` parameter must be specified explicitly, e.g.: :: + + r = np.random.rand((1024, 3)) + + # initialize as an array of vec3 objects + a = wp.array(r, dtype=wp.vec3, device="cuda") + +If the shapes are incompatible, an error will be raised. + + +Arrays can be moved between devices using the ``array.to()`` method: :: + + host_array = wp.array(a, dtype=float, device="cpu") + + # allocate and copy to GPU + device_array = host_array.to("cuda") + +Additionally, arrays can be copied directly between memory spaces: :: + + src_array = wp.array(a, dtype=float, device="cpu") + dest_array = wp.empty_like(host_array) + + # copy from source CPU buffer to GPU + wp.copy(dest_array, src_array) + +.. autoclass:: array + :members: + :undoc-members: + :exclude-members: vars + +Multi-dimensional Arrays +######################## + +Multi-dimensional arrays can be constructed by passing a tuple of sizes for each dimension, e.g.: the following constructs a 2d array of size 1024x16:: + + wp.zeros(shape=(1024, 16), dtype=float, device="cuda") + +When passing multi-dimensional arrays to kernels users must specify the expected array dimension inside the kernel signature, +e.g. to pass a 2d array to a kernel the number of dims is specified using the ``ndim=2`` parameter:: + + @wp.kernel + def test(input: wp.array(dtype=float, ndim=2)): + +Type-hint helpers are provided for common array sizes, e.g.: ``array2d()``, ``array3d()``, which are equivalent to calling ``array(..., ndim=2)```, etc. To index a multi-dimensional array use a the following kernel syntax:: + + # returns a float from the 2d array + value = input[i,j] + +To create an array slice use the following syntax, where the number of indices is less than the array dimensions:: + + # returns an 1d array slice representing a row of the 2d array + row = input[i] + +Slice operators can be concatenated, e.g.: ``s = array[i][j][k]``. Slices can be passed to ``wp.func`` user functions provided +the function also declares the expected array dimension. Currently only single-index slicing is supported. + +.. note:: + Currently Warp limits arrays to 4 dimensions maximum. This is in addition to the contained datatype, which may be 1-2 dimensional for vector and matrix types such as ``vec3``, and ``mat33``. + + +The following construction methods are provided for allocating zero-initialized and empty (non-initialized) arrays: + +.. autofunction:: zeros +.. autofunction:: zeros_like +.. autofunction:: full +.. autofunction:: full_like +.. autofunction:: empty +.. autofunction:: empty_like +.. autofunction:: copy +.. autofunction:: clone + +Matrix Multiplication +##################### + +Warp 2D array multiplication is built on NVIDIA's `CUTLASS `_ library, +which enables fast matrix multiplication of large arrays on the GPU. + +If no GPU is detected, matrix multiplication falls back to Numpy's implementation on the CPU. + +Matrix multiplication is fully differentiable, and can be recorded on the tape like so:: + + tape = wp.Tape() + with tape: + wp.matmul(A, B, C, D, device=device) + wp.launch(loss_kernel, dim=(m, n), inputs=[D, loss], device=device) + + tape.backward(loss=loss) + A_grad = A.grad.numpy() + +Using the ``@`` operator (``D = A @ B``) will default to the same CUTLASS algorithm used in ``wp.matmul``. + +.. autofunction:: matmul + +Data Types +---------- + +Scalar Types +############ + +The following scalar storage types are supported for array structures: + ++---------+------------------------+ +| bool | boolean | ++---------+------------------------+ +| int8 | signed byte | ++---------+------------------------+ +| uint8 | unsigned byte | ++---------+------------------------+ +| int16 | signed short | ++---------+------------------------+ +| uint16 | unsigned short | ++---------+------------------------+ +| int32 | signed integer | ++---------+------------------------+ +| uint32 | unsigned integer | ++---------+------------------------+ +| int64 | signed long integer | ++---------+------------------------+ +| uint64 | unsigned long integer | ++---------+------------------------+ +| float16 | half-precision float | ++---------+------------------------+ +| float32 | single-precision float | ++---------+------------------------+ +| float64 | double-precision float | ++---------+------------------------+ + +Warp supports ``float`` and ``int`` as aliases for ``wp.float32`` and ``wp.int32`` respectively. + +.. _vec: + +Vectors +####### + +Warp provides built-in math and geometry types for common simulation and graphics problems. +A full reference for operators and functions for these types is available in the :doc:`/modules/functions`. + +Warp supports vectors of numbers with an arbitrary length/numeric type. The built-in concrete types are as follows: + ++-----------------------+------------------------------------------------+ +| vec2 vec3 vec4 | 2D, 3D, 4D vector of single-precision floats | ++-----------------------+------------------------------------------------+ +| vec2b vec3b vec4b | 2D, 3D, 4D vector of signed bytes | ++-----------------------+------------------------------------------------+ +| vec2ub vec3ub vec4ub | 2D, 3D, 4D vector of unsigned bytes | ++-----------------------+------------------------------------------------+ +| vec2s vec3s vec4s | 2D, 3D, 4D vector of signed shorts | ++-----------------------+------------------------------------------------+ +| vec2us vec3us vec4us | 2D, 3D, 4D vector of unsigned shorts | ++-----------------------+------------------------------------------------+ +| vec2i vec3i vec4i | 2D, 3D, 4D vector of signed integers | ++-----------------------+------------------------------------------------+ +| vec2ui vec3ui vec4ui | 2D, 3D, 4D vector of unsigned integers | ++-----------------------+------------------------------------------------+ +| vec2l vec3l vec4l | 2D, 3D, 4D vector of signed long integers | ++-----------------------+------------------------------------------------+ +| vec2ul vec3ul vec4ul | 2D, 3D, 4D vector of unsigned long integers | ++-----------------------+------------------------------------------------+ +| vec2h vec3h vec4h | 2D, 3D, 4D vector of half-precision floats | ++-----------------------+------------------------------------------------+ +| vec2f vec3f vec4f | 2D, 3D, 4D vector of single-precision floats | ++-----------------------+------------------------------------------------+ +| vec2d vec3d vec4d | 2D, 3D, 4D vector of double-precision floats | ++-----------------------+------------------------------------------------+ +| spatial_vector | 6D vector of single-precision floats | ++-----------------------+------------------------------------------------+ +| spatial_vectorf | 6D vector of single-precision floats | ++-----------------------+------------------------------------------------+ +| spatial_vectord | 6D vector of double-precision floats | ++-----------------------+------------------------------------------------+ +| spatial_vectorh | 6D vector of half-precision floats | ++-----------------------+------------------------------------------------+ + +Vectors support most standard linear algebra operations, e.g.: :: + + @wp.kernel + def compute( ... ): + + # basis vectors + a = wp.vec3(1.0, 0.0, 0.0) + b = wp.vec3(0.0, 1.0, 0.0) + + # take the cross product + c = wp.cross(a, b) + + # compute + r = wp.dot(c, c) + + ... + + +It's possible to declare additional vector types with different lengths and data types. This is done in outside of kernels in *Python scope* using ``warp.types.vector()``, for example: :: + + # declare a new vector type for holding 5 double precision floats: + vec5d = wp.types.vector(length=5, dtype=wp.float64) + +Once declared, the new type can be used when allocating arrays or inside kernels: :: + + # create an array of vec5d + arr = wp.zeros(10, dtype=vec5d) + + # use inside a kernel + @wp.kernel + def compute( ... ): + + # zero initialize a custom named vector type + v = vec5d() + ... + + # component-wise initialize a named vector type + v = vec5d(wp.float64(1.0), + wp.float64(2.0), + wp.float64(3.0), + wp.float64(4.0), + wp.float64(5.0)) + ... + +In addition, it's possible to directly create *anonymously* typed instances of these vectors without declaring their type in advance. In this case the type will be inferred by the constructor arguments. For example: :: + + @wp.kernel + def compute( ... ): + + # zero initialize vector of 5 doubles: + v = wp.vector(dtype=wp.float64, length=5) + + # scalar initialize a vector of 5 doubles to the same value: + v = wp.vector(wp.float64(1.0), length=5) + + # component-wise initialize a vector of 5 doubles + v = wp.vector(wp.float64(1.0), + wp.float64(2.0), + wp.float64(3.0), + wp.float64(4.0), + wp.float64(5.0)) + + +These can be used with all the standard vector arithmetic operators, e.g.: ``+``, ``-``, scalar multiplication, and can also be transformed using matrices with compatible dimensions, potentially returning vectors with a different length. + +.. _mat: + +Matrices +######## + +Matrices with arbitrary shapes/numeric types are also supported. The built-in concrete matrix types are as follows: + ++--------------------------+-------------------------------------------------+ +| mat22 mat33 mat44 | 2x2, 3x3, 4x4 matrix of single-precision floats | ++--------------------------+-------------------------------------------------+ +| mat22f mat33f mat44f | 2x2, 3x3, 4x4 matrix of single-precision floats | ++--------------------------+-------------------------------------------------+ +| mat22d mat33d mat44d | 2x2, 3x3, 4x4 matrix of double-precision floats | ++--------------------------+-------------------------------------------------+ +| mat22h mat33h mat44h | 2x2, 3x3, 4x4 matrix of half-precision floats | ++--------------------------+-------------------------------------------------+ +| spatial_matrix | 6x6 matrix of single-precision floats | ++--------------------------+-------------------------------------------------+ +| spatial_matrixf | 6x6 matrix of single-precision floats | ++--------------------------+-------------------------------------------------+ +| spatial_matrixd | 6x6 matrix of double-precision floats | ++--------------------------+-------------------------------------------------+ +| spatial_matrixh | 6x6 matrix of half-precision floats | ++--------------------------+-------------------------------------------------+ + +Matrices are stored in row-major format and support most standard linear algebra operations: :: + + @wp.kernel + def compute( ... ): + + # initialize matrix + m = wp.mat22(1.0, 2.0, + 3.0, 4.0) + + # compute inverse + minv = wp.inverse(m) + + # transform vector + v = minv * wp.vec2(0.5, 0.3) + + ... + + +In a similar manner to vectors, it's possible to declare new matrix types with arbitrary shapes and data types using ``wp.types.matrix()``, for example: :: + + # declare a new 3x2 half precision float matrix type: + mat32h = wp.types.matrix(shape=(3,2), dtype=wp.float64) + + # create an array of this type + a = wp.zeros(10, dtype=mat32h) + +These can be used inside a kernel:: + + @wp.kernel + def compute( ... ): + ... + + # initialize a mat32h matrix + m = mat32h(wp.float16(1.0), wp.float16(2.0), + wp.float16(3.0), wp.float16(4.0), + wp.float16(5.0), wp.float16(6.0)) + + # declare a 2 component half precision vector + v2 = wp.vec2h(wp.float16(1.0), wp.float16(1.0)) + + # multiply by the matrix, returning a 3 component vector: + v3 = m * v2 + ... + +It's also possible to directly create anonymously typed instances inside kernels where the type is inferred from constructor arguments as follows:: + + @wp.kernel + def compute( ... ): + ... + + # create a 3x2 half precision matrix from components (row major ordering): + m = wp.matrix( + wp.float16(1.0), wp.float16(2.0), + wp.float16(1.0), wp.float16(2.0), + wp.float16(1.0), wp.float16(2.0), + shape=(3,2)) + + # zero initialize a 3x2 half precision matrix: + m = wp.matrix(wp.float16(0.0),shape=(3,2)) + + # create a 5x5 double precision identity matrix: + m = wp.identity(n=5, dtype=wp.float64) + +As with vectors, you can do standard matrix arithmetic with these variables, along with multiplying matrices with compatible shapes and potentially returning a matrix with a new shape. + +.. _quat: + +Quaternions +########### + +Warp supports quaternions with the layout ``i, j, k, w`` where ``w`` is the real part. Here are the built-in concrete quaternion types: + ++-----------------+--------------------------------------------+ +| quat | Single-precision floating point quaternion | ++-----------------+--------------------------------------------+ +| quatf | Single-precision floating point quaternion | ++-----------------+--------------------------------------------+ +| quatd | Double-precision floating point quaternion | ++-----------------+--------------------------------------------+ +| quath | Half-precision floating point quaternion | ++-----------------+--------------------------------------------+ + +Quaternions can be used to transform vectors as follows:: + + @wp.kernel + def compute( ... ): + ... + + # construct a 30 degree rotation around the x-axis + q = wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), wp.degrees(30.0)) + + # rotate an axis by this quaternion + v = wp.quat_rotate(q, wp.vec3(0.0, 1.0, 0.0)) + + +As with vectors and matrices, you can declare quaternion types with an arbitrary numeric type like so:: + + quatd = wp.types.quaternion(dtype=wp.float64) + +You can also create identity quaternion and anonymously typed instances inside a kernel like so:: + + @wp.kernel + def compute( ... ): + ... + + # create a double precision identity quaternion: + qd = wp.quat_identity(dtype=wp.float64) + + # precision defaults to wp.float32 so this creates a single precision identity quaternion: + qf = wp.quat_identity() + + # create a half precision quaternion from components, or a vector/scalar: + qh = wp.quaternion(wp.float16(0.0), + wp.float16(0.0), + wp.float16(0.0), + wp.float16(1.0)) + + + qh = wp.quaternion( + wp.vector(wp.float16(0.0),wp.float16(0.0),wp.float16(0.0)), + wp.float16(1.0)) + +.. _transform: + +Transforms +########## + +Transforms are 7D vectors of floats representing a spatial rigid body transformation in format (p, q) where p is a 3D vector, and q is a quaternion. + ++-----------------+--------------------------------------------+ +| transform | Single-precision floating point transform | ++-----------------+--------------------------------------------+ +| transformf | Single-precision floating point transform | ++-----------------+--------------------------------------------+ +| transformd | Double-precision floating point transform | ++-----------------+--------------------------------------------+ +| transformh | Half-precision floating point transform | ++-----------------+--------------------------------------------+ + +Transforms can be constructed inside kernels from translation and rotation parts:: + + @wp.kernel + def compute( ... ): + ... + + # create a transform from a vector/quaternion: + t = wp.transform( + wp.vec3(1.0, 2.0, 3.0), + wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), wp.degrees(30.0))) + + # transform a point + p = wp.transform_point(t, wp.vec3(10.0, 0.5, 1.0)) + + # transform a vector (ignore translation) + p = wp.transform_vector(t, wp.vec3(10.0, 0.5, 1.0)) + + +As with vectors and matrices, you can declare transform types with an arbitrary numeric type using ``wp.types.transformation()``, for example:: + + transformd = wp.types.transformation(dtype=wp.float64) + +You can also create identity transforms and anonymously typed instances inside a kernel like so:: + + @wp.kernel + def compute( ... ): + + # create double precision identity transform: + qd = wp.transform_identity(dtype=wp.float64) + +Structs +####### + +Users can define custom structure types using the ``@wp.struct`` decorator as follows:: + + @wp.struct + class MyStruct: + + param1: int + param2: float + param3: wp.array(dtype=wp.vec3) + +Struct attributes must be annotated with their respective type. They can be constructed in Python scope and then passed to kernels as arguments:: + + @wp.kernel + def compute(args: MyStruct): + + tid = wp.tid() + + print(args.param1) + print(args.param2) + print(args.param3[tid]) + + # construct an instance of the struct in Python + s = MyStruct() + s.param1 = 10 + s.param2 = 2.5 + s.param3 = wp.zeros(shape=10, dtype=wp.vec3) + + # pass to our compute kernel + wp.launch(compute, dim=10, inputs=[s]) + +An array of structs can be zero-initialized as follows:: + + a = wp.zeros(shape=10, dtype=MyStruct) + +An array of structs can also be initialized from a list of struct objects:: + + a = wp.array([MyStruct(), MyStruct(), MyStruct()], dtype=MyStruct) + +Example: Using a custom struct in gradient computation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: python + + import numpy as np + + import warp as wp + + wp.init() + + + @wp.struct + class TestStruct: + x: wp.vec3 + a: wp.array(dtype=wp.vec3) + b: wp.array(dtype=wp.vec3) + + + @wp.kernel + def test_kernel(s: TestStruct): + tid = wp.tid() + + s.b[tid] = s.a[tid] + s.x + + + @wp.kernel + def loss_kernel(s: TestStruct, loss: wp.array(dtype=float)): + tid = wp.tid() + + v = s.b[tid] + wp.atomic_add(loss, 0, float(tid + 1) * (v[0] + 2.0 * v[1] + 3.0 * v[2])) + + + # create struct + ts = TestStruct() + + # set members + ts.x = wp.vec3(1.0, 2.0, 3.0) + ts.a = wp.array(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), dtype=wp.vec3, requires_grad=True) + ts.b = wp.zeros(2, dtype=wp.vec3, requires_grad=True) + + loss = wp.zeros(1, dtype=float, requires_grad=True) + + tape = wp.Tape() + with tape: + wp.launch(test_kernel, dim=2, inputs=[ts]) + wp.launch(loss_kernel, dim=2, inputs=[ts, loss]) + + tape.backward(loss) + + print(loss) + print(tape.gradients[ts].a) + + +Type Conversions +################ + +Warp is particularly strict regarding type conversions and does not perform *any* implicit conversion between numeric types. +The user is responsible for ensuring types for most arithmetic operators match, e.g.: ``x = float(0.0) + int(4)`` will result in an error. +This can be surprising for users that are accustomed to C-style conversions but avoids a class of common bugs that result from implicit conversions. + +.. note:: + Warp does not currently perform implicit type conversions between numeric types. + Users should explicitly cast variables to compatible types using constructors like + ``int()``, ``float()``, ``wp.float16()``, ``wp.uint8()``, etc. + +Constants +--------- + +In general, Warp kernels cannot access variables in the global Python interpreter state. One exception to this is for compile-time constants, which may be declared globally (or as class attributes) and folded into the kernel definition. + +Constants are defined using the ``wp.constant()`` function. An example is shown below:: + + TYPE_SPHERE = wp.constant(0) + TYPE_CUBE = wp.constant(1) + TYPE_CAPSULE = wp.constant(2) + + @wp.kernel + def collide(geometry: wp.array(dtype=int)): + + t = geometry[wp.tid()] + + if (t == TYPE_SPHERE): + print("sphere") + if (t == TYPE_CUBE): + print("cube") + if (t == TYPE_CAPSULE): + print("capsule") + + +.. autoclass:: constant + + +Operators +---------- + +Boolean Operators +################# + ++--------------+--------------------------------------+ +| a and b | True if a and b are True | ++--------------+--------------------------------------+ +| a or b | True if a or b is True | ++--------------+--------------------------------------+ +| not a | True if a is False, otherwise False | ++--------------+--------------------------------------+ + +.. note:: + Expressions such as ``if (a and b):`` currently do not perform short-circuit evaluation. + In this case ``b`` will also be evaluated even when ``a`` is ``False``. + Users should take care to ensure that secondary conditions are safe to evaluate (e.g.: do not index out of bounds) in all cases. + + +Comparison Operators +#################### + ++----------+---------------------------------------+ +| a > b | True if a strictly greater than b | ++----------+---------------------------------------+ +| a < b | True if a strictly less than b | ++----------+---------------------------------------+ +| a >= b | True if a greater than or equal to b | ++----------+---------------------------------------+ +| a <= b | True if a less than or equal to b | ++----------+---------------------------------------+ +| a == b | True if a equals b | ++----------+---------------------------------------+ +| a != b | True if a not equal to b | ++----------+---------------------------------------+ + +Arithmetic Operators +#################### + ++-----------+--------------------------+ +| a + b | Addition | ++-----------+--------------------------+ +| a - b | Subtraction | ++-----------+--------------------------+ +| a * b | Multiplication | ++-----------+--------------------------+ +| a / b | Floating point division | ++-----------+--------------------------+ +| a // b | Floored division | ++-----------+--------------------------+ +| a ** b | Exponentiation | ++-----------+--------------------------+ +| a % b | Modulus | ++-----------+--------------------------+ + +.. note:: + Since implicit conversions are not performed arguments types to operators should match. + Users should use type constructors, e.g.: ``float()``, ``int()``, ``wp.int64()``, etc. to cast variables + to the correct type. Also note that the multiplication expression ``a * b`` is used to represent scalar + multiplication and matrix multiplication. The ``@`` operator is not currently supported. + +Graphs +----------- + +Launching kernels from Python introduces significant additional overhead compared to C++ or native programs. +To address this, Warp exposes the concept of `CUDA graphs `_ +to allow recording large batches of kernels and replaying them with very little CPU overhead. + +To record a series of kernel launches use the :func:`wp.capture_begin() ` and +:func:`wp.capture_end() ` API as follows: + +.. code:: python + + # begin capture + wp.capture_begin() + + try: + # record launches + for i in range(100): + wp.launch(kernel=compute1, inputs=[a, b], device="cuda") + finally: + # end capture and return a graph object + graph = wp.capture_end() + +We strongly recommend the use of the the try-finally pattern when capturing graphs because the `finally` +statement will ensure :func:`wp.capture_end ` gets called, even if an exception occurs during +capture, which would otherwise trap the stream in a capturing state. + +Once a graph has been constructed it can be executed: :: + + wp.capture_launch(graph) + +Note that only launch calls are recorded in the graph, any Python executed outside of the kernel code will not be recorded. +Typically it is only beneficial to use CUDA graphs when the graph will be reused or launched multiple times. + +.. autofunction:: capture_begin +.. autofunction:: capture_end +.. autofunction:: capture_launch + +Bounding Value Hierarchies (BVH) +-------------------------------- + +The :class:`wp.Bvh ` class can be used to create a BVH for a group of bounding volumes. This object can then be traversed +to determine which parts are intersected by a ray using :func:`bvh_query_ray` and which parts are fully contained +within a certain bounding volume using :func:`bvh_query_aabb`. + +The following snippet demonstrates how to create a :class:`wp.Bvh ` object from 100 random bounding volumes: + +.. code:: python + + rng = np.random.default_rng(123) + + num_bounds = 100 + lowers = rng.random(size=(num_bounds, 3)) * 5.0 + uppers = lowers + rng.random(size=(num_bounds, 3)) * 5.0 + + device_lowers = wp.array(lowers, dtype=wp.vec3, device="cuda:0") + device_uppers = wp.array(uppers, dtype=wp.vec3, device="cuda:0") + + bvh = wp.Bvh(device_lowers, device_uppers) + +.. autoclass:: Bvh + :members: + +Example: BVH Ray Traversal +########################## + +An example of performing a ray traversal on the data structure is as follows: + +.. code:: python + + @wp.kernel + def bvh_query_ray( + bvh_id: wp.uint64, + start: wp.vec3, + dir: wp.vec3, + bounds_intersected: wp.array(dtype=wp.bool), + ): + query = wp.bvh_query_ray(bvh_id, start, dir) + bounds_nr = wp.int32(0) + + while wp.bvh_query_next(query, bounds_nr): + # The ray intersects the volume with index bounds_nr + bounds_intersected[bounds_nr] = True + + + bounds_intersected = wp.zeros(shape=(num_bounds), dtype=wp.bool, device="cuda:0") + query_start = wp.vec3(0.0, 0.0, 0.0) + query_dir = wp.normalize(wp.vec3(1.0, 1.0, 1.0)) + + wp.launch( + kernel=bvh_query_ray, + dim=1, + inputs=[bvh.id, query_start, query_dir, bounds_intersected], + device="cuda:0", + ) + +The Warp kernel ``bvh_query_ray`` is launched with a single thread, provided the unique :class:`uint64` +identifier of the :class:`wp.Bvh ` object, parameters describing the ray, and an array to store the results. +In ``bvh_query_ray``, :func:`wp.bvh_query_ray() ` is called once to obtain an object that is stored in the +variable ``query``. An integer is also allocated as ``bounds_nr`` to store the volume index of the traversal. +A while statement is used for the actual traversal using :func:`wp.bvh_query_next() `, +which returns ``True`` as long as there are intersecting bounds. + +Example: BVH Volume Traversal +############################# + +Similar to the ray-traversal example, we can perform volume traversal to find the volumes that are fully contained +within a specified bounding box. + +.. code:: python + + @wp.kernel + def bvh_query_aabb( + bvh_id: wp.uint64, + lower: wp.vec3, + upper: wp.vec3, + bounds_intersected: wp.array(dtype=wp.bool), + ): + query = wp.bvh_query_aabb(bvh_id, lower, upper) + bounds_nr = wp.int32(0) + + while wp.bvh_query_next(query, bounds_nr): + # The volume with index bounds_nr is fully contained + # in the (lower,upper) bounding box + bounds_intersected[bounds_nr] = True + + + bounds_intersected = wp.zeros(shape=(num_bounds), dtype=wp.bool, device="cuda:0") + query_lower = wp.vec3(4.0, 4.0, 4.0) + query_upper = wp.vec3(6.0, 6.0, 6.0) + + wp.launch( + kernel=bvh_query_aabb, + dim=1, + inputs=[bvh.id, query_lower, query_upper, bounds_intersected], + device="cuda:0", + ) + +The kernel is nearly identical to the ray-traversal example, except we obtain ``query`` using +:func:`wp.bvh_query_aabb() `. + +Meshes +------ + +Warp provides a ``wp.Mesh`` class to manage triangle mesh data. To create a mesh users provide a points, indices and optionally a velocity array:: + + mesh = wp.Mesh(points, indices, velocities) + +.. note:: + Mesh objects maintain references to their input geometry buffers. All buffers should live on the same device. + +Meshes can be passed to kernels using their ``id`` attribute which uniquely identifies the mesh by a unique ``uint64`` value. +Once inside a kernel you can perform geometric queries against the mesh such as ray-casts or closest point lookups:: + + @wp.kernel + def raycast(mesh: wp.uint64, + ray_origin: wp.array(dtype=wp.vec3), + ray_dir: wp.array(dtype=wp.vec3), + ray_hit: wp.array(dtype=wp.vec3)): + + tid = wp.tid() + + t = float(0.0) # hit distance along ray + u = float(0.0) # hit face barycentric u + v = float(0.0) # hit face barycentric v + sign = float(0.0) # hit face sign + n = wp.vec3() # hit face normal + f = int(0) # hit face index + + color = wp.vec3() + + # ray cast against the mesh + if wp.mesh_query_ray(mesh, ray_origin[tid], ray_dir[tid], 1.e+6, t, u, v, sign, n, f): + + # if we got a hit then set color to the face normal + color = n*0.5 + wp.vec3(0.5, 0.5, 0.5) + + ray_hit[tid] = color + + +Users may update mesh vertex positions at runtime simply by modifying the points buffer. +After modifying point locations users should call ``Mesh.refit()`` to rebuild the bounding volume hierarchy (BVH) structure and ensure that queries work correctly. + +.. note:: + Updating Mesh topology (indices) at runtime is not currently supported. Users should instead recreate a new Mesh object. + +.. autoclass:: Mesh + :members: + +Hash Grids +---------- + +Many particle-based simulation methods such as the Discrete Element Method (DEM), or Smoothed Particle Hydrodynamics (SPH), involve iterating over spatial neighbors to compute force interactions. Hash grids are a well-established data structure to accelerate these nearest neighbor queries, and particularly well-suited to the GPU. + +To support spatial neighbor queries Warp provides a ``HashGrid`` object that may be created as follows:: + + grid = wp.HashGrid(dim_x=128, dim_y=128, dim_z=128, device="cuda") + + grid.build(points=p, radius=r) + +``p`` is an array of ``wp.vec3`` point positions, and ``r`` is the radius to use when building the grid. +Neighbors can then be iterated over inside the kernel code using :func:`wp.hash_grid_query() ` +and :func:`wp.hash_grid_query_next() ` as follows: + +.. code:: python + + @wp.kernel + def sum(grid : wp.uint64, + points: wp.array(dtype=wp.vec3), + output: wp.array(dtype=wp.vec3), + radius: float): + + tid = wp.tid() + + # query point + p = points[tid] + + # create grid query around point + query = wp.hash_grid_query(grid, p, radius) + index = int(0) + + sum = wp.vec3() + + while(wp.hash_grid_query_next(query, index)): + + neighbor = points[index] + + # compute distance to neighbor point + dist = wp.length(p-neighbor) + if (dist <= radius): + sum += neighbor + + output[tid] = sum + +.. note:: + The ``HashGrid`` query will give back all points in *cells* that fall inside the query radius. + When there are hash conflicts it means that some points outside of query radius will be returned, and users should + check the distance themselves inside their kernels. The reason the query doesn't do the check itself for each + returned point is because it's common for kernels to compute the distance themselves, so it would redundant to + check/compute the distance twice. + + +.. autoclass:: HashGrid + :members: + +Volumes +------- + +Sparse volumes are incredibly useful for representing grid data over large domains, such as signed distance fields +(SDFs) for complex objects, or velocities for large-scale fluid flow. Warp supports reading sparse volumetric grids +stored using the `NanoVDB `_ standard. Users can access voxels directly +or use built-in closest-point or trilinear interpolation to sample grid data from world or local space. + +Volume objects can be created directly from Warp arrays containing a NanoVDB grid, from the contents of a +standard ``.nvdb`` file using :func:`load_from_nvdb() `, +or from a dense 3D NumPy array using :func:`load_from_numpy() `. + +Volumes can also be created using :func:`allocate() ` or +:func:`allocate_by_tiles() `. The values for a Volume object can be modified in a Warp +kernel using :func:`wp.volume_store_f() `, :func:`wp.volume_store_v() `, and +:func:`wp.volume_store_i() `. + +.. note:: + Warp does not currently support modifying the topology of sparse volumes at runtime. + +Below we give an example of creating a Volume object from an existing NanoVDB file:: + + # open NanoVDB file on disk + file = open("mygrid.nvdb", "rb") + + # create Volume object + volume = wp.Volume.load_from_nvdb(file, device="cpu") + +.. note:: + Files written by the NanoVDB library, commonly marked by the ``.nvdb`` extension, can contain multiple grids with + various compression methods, but a :class:`Volume` object represents a single NanoVDB grid therefore only files with + a single grid are supported. NanoVDB's uncompressed and zip-compressed file formats are supported. + +To sample the volume inside a kernel we pass a reference to it by ID, and use the built-in sampling modes:: + + @wp.kernel + def sample_grid(volume: wp.uint64, + points: wp.array(dtype=wp.vec3), + samples: wp.array(dtype=float)): + + tid = wp.tid() + + # load sample point in world-space + p = points[tid] + + # transform position to the volume's local-space + q = wp.volume_world_to_index(volume, p) + + # sample volume with trilinear interpolation + f = wp.volume_sample_f(volume, q, wp.Volume.LINEAR) + + # write result + samples[tid] = f + +.. autoclass:: Volume + :members: + :undoc-members: + +.. seealso:: `Reference `__ for the volume functions available in kernels. + +Differentiability +----------------- + +By default, Warp generates a forward and backward (adjoint) version of each kernel definition. +Buffers that participate in the chain of computation should be created with ``requires_grad=True``, for example:: + + a = wp.zeros(1024, dtype=wp.vec3, device="cuda", requires_grad=True) + +The ``wp.Tape`` class can then be used to record kernel launches, and replay them to compute the gradient of a scalar loss function with respect to the kernel inputs:: + + tape = wp.Tape() + + # forward pass + with tape: + wp.launch(kernel=compute1, inputs=[a, b], device="cuda") + wp.launch(kernel=compute2, inputs=[c, d], device="cuda") + wp.launch(kernel=loss, inputs=[d, l], device="cuda") + + # reverse pass + tape.backward(l) + +After the backward pass has completed, the gradients with respect to the inputs are available via a mapping in the :class:`wp.Tape ` object:: + + # gradient of loss with respect to input a + print(tape.gradients[a]) + +Note that gradients are accumulated on the participating buffers, so if you wish to reuse the same buffers for multiple backward passes you should first zero the gradients:: + + tape.zero() + +.. note:: + + Warp uses a source-code transformation approach to auto-differentiation. + In this approach, the backwards pass must keep a record of intermediate values computed during the forward pass. + This imposes some restrictions on what kernels can do and still be differentiable: + + * Dynamic loops should not mutate any previously declared local variable. This means the loop must be side-effect free. + A simple way to ensure this is to move the loop body into a separate function. + Static loops that are unrolled at compile time do not have this restriction and can perform any computation. + + * Kernels should not overwrite any previously used array values except to perform simple linear add/subtract operations (e.g. via :func:`wp.atomic_add() `) + +.. autoclass:: Tape + :members: + +Jacobians +######### + +To compute the Jacobian matrix :math:`J\in\mathbb{R}^{m\times n}` of a multi-valued function :math:`f: \mathbb{R}^n \to \mathbb{R}^m`, we can evaluate an entire row of the Jacobian in parallel by finding the Jacobian-vector product :math:`J^\top \mathbf{e}`. The vector :math:`\mathbf{e}\in\mathbb{R}^m` selects the indices in the output buffer to differentiate with respect to. +In Warp, instead of passing a scalar loss buffer to the ``tape.backward()`` method, we pass a dictionary ``grads`` mapping from the function output array to the selection vector :math:`\mathbf{e}` having the same type:: + + # compute the Jacobian for a function of single output + jacobian = np.empty((output_dim, input_dim), dtype=np.float32) + tape = wp.Tape() + with tape: + output_buffer = launch_kernels_to_be_differentiated(input_buffer) + for output_index in range(output_dim): + # select which row of the Jacobian we want to compute + select_index = np.zeros(output_dim) + select_index[output_index] = 1.0 + e = wp.array(select_index, dtype=wp.float32) + # pass input gradients to the output buffer to apply selection + tape.backward(grads={output_buffer: e}) + q_grad_i = tape.gradients[input_buffer] + jacobian[output_index, :] = q_grad_i.numpy() + tape.zero() + +When we run simulations independently in parallel, the Jacobian corresponding to the entire system dynamics is a block-diagonal matrix. In this case, we can compute the Jacobian in parallel for all environments by choosing a selection vector that has the output indices active for all environment copies. For example, to get the first rows of the Jacobians of all environments, :math:`\mathbf{e}=[\begin{smallmatrix}1 & 0 & 0 & \dots & 1 & 0 & 0 & \dots\end{smallmatrix}]^\top`, to compute the second rows, :math:`\mathbf{e}=[\begin{smallmatrix}0 & 1 & 0 & \dots & 0 & 1 & 0 & \dots\end{smallmatrix}]^\top`, etc.:: + + # compute the Jacobian for a function over multiple environments in parallel + jacobians = np.empty((num_envs, output_dim, input_dim), dtype=np.float32) + tape = wp.Tape() + with tape: + output_buffer = launch_kernels_to_be_differentiated(input_buffer) + for output_index in range(output_dim): + # select which row of the Jacobian we want to compute + select_index = np.zeros(output_dim) + select_index[output_index] = 1.0 + # assemble selection vector for all environments (can be precomputed) + e = wp.array(np.tile(select_index, num_envs), dtype=wp.float32) + tape.backward(grads={output_buffer: e}) + q_grad_i = tape.gradients[input_buffer] + jacobians[:, output_index, :] = q_grad_i.numpy().reshape(num_envs, input_dim) + tape.zero() + + +Custom Gradient Functions +######################### + +Warp supports custom gradient function definitions for user-defined Warp functions. +This allows users to define code that should replace the automatically generated derivatives. + +To differentiate a function :math:`h(x) = f(g(x))` that has a nested call to function :math:`g(x)`, the chain rule is evaluated in the automatic differentiation of :math:`h(x)`: + +.. math:: + + h^\prime(x) = f^\prime({\color{green}{\underset{\textrm{replay}}{g(x)}}}) {\color{blue}{\underset{\textrm{grad}}{g^\prime(x)}}} + +This implies that a function to be compatible with the autodiff engine needs to provide an implementation of its forward version +:math:`\color{green}{g(x)}`, which we refer to as "replay" function (that matches the original function definition by default), +and its derivative :math:`\color{blue}{g^\prime(x)}`, referred to as "grad". + +Both the replay and the grad implementations can be customized by the user. They are defined as follows: + +.. list-table:: Customizing the replay and grad versions of function ``myfunc`` + :widths: 100 + :header-rows: 0 + + * - Forward Function + * - .. code-block:: python + + @wp.func + def myfunc(in1: InType1, ..., inN: InTypeN) -> OutType1, ..., OutTypeM: + return out1, ..., outM + + * - Custom Replay Function + * - .. code-block:: python + + @wp.func_replay(myfunc) + def replay_myfunc(in1: InType1, ..., inN: InTypeN) -> OutType1, ..., OutTypeM: + # Custom forward computations to be executed in the backward pass of a + # function calling `myfunc` go here + # Ensure the output variables match the original forward definition + return out1, ..., outM + + * - Custom Grad Function + * - .. code-block:: python + + @wp.func_grad(myfunc) + def adj_myfunc(in1: InType1, ..., inN: InTypeN, adj_out1: OutType1, ..., adj_outM: OutTypeM): + # Custom adjoint code goes here + # Update the partial derivatives for the inputs as follows: + wp.adjoint[in1] += ... + ... + wp.adjoint[inN] += ... + +.. note:: It is currently not possible to define custom replay or grad functions for functions that + have generic arguments, e.g. ``Any`` or ``wp.array(dtype=Any)``. Replay or grad functions that + themselves use generic arguments are also not yet supported. + +Example 1: Custom Grad Function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the following, we define a Warp function ``safe_sqrt`` that computes the square root of a number:: + + @wp.func + def safe_sqrt(x: float): + return wp.sqrt(x) + +To evaluate this function, we define a kernel that applies ``safe_sqrt`` to an array of input values:: + + @wp.kernel + def run_safe_sqrt(xs: wp.array(dtype=float), output: wp.array(dtype=float)): + i = wp.tid() + output[i] = safe_sqrt(xs[i]) + +Calling the kernel for an array of values ``[1.0, 2.0, 0.0]`` yields the expected outputs, the gradients are finite except for the zero input:: + + xs = wp.array([1.0, 2.0, 0.0], dtype=wp.float32, requires_grad=True) + ys = wp.zeros_like(xs) + tape = wp.Tape() + with tape: + wp.launch(run_safe_sqrt, dim=len(xs), inputs=[xs], outputs=[ys]) + tape.backward(grads={ys: wp.array(np.ones(len(xs)), dtype=wp.float32)}) + print("ys ", ys) + print("xs.grad", xs.grad) + + # ys [1. 1.4142135 0. ] + # xs.grad [0.5 0.35355338 inf] + +It is often desired to catch nonfinite gradients in the computation graph as they may cause the entire gradient computation to be nonfinite. +To do so, we can define a custom gradient function that replaces the adjoint function for ``safe_sqrt`` which is automatically generated by +decorating the custom gradient code via ``@wp.func_grad(safe_sqrt)``:: + + @wp.func_grad(safe_sqrt) + def adj_safe_sqrt(x: float, adj_ret: float): + if x > 0.0: + wp.adjoint[x] += 1.0 / (2.0 * wp.sqrt(x)) * adj_ret + +.. note:: The function signature of the custom grad code consists of the input arguments of the forward function plus the adjoint variables of the + forward function outputs. To access and modify the partial derivatives of the input arguments, we use the ``wp.adjoint`` dictionary. + The keys of this dictionary are the input arguments of the forward function, and the values are the partial derivatives of the forward function + output with respect to the input argument. + + +Example 2: Custom Replay Function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the following, we increment an array index in each thread via :func:`wp.atomic_add() ` and compute +the square root of an input array at the incremented index:: + + @wp.kernel + def test_add(counter: wp.array(dtype=int), input: wp.array(dtype=float), output: wp.array(dtype=float)): + idx = wp.atomic_add(counter, 0, 1) + output[idx] = wp.sqrt(input[idx]) + + def main(): + dim = 16 + use_reversible_increment = False + input = wp.array(np.arange(1, dim + 1), dtype=wp.float32, requires_grad=True) + counter = wp.zeros(1, dtype=wp.int32) + thread_ids = wp.zeros(dim, dtype=wp.int32) + output = wp.zeros(dim, dtype=wp.float32, requires_grad=True) + tape = wp.Tape() + with tape: + if use_reversible_increment: + wp.launch(test_add_diff, dim, inputs=[counter, thread_ids, input], outputs=[output]) + else: + wp.launch(test_add, dim, inputs=[counter, input], outputs=[output]) + + print("counter: ", counter.numpy()) + print("thread_ids: ", thread_ids.numpy()) + print("input: ", input.numpy()) + print("output: ", output.numpy()) + + tape.backward(grads={ + output: wp.array(np.ones(dim), dtype=wp.float32) + }) + print("input.grad: ", input.grad.numpy()) + + if __name__ == "__main__": + main() + +The output of the above code is: + +.. code-block:: js + + counter: [8] + thread_ids: [0 0 0 0 0 0 0 0] + input: [1. 2. 3. 4. 5. 6. 7. 8.] + output: [1. 1.4142135 1.7320508 2. 2.236068 2.4494898 2.6457512 2.828427] + input.grad: [4. 0. 0. 0. 0. 0. 0. 0.] + +The gradient of the input is incorrect because the backward pass involving the atomic operation ``wp.atomic_add()`` does not know which thread ID corresponds +to which input value. +The index returned by the adjoint of ``wp.atomic_add()`` is always zero so that the gradient the first entry of the input array, +i.e. :math:`\frac{1}{2\sqrt{1}} = 0.5`, is accumulated ``dim`` times (hence ``input.grad[0] == 4.0`` and all other entries zero). + +To fix this, we define a new Warp function ``reversible_increment()`` with a custom *replay* definition that stores the thread ID in a separate array:: + + @wp.func + def reversible_increment( + buf: wp.array(dtype=int), + buf_index: int, + value: int, + thread_values: wp.array(dtype=int), + tid: int + ): + next_index = wp.atomic_add(buf, buf_index, value) + # store which thread ID corresponds to which index for the backward pass + thread_values[tid] = next_index + return next_index + + + @wp.func_replay(reversible_increment) + def replay_reversible_increment( + buf: wp.array(dtype=int), + buf_index: int, + value: int, + thread_values: wp.array(dtype=int), + tid: int + ): + return thread_values[tid] + + +Instead of running ``reversible_increment()``, the custom replay code in ``replay_reversible_increment()`` is now executed +during forward phase in the backward pass of the function calling ``reversible_increment()``. +We first stored the array index to each thread ID in the forward pass, and now we retrieve the array index for each thread ID in the backward pass. +That way, the backward pass can reproduce the same addition operation as in the forward pass with exactly the same operands per thread. + +.. warning:: The function signature of the custom replay code must match the forward function signature. + +To use our function we write the following kernel:: + + @wp.kernel + def test_add_diff( + counter: wp.array(dtype=int), + thread_ids: wp.array(dtype=int), + input: wp.array(dtype=float), + output: wp.array(dtype=float) + ): + tid = wp.tid() + idx = reversible_increment(counter, 0, 1, thread_ids, tid) + output[idx] = wp.sqrt(input[idx]) + +Running the ``test_add_diff`` kernel via the previous ``main`` function with ``use_reversible_increment = True``, we now compute correct gradients +for the input array: + +.. code-block:: js + + counter: [8] + thread_ids: [0 1 2 3 4 5 6 7] + input: [1. 2. 3. 4. 5. 6. 7. 8.] + output: [1. 1.4142135 1.7320508 2. 2.236068 2.4494898 2.6457512 2.828427 ] + input.grad: [0.5 0.35355338 0.28867513 0.25 0.2236068 0.20412414 0.18898225 0.17677669] + +Custom Native Functions +----------------------- + +Users may insert native C++/CUDA code in Warp kernels using ``@func_native`` decorated functions. +These accept native code as strings that get compiled after code generation, and are called within ``@wp.kernel`` functions. +For example:: + + snippet = """ + __shared__ int s[128]; + + s[tid] = d[tid]; + __syncthreads(); + d[tid] = s[N - tid - 1]; + """ + + @wp.func_native(snippet) + def reverse(d: wp.array(dtype=int), N: int, tid: int): + ... + + @wp.kernel + def reverse_kernel(d: wp.array(dtype=int), N: int): + tid = wp.tid() + reverse(d, N, tid) + + N = 128 + x = wp.array(np.arange(N, dtype=int), dtype=int, device=device) + + wp.launch(kernel=reverse_kernel, dim=N, inputs=[x, N], device=device) + +Notice the use of shared memory here: the Warp library does not expose shared memory as a feature, but the CUDA compiler will +readily accept the above snippet. This means CUDA features not exposed in Warp are still accessible in Warp scripts. +Warp kernels meant for the CPU won't be able to leverage CUDA features of course, but this same mechanism supports pure C++ snippets as well. + +Please bear in mind the following: the thread index in your snippet should be computed in a ``@wp.kernel`` and passed to your snippet, +as in the above example. This means your ``@wp.func_native`` function signature should include the variables used in your snippet, +as well as a thread index of type ``int``. The function body itself should be stubbed with ``...`` (the snippet will be inserted during compilation). + +Should you wish to record your native function on the tape and then subsequently rewind the tape, you must include an adjoint snippet +alongside your snippet as an additional input to the decorator, as in the following example:: + + snippet = """ + out[tid] = a * x[tid] + y[tid]; + """ + adj_snippet = """ + adj_a = x[tid] * adj_out[tid]; + adj_x[tid] = a * adj_out[tid]; + adj_y[tid] = adj_out[tid]; + """ + + @wp.func_native(snippet, adj_snippet) + def saxpy( + a: wp.float32, + x: wp.array(dtype=wp.float32), + y: wp.array(dtype=wp.float32), + out: wp.array(dtype=wp.float32), + tid: int, + ): + ... + + @wp.kernel + def saxpy_kernel( + a: wp.float32, + x: wp.array(dtype=wp.float32), + y: wp.array(dtype=wp.float32), + out: wp.array(dtype=wp.float32) + ): + tid = wp.tid() + saxpy(a, x, y, out, tid) + + N = 128 + a = 2.0 + x = wp.array(np.arange(N, dtype=np.float32), dtype=wp.float32, device=device, requires_grad=True) + y = wp.zeros_like(x1) + out = wp.array(np.arange(N, dtype=np.float32), dtype=wp.float32, device=device) + adj_out = wp.array(np.ones(N, dtype=np.float32), dtype=wp.float32, device=device) + + tape = wp.Tape() + + with tape: + wp.launch(kernel=saxpy_kernel, dim=N, inputs=[a, x, y], outputs=[out], device=device) + + tape.backward(grads={out: adj_out}) + +You may also include a custom replay snippet, to be executed as part of the adjoint (see `Custom Gradient Functions`_ for a full explanation). +Consider the following example:: + + def test_custom_replay_grad(): + num_threads = 8 + counter = wp.zeros(1, dtype=wp.int32) + thread_values = wp.zeros(num_threads, dtype=wp.int32) + inputs = wp.array(np.arange(num_threads, dtype=np.float32), requires_grad=True) + outputs = wp.zeros_like(inputs) + + snippet = """ + int next_index = atomicAdd(counter, 1); + thread_values[tid] = next_index; + """ + replay_snippet = "" + + @wp.func_native(snippet, replay_snippet=replay_snippet) + def reversible_increment( + counter: wp.array(dtype=int), thread_values: wp.array(dtype=int), tid: int + ): + ... + + @wp.kernel + def run_atomic_add( + input: wp.array(dtype=float), + counter: wp.array(dtype=int), + thread_values: wp.array(dtype=int), + output: wp.array(dtype=float), + ): + tid = wp.tid() + reversible_increment(counter, thread_values, tid) + idx = thread_values[tid] + output[idx] = input[idx] ** 2.0 + + tape = wp.Tape() + with tape: + wp.launch( + run_atomic_add, dim=num_threads, inputs=[inputs, counter, thread_values], outputs=[outputs] + ) + + tape.backward(grads={outputs: wp.array(np.ones(num_threads, dtype=np.float32))}) + +By default, ``snippet`` would be called in the backward pass, but in this case, we have a custom replay snippet defined, which is called instead. +In this case, ``replay_snippet`` is a no-op, which is all that we require, since ``thread_values`` are cached in the forward pass. +If we did not have a ``replay_snippet`` defined, ``thread_values`` would be overwritten with counter values that exceed the input array size in the backward pass. + +Profiling +--------- + +``wp.ScopedTimer`` objects can be used to gain some basic insight into the performance of Warp applications: + +.. code:: python + + with wp.ScopedTimer("grid build"): + self.grid.build(self.x, self.point_radius) + +This results in a printout at runtime to the standard output stream like: + +.. code:: console + + grid build took 0.06 ms + +The ``wp.ScopedTimer`` object does not synchronize (e.g. by calling ``wp.synchronize()``) +upon exiting the ``with`` statement, so this can lead to misleading numbers if the body +of the ``with`` statement launches device kernels. + +When a ``wp.ScopedTimer`` object is passed ``use_nvtx=True`` as an argument, the timing functionality is replaced by calls +to ``nvtx.start_range()`` and ``nvtx.end_range()``: + +.. code:: python + + with wp.ScopedTimer("grid build", use_nvtx=True, color="cyan"): + self.grid.build(self.x, self.point_radius) + +These range annotations can then be collected by a tool like `NVIDIA Nsight Systems `_ +for visualization on a timeline, e.g.: + +.. code:: console + + $ nsys profile python warp_application.py + +This code snippet also demonstrates the use of the ``color`` argument to specify a color +for the range, which may be a number representing the ARGB value or a recognized string +(refer to `colors.py `_ for +additional color examples). +The `nvtx module `_ must be +installed in the Python environment for this capability to work. +An equivalent way to create an NVTX range without using ``wp.ScopedTimer`` is: + +.. code:: python + + import nvtx + + with nvtx.annotate("grid build", color="cyan"): + self.grid.build(self.x, self.point_radius) + +This form may be more convenient if the user does not need to frequently switch +between timer and NVTX capabilities of ``wp.ScopedTimer``. + +.. autoclass:: warp.ScopedTimer diff --git a/_sources/modules/sim.rst.txt b/_sources/modules/sim.rst.txt new file mode 100644 index 00000000..bec52af0 --- /dev/null +++ b/_sources/modules/sim.rst.txt @@ -0,0 +1,157 @@ +warp.sim +==================== + +.. currentmodule:: warp.sim + +.. + .. toctree:: + :maxdepth: 2 + +Warp includes a simulation module ``warp.sim`` that includes many common physical simulation models, and integrators for explicit and implicit time-stepping. + +.. note:: The simulation model is under construction and should be expected to change rapidly, please treat this section as work in progress. + + +Model +----- + +.. autoclass:: ModelBuilder + :members: + +.. autoclass:: Model + :members: + +.. autoclass:: JointAxis + :members: + +.. autoclass:: Mesh + :members: + +.. autoclass:: SDF + :members: + +.. _Joint types: + +Joint types +^^^^^^^^^^^^^^ + +.. data:: JOINT_PRISMATIC + + Prismatic (slider) joint + +.. data:: JOINT_REVOLUTE + + Revolute (hinge) joint + +.. data:: JOINT_BALL + + Ball (spherical) joint with quaternion state representation + +.. data:: JOINT_FIXED + + Fixed (static) joint + +.. data:: JOINT_FREE + + Free (floating) joint + +.. data:: JOINT_COMPOUND + + Compound joint with 3 rotational degrees of freedom + +.. data:: JOINT_UNIVERSAL + + Universal joint with 2 rotational degrees of freedom + +.. data:: JOINT_DISTANCE + + Distance joint that keeps two bodies at a distance within its joint limits (only supported in :class:`XPBDIntegrator` at the moment) + +.. data:: JOINT_D6 + + Generic D6 joint with up to 3 translational and 3 rotational degrees of freedom + +.. _Joint modes: + +Joint modes +^^^^^^^^^^^^^^ + +Joint modes control the behavior of joint axes and can be used to implement joint position or velocity drives. + +.. data:: JOINT_MODE_LIMIT + + No target or velocity control is applied, the joint is limited to its joint limits + +.. data:: JOINT_MODE_TARGET_POSITION + + The joint is driven to a target position + +.. data:: JOINT_MODE_TARGET_VELOCITY + + The joint is driven to a target velocity + +State +-------------- + +.. autoclass:: State + :members: + +.. _FK-IK: + +Forward / Inverse Kinematics +---------------------------- + +Articulated rigid-body mechanisms are kinematically described by the joints that connect the bodies as well as the relative relative transform from the parent and child body to the respective anchor frames of the joint in the parent and child body: + +.. image:: /img/joint_transforms.png + :width: 400 + :align: center + +.. list-table:: Variable names in the kernels from articulation.py + :widths: 10 90 + :header-rows: 1 + + * - Symbol + - Description + * - x_wp + - World transform of the parent body (stored at :attr:`State.body_q`) + * - x_wc + - World transform of the child body (stored at :attr:`State.body_q`) + * - x_pj + - Transform from the parent body to the joint parent anchor frame (defined by :attr:`Model.joint_X_p`) + * - x_cj + - Transform from the child body to the joint child anchor frame (defined by :attr:`Model.joint_X_c`) + * - x_j + - Joint transform from the joint parent anchor frame to the joint child anchor frame + +In the forward kinematics, the joint transform is determined by the joint coordinates (generalized joint positions :attr:`State.body_q` and velocities :attr:`State.body_qd`). +Given the parent body's world transform :math:`x_{wp}` and the joint transform :math:`x_{j}`, the child body's world transform :math:`x_{wc}` is computed as: + +.. math:: + x_{wc} = x_{wp} \cdot x_{pj} \cdot x_{j} \cdot x_{cj}^{-1}. + +.. autofunction:: eval_fk + +.. autofunction:: eval_ik + +Integrators +-------------- + +.. autoclass:: SemiImplicitIntegrator + :members: + +.. autoclass:: XPBDIntegrator + :members: + +Importers +-------------- + +Warp sim supports the loading of simulation models from URDF, MuJoCo (MJCF), and USD Physics files. + +.. autofunction:: parse_urdf + +.. autofunction:: parse_mjcf + +.. autofunction:: parse_usd + +.. autofunction:: resolve_usd_from_url \ No newline at end of file diff --git a/_sources/modules/sparse.rst.txt b/_sources/modules/sparse.rst.txt new file mode 100644 index 00000000..e703ac56 --- /dev/null +++ b/_sources/modules/sparse.rst.txt @@ -0,0 +1,32 @@ +warp.sparse +=============================== + +.. currentmodule:: warp.sparse + +.. + .. toctree:: + :maxdepth: 2 + +Warp includes a sparse linear algebra module ``warp.sparse`` that implements some common sparse matrix operations that arise in simulation. + +Sparse Matrices +------------------------- + +Currently `warp.sparse` supports Block Sparse Row (BSR) matrices, the BSR format can also be used to represent Compressed Sparse Row (CSR) matrices as a special case with a 1x1 block size. + +.. automodule:: warp.sparse + :members: + + +Iterative Linear Solvers +------------------------ + +.. currentmodule:: warp.optim.linear + +Warp provides a few common iterative linear solvers (:func:`cg`, :func:`bicgstab`, :func:`gmres`) with optional preconditioning. + +.. note:: While primarily intended to work with sparse matrices, those solvers also accept dense linear operators provided as 2D Warp arrays. + It is also possible to provide custom operators, see :class:`LinearOperator`. + +.. automodule:: warp.optim.linear + :members: diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..7577acb1 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 00000000..92fad4b5 --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 00000000..54b3c463 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 00000000..f1916ec7 --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 00000000..ff4aa329 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '>>> |\\.\\.\\. |\\$ ', true, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 00000000..dbe1aaad --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 00000000..52a770bb --- /dev/null +++ b/_static/custom.css @@ -0,0 +1,37 @@ +/* hides the TOC caption from the main page since we already have an H1 heading */ +.section .caption-text { + display: none; +} + +/* note title text in white */ +.admonition p.admonition-title { + color: white; + font-weight: 700; +} + +/* .admonition.note { + background: #e5f4d8; +} */ + +/* left align tables */ +table.docutils { + margin-left: 1em; + font-family: monospace; +} + +/* inline code snippets #E74C3C, var(--color-link), #4e9a06 */ +code.literal { + color: #4e9a06; + font-family: monospace; + font-size: var(--font-size-normal); +} + +.sidebar-brand-text { + text-align: center; + margin: 0 0; +} + + + +/* normalize size across Firefox / Chrome */ +html { font-size: 100%; } diff --git a/_static/debug.css b/_static/debug.css new file mode 100644 index 00000000..74d4aec3 --- /dev/null +++ b/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /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 00000000..521c495f --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.15.0', + 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 00000000..250f5665 --- /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/logo-dark-mode.png b/_static/logo-dark-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0016561a8ad6995fdb5729fcb78b9cadb56829 GIT binary patch literal 8504 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

Rg%L{ZkooGEsxn(rig; z04>(ts~~=tK2a59Sa8f#zA(+h7b6O)d|aDlfuu$EAjZ@bAm=B z&!-#24YG^*NO*LfMx3%v+db7wF&H0Le!W3{eej@hs&4Cf&JIN~@UWrwx#L-35b7}3 zFc8f6g(oqnxl!{DkSM@w_^@n^EmX(rp3KkEN{Ty zCo${f@+5fX3jCOQ974r;G9%6;77sHNNUByepotxJ;;N|cgX?jGPSBbre{Yl75;?fO zOq_(B+~ldU15pMae}5f^!A5IV)hQe*5?DS8xL%<_8)5mg;cZd^IT1bYghSC1U^A&> zvx8qZrI}aH#kjaqp`hp+y*vFv9y)i^(AoLBRw{76e?m$d`H%X4!zD-CK|QdYyIbb>D;g>RT!%3L6%=h-($w&P)@0<)&_! zteLsZ^e^>yr-rS|Bl0bsHHk=0uWU3BOEz;OcF>vZIUl1^>HWnSR9?adjU2^#C%;RZ zuWz=j1sLl{GxZR?Dp0zMG_kfUP8jVBwWQ=@G9cyh%rw9j30zP3+EO5;m(Hx|M#@jJ zsQNjnoajxZ)^wzXxtT&RL?9<6|J>(k{Ca3HDgU&A0TB7)vx(phzNC5c6?*A&qx;nr z*~2?b9c{5q@89cA%5On~>zy&!qQ2Tn3=M^yS-YWf|YO86pU)Fj3rZb$ZX5R>1{M|v2n&%+zj9c6Hi?{nI(lF`dt52P;E|4#xyv4{HEHrlrCv??*$u!TUx4}E zaque?yvsi)biUj??q@zxz~bFE=EL@Dk2{lQ2-_N(s1_QaaS^$!xA0i-*=r<(8>}NM zKRnbag-x;hMBWtec5}RbsE|yi9e%6to9G7yIqeEri#@&&Q}i=WiX8ln+Cb(p)R+4n z-w{&zHirw?nS=G2Eg|-B+HIwntLd^%%)S9`%XiAqu*-o^&pEVB{d7VJjqyl(THGw(cW7cf+iZ!ztSiFnjSA^5sudWPL zo}}Y(OQDG%ZgM)3484=yPwDQCgOPMFuSD8Bn3^S(bE;`ICsVYIgO1!2&Vi_us3uiL z<_FfSB#C!xii|<{T?9{moF@9_3q+)HD#16NSy#7F@h^6BJi9)Dc^GHVBw64$%~R2& zA6waAW+D5zYnPXxuButGse82}I0>7RhI!#;8yEgc@6%Ayeh2D?@G>xh$3QBwGZ^ST z7(WeIAjWT_fBiGQI*jD?aa}SPtXOE50&cE+TWHEk6eO0PIq>+71f#C&gzstwI-U$@ zGx2EB-^l9lElgG^N|YQTrDDnG(3EuU+qg!4ihaOTaL37&aCuD)Gz5~j)Wu)KUbw0&l z58w^gugZGGg*cF_=KKN<)rq_a!G}C&+qATNSqv?34kW5@pV6XfRG)Y%$kPKx-IS=( z;^N@ly#0-Uf5LSL-}|JU+bzmq^wp<@7QV-8TuS*YKT{?6K7yG8NVVw4NOG@!Cj!fb zfI`b24|h7@5hw+)Y#7mU9DyreD;pA)G|aA8c^0RtN)g#p31#YE6+lakzpVV|Z?EBr zDlZ7*fQ~d+TQQo*CQ*6Lg;YwVT8~Un1NDg2xzvsKpKxR_H4__ zZ&<2rLw^b~s~49BsfoT;5YqX+fSTL#x!tOR$%F6kbd!CL$goGvL7|d{^;nPY(*maK zE+d=v_75XECAv4S^PZY&m`}>EvGa+tcO*DHIJp`$?fIBm`?Ha7k%FSwo5dRjQ)5iD z<%;q7rys^w0|$;|pH?rVzp`nx;TqJE3A+W9&9okwdue`~&FBW6mX~?bD^l`vYPu>9 zOF0_}sZP)CZ9HtRQ-dvpAA~5k zW8Hiv)q5(}2bvU=ethLPt@sZ9( z4Y>^KE3NQ)ZXY01VU8?**_5sbrd!<7Tgo3mF&b6N0`6kwA;6*vtCrQkB^oUjq`i9d z(+-Xn#@w;3u)5Kl$knqKwM&Ad4|FAZW#VIUMyOZ43qaX~8^^QUfi# z_?D)#8DONM{QUiNFYb1+Mdzd23`2y?;+!=kQsNEhy#|KDSJZy^Ba>dM;CsiC(zTK< z0iV=vJ{!^fqNnRDppAJ&{PEG8>SNn*UdEuI`lcz}btMz&j_Gh(6~`BM0=Zau-)!-} zF(z_l{K6~>O3rN{2G)NbeQZj}Vv>(O=oBNR@9oJ%c4W@i&c4+_%%R@n0k|rJeg3%qH9VJclHDUH$Iy+$5cgKfsb=Ms?oN*H={K>5YOr?B2jA5+6bi z)buAoFiqC+ntUN0U<(qXT|>1WMX3;#l?&~%f2azGwNv1D0&JnW2MtS~(1gjZ58nMO z3$cD)h0bRbN0?Cby$kM9e;(;&^Ti2_>N;b;Uh}ERt;26eaeDimFC3s&sv@`9{5k0>iQrWa+VTD3$Pa=i$+XEcIf6 z*eOe|4#(;TjaEvgazdsG1U z7xE2xl_GQms@AR1XW`tG>M^lz=gnMqVdd-d3&llYMF6tE;JOBBz6P~N7aHV(HgeM2 zU5$Q;jb6b+#iHX^;|L3FnbzP+eal9j^8y59P-@+9gzY-!X>#bwQA1SXJ1@8NrGV|h z;S5mP)!j!Ol@FwDFHkP5X=jhMEfQ? zgN9|XyNCb_|K4@C+wUBcL2%0f%$J2?qmAMK?elgWMRU_-a6go@Jeo_5Ix91Qys(Tq z&yb^2<;71rwsZC_&=U=IW8%1*6#0q~n@4RI^Io;KZs>MRa<1TXM(p_w{Ln^)A}DsQ zt7aCAe>(X7*~H%Di}!szYw-yTvIOne_njX1^nV8TvI35?dm}g10$(VVlQm@wODzS5 zm}k25Zl5Oh3^PU|Y}_Ji30cgta- z`2Y-aK?*_PE;a}uZ=@^k76cDZ?vA%B6y}6*2iPF&98eJ8PGc(&-~fjJjU_aNHC>ev z_6};kXoSA6mI2Jy2_^#v-jOGl^9JJpkO+4uz#Hj|!hpRYz~8uF-23G;2nhJC;_d_i znrP|(lwHsWfVhyjkg%Ytw}YoBP@WthhlbmN^;GWu34t3yfcEb0u3!+z%gam1OH9ZG zZ3hyOk&yuji-JT&1#udJ7$1~7)LRgR;kbnO149LYfuS8--5p#|fJ;oMjf;mn1PH{* z0so2*>8h#uZ+H~uPZn@|fV`ouAQ2&95E2Rcs|Chg)e{HuXF&f?3ycBovIwMyz_@sz zVF*=E1j?P`uMlw9zwKQ;(9XZpfx|!uX9NY6(Lwz#Cg&H?HA+X_ea z-!$DFZ2v>n-(tIz{7&buf#A&ljr%w4f93vL8K5P@Q82_M6b@X- z0f!?hE@5i}m$VTS78j8b6h}zH1)*?+s31&I1|}^cCMqn9u>A{!HrfGKl~CuuMs*1V z$3aQJMWJE{X)!@tF)0Z_aY<3AAXG%gMi4G84TB29VKSmn#BV4#41CuGjfCQs(*X&! zLx5aScE1Iego71z)FD7oA>seb=r}{&ZE*$=-~$JghxdO31`bGszB}}iO%X|4v|`fY zBBCO=n1%mhZG=E$aFuw8DIzQ+_J`zhS-`ktaKu6{>l6p@8y1%fSQ(9gy1SqaTwI(X zz{`*TmzKZF8zA?`qNq7wa2h_B75`_=>m%I$82#}HI6M3n0RX?t77T^`;RFNqM8JPL z!rA>Hg4sh+b_m?}{bxb_Yu@4iwOBGDl5lBTgrJBx9Ew{k8@Qk}94aOVx52S1CJdE< zLB;=$j&ZSd_kyAkigvh6aoOMs=yx^%-rrR6{axG39&yQ&u&5ZW90Wx~4MZfsqLN?< zQ9)rTFpg8up9zC5zv_QwEC>3(IFb9U@Rv4#v-@KX*Isbl3iR)G^(SYSH2x2tKiA@a z=m7`)kCXq3-+$=(hpzvMf&WVRpX&ODuK$XG|4R9v>iYji7x{kmx-=Gi(5JabshpYA*>&0dk=3FD_dvp8!yF3m0?!@2q&Jl0!kbc-UE9iqU8 z4v(ULbp(>^#&YA~g;3xTFyc|y;Q?In73K*p2Sh@6yFuypp;eM3O-Irh9a9N&vI)@{ zW>*#FD`ZWyITi+UgYIN>XgV{kIW`gG>uku{egs@c=tpSZJBeqg@Ayz>|^EMqX5#z&ylPbLz%fSfV z90)ee2#Y;&$~r-5xzJX#N*u-XretagKcA!#iS24-aIa{IGHt>{A_6+7dmw|64Y6Q4k z^+8?Kgi;7Bg@w35SZ07sMu$hl+QgL^%{i}Tt+6ggulW${q6t5{yFTgr$AnUiqe?NPLi za+;{#+=t3$bm)$j31%~2^lr~S{|31TeCE&~G=Rm-jxL?Qa%f05@uVKVR%|eC(nDUm zGrmnGFf&p#qgOcmHr-_hv=LLTO}}0EA>iRWIaa)_3=tfcxUb%aCbF4R^2!cr+&Nn3 zch!D7^*Ed0uxv|LX?__sm`HOn=tJO@rg$QZmqgm04k)@_M@sZ<%U`cKw!C+UzRvu$ zYDX1S1LjbX$Y-!)d8@;9Etk1>zbdvA{q*&G z3P=6wD)98@+37toLvk#pAK;o~i1tv*@6TeJ>^-=bx*=OZxBDSuk`NiIpVt%}?Y(F1 zS8FMg;<;Db|0@`)G@rs;GphQ^bC?y!$q92WuluMOw;ac5Diy%>nhebf*-Y*Rmuu01nm;dG z_E5sr@MGetM=CnEti(N|W|>ecNL%*c9xasv-E6PwD}_=sv-6G6iF$ZtNXejE+eyoN z)vw~mGz4GZ$vb&6bCiyF7Sl7FG%RYeR@WxPY(uRCX zwwQc9;hvYKT-kfg8#Af&O3spxV`EE3)3q1+cnx0jehvEua>n(a5@OwmHUHHUFv{(~ zby_p>9TC{@u+Bx)*V6o(H^mHF{*Q1(n`Lh!{~-Sd{fAOaFkg9}(<>bZ{*ZdJQUk(@ z(?Y&`D|&QfGs>ZB+{5lax1)0ckao>-gO~??@{d@?Q35Zj_6Ak<&kKL~Sw5+*@6-I! z&3d*Kqxj_mvfN3=Yqez{pjFa1C;t77tQLr?=O?$B#n&@I6f+^~eygQnNK@#SUXuMg zM;uo}8GWtVN~lg1=g-AV_#?MHVumznnmj_CA+5%gxfz=rSCyn}3NagmZWcl3VvUYcxmEm1|JdqaYSb1$@!52=={ zkD;t(hg-HEafBQrL90WgqHz@2%-0B%iiLp>qtv}!HgHMl_P8F=w+Z=exyVD^ABKsk ze(r|byuHUa=UxN|pCM*ui(XeV+2)Xx2rYfI?8yKwSZWX8=eYBw`m$Nli(CGJMUXNz zyqh*j9T6}K!AiSgrL)Lq&PldC#%`Jl^&D@1SC8Ao_P$-$3%o&KsJwK3c;9cuU{Zv% zVVtO0$SnP^X)EyKr$>T=vEEM{=c%6d{-Pc$U*1A~ zPN`|C_kC*QHYqC}JzNqegi%1$3jCn;;*;EPJp@StvZjw&OWc{*gA5QcZWjErqO+lzyEv2Ct0x zn;rW71YR0k6XM=dGj})HGJKRvpsXyBn~Bj!se&`+wYsoOnye=tvdKe~L6)mO1DX0; z$lRG}?s%S_OzHeI4|yrsDBfuosgsOzsz-O^2*w6e)p)3B#i7Fjl@O$FRoeG)7 kpF5Sy!T;t_a5-a?x?3B4s`UuB0mQ>oSJhG}Rk9BKKfs2~hyVZp literal 0 HcmV?d00001 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 00000000..c2e07c71 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,258 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #404040 } +body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ +body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } +body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/_static/scripts/furo-extensions.js b/_static/scripts/furo-extensions.js new file mode 100644 index 00000000..e69de29b diff --git a/_static/scripts/furo.js b/_static/scripts/furo.js new file mode 100644 index 00000000..cbf64878 --- /dev/null +++ b/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={212:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(212),e=n.n(t),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;function s(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function l(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",s)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){t<64?document.documentElement.classList.remove("show-back-to-top"):tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),l()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/_static/scripts/furo.js.LICENSE.txt b/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 00000000..1632189c --- /dev/null +++ b/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/_static/scripts/furo.js.map b/_static/scripts/furo.js.map new file mode 100644 index 00000000..7ed2be87 --- /dev/null +++ b/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 0.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/skeleton.css b/_static/skeleton.css new file mode 100644 index 00000000..467c878c --- /dev/null +++ b/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '

" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css new file mode 100644 index 00000000..bc447f22 --- /dev/null +++ b/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map new file mode 100644 index 00000000..9ba5637f --- /dev/null +++ b/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/styles/furo.css b/_static/styles/furo.css new file mode 100644 index 00000000..b30989da --- /dev/null +++ b/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#646776;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2962ff;--color-brand-content:#2a5adf;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link--hover:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link-underline--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto,body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;-webkit-text-decoration-color:var(--color-link-underline);text-decoration-color:var(--color-link-underline)}a:hover{color:var(--color-link--hover);-webkit-text-decoration-color:var(--color-link-underline--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link);-webkit-text-decoration-color:var(--color-link-underline--hover);text-decoration-color:var(--color-link-underline--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{background:var(--color-background-primary);color:var(--color-foreground-primary);height:100%}article{background:var(--color-content-background);color:var(--color-content-foreground)}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:-webkit-sticky;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);-webkit-text-decoration-color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);-webkit-text-decoration-color:var(--color-link--hover);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1rem;vertical-align:middle;width:1rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1rem;width:1rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg{color:inherit;height:1rem;width:1rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{fill:currentColor;display:inline-block;height:1rem;width:1rem}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:-webkit-sticky;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.25rem;width:1.25rem}:target{scroll-margin-top:var(--header-height)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:3.5rem}.sig:not(.sig-inline) span.pre{overflow-wrap:anywhere}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}.versionmodified{font-style:italic}div.deprecated p,div.versionadded p,div.versionchanged p{margin-bottom:.125rem;margin-top:.125rem}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);overflow-wrap:break-word;padding:.1em .2em}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:-webkit-max-content auto;grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>p,div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}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}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;-webkit-text-decoration-line:none;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;-webkit-text-decoration-color:var(--color-link-underline);text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23607D8B' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree .reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling.Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo.css.map b/_static/styles/furo.css.map new file mode 100644 index 00000000..92af4075 --- /dev/null +++ b/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/variables/_layout.scss","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_search.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto\n display: block\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #646776; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2962ff;\n --color-brand-content: #2a5adf;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link-underline--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #ffffffcc; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2b8cee;\n --color-brand-content: #368ce2;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: 1rem\n width: 1rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1rem\n width: 1rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page svg\n color: inherit\n height: 1rem\n width: 1rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: var(--header-height)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","// Overall Layout Variables\n//\n// Because CSS variables can't be used in media queries. The fact that this\n// makes the layout non-user-configurable is a good thing.\n$content-padding: 3em;\n$content-padding--small: 1em;\n$content-width: 46em;\n$sidebar-width: 15em;\n$full-width: $content-width + 2 * ($content-padding + $sidebar-width);\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\np.admonition-title, p.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 3.5rem\n\n // Break words when they're too long\n span.pre\n overflow-wrap: anywhere\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\n.versionmodified\n font-style: italic\ndiv.versionadded, div.versionchanged, div.deprecated\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n overflow-wrap: break-word\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > p,\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 0.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(0.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(0.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","//\n// Search Page Listing\n//\nul.search\n padding-left: 0\n list-style: none\n\n li\n padding: 1rem 0\n border-bottom: 1px solid var(--color-background-border)\n\n//\n// Highlighted by links in search page\n//\n[role=main] .highlighted\n background-color: var(--color-highlighted-background)\n color: var(--color-highlighted-text)\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the