ElastiQP
An always-feasible QP solver for constrained robot control.
ElastiQP solves the following problem:
$$ \begin{align*} \underset{x, t}{\text{minimize}} & \quad \frac{1}{2}x^TQx + q^Tx + w^T t \ \text{s.t.} & \quad Ax = b \ & \quad Gx - t \leq h \ & \quad t \geq 0 \end{align*} $$
i.e, a QP with hard equality constraints $Ax = b$ and elastic inequality constraints $Gx \leq h$, where every inequality constraint is relaxed with an $\ell_1$ penalty term defined by $w > 0$.
Notably, the elastic slacks $t$ are eliminated analytically, so the condensed system stays $n \times n$ regardless of the number of constraints. This enables fast compute times, even with large numbers of inequality constraints $p$.
Why ElastiQP?
For robot control, we are typically interested in solving small-scale, dense QPs, where the number of inequality constraints $p$ may be much larger than the number of decision variables $n$. In this setting, inequality constraints can often be momentarily infeasible, but in a control loop, we always need to return a reasonable solution.
Likewise, in the control setting, we often encode dynamics via strict equality constraints. For typical systems, dynamics constraints are feasible by construction, and relaxing these would lead to unrealistic behavior.
Given this, in the case of infeasibility, ElastiQP naturally relaxes the inequality constraints in an $\ell_1$ manner, relaxing only the constraints that strictly need to be adjusted for a feasible solution.
Overview
ElastiQP is a C++/Eigen header-only library with Python bindings and a JAX foreign function interface (FFI).
ElastiQP's primary backend (das.hpp) is is a dual active-set method, based on DAQP. We also have two additional backends, which were primarily used as a point of comparison for the paper: pdal.hpp is a primal-dual augmented Lagrangian method, based on ProxQP, and ipm.hpp is a proximal interior point method, based on PIQP and inspired by qpax
ElastiQP is fast, particularly when warm-started. For a rough sense of numbers, on a laptop with an Intel i7 CPU, ElastiQP can solve humanoid-scale whole-body control problems at approximately 50 us.
Installation
C++
From source:
git clone https://github.com/StanfordASL/elastiqp
cd elastiqp
cmake -B build . -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j
# Optional: cmake --install build --config Release
For best performance (on your own device), you can also build with -march=native
cmake -B build-native . -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=native"
cmake --build build-native --config Release -j
If you've installed with CMake, you can also find_package(elastiqp)
Python
From PyPI
pip install elastiqp
From source
If installing the Python bindings from source, first make sure that you've run the build described above in the C++ section. You'll need to have nanobind (and jax, if you want to use the FFI) installed in your current python venv when building. Then, from the top-level of the repo,
pip install .
JAX/PyTorch dependencies can be installed with pip install "elastiqp[jax]" or pip install "elastiqp[torch]", respectively.
Note: if using UV, you can directly replace the above pip commands with uv pip
Usage
C++
#include "elastiqp/elastiqp.hpp"
// or one backend only: "elastiqp/das.hpp", "pdal.hpp", "ipm.hpp"
// If you just need to solve a single problem
elastiqp::Solution sol = elastiqp::Solve(Q, q, A, b, G, h, penalty);
// or without equalities: elastiqp::Solve(Q, q, G, h, penalty)
// If you are solving multiple times in a control loop:
elastiqp::Solver solver;
solver.setup(Q, q, A, b, G, h, penalty);
while (running) {
// Set your updated problem data and warm-start
solver.set_q(q_k); solver.set_h(h_k); solver.set_b(b_k);
const elastiqp::Solution& sol = solver.solve();
}
Python
import elastiqp
# If you just need to solve a single problem:
sol = elastiqp.solve(Q, q, G, h, penalty, A=A, b=b)
# Specify the backend (default "das") via the method kwarg
sol = elastiqp.solve(Q, q, G, h, penalty, A=A, b=b, method="das")
# If you are solving multiple times in a control loop:
solver = elastiqp.Solver()
solver.setup(Q, q, G, h, penalty, A=A, b=b)
sol = solver.solve()
solver.update(q=q_k, h=h_k, b=b_k)
sol = solver.solve()
JAX / PyTorch
import jax
jax.config.update("jax_enable_x64", True)
import elastiqp.jax
# Same API as Python, just with elastiqp.jax
sol = elastiqp.jax.solve(Q, q, G, h, penalty, A=A, b=b)
# Compatible with jax.grad and vjp on the pdal / ipm backends
def loss(q_):
sol = elastiqp.jax.solve(Q, q_, G, h, penalty, A=A, b=b, method="ipm")
return jnp.sum(sol.x**2)
grad_q = jax.grad(loss)(q)
# Compatible with jit
jit_loss = jax.jit(loss)
l = jit_loss(q)
# Compatible with vmap
vmap_loss = jax.vmap(loss)
batch_q = jnp.tile(q, (10, 1))
batch_ls = vmap_loss(batch_q)
# Explicit warm starting
def step(state, q_k):
sol = elastiqp.jax.solve(Q, q_k, G, h, penalty, A=A, b=b, warm_start=state)
return sol, sol.x
init = elastiqp.jax.solve(Q, qs[0], G, h, penalty, A=A, b=b)
_, xs = jax.lax.scan(step, init, qs)
For runnable Python/JAX/PyTorch examples, see the examples folder
Benchmarks
See StanfordASL/elastiqp_benchmarks
Acknowledgments
ElastiQP builds on the following excellent projects:
ElastiQP is licensed under Apache 2.0; see LICENSE and NOTICE for third-party notices.
Citation
@article{morton2026elastiqp,
author={Morton, Daniel and Arrizabalaga, Jon and Manchester, Zachary and Pavone, Marco},
title={Elasti{QP}: An Always-Feasible QP Solver for Constrained Robot Control},
journal={arXiv preprint arXiv:2609.19080},
year={2026},
}
Release files for elastiqp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| elastiqp-0.1.0.tar.gz | 184.6 kB | Details |
Built distributions (wheels)
Total release size: 8.1 MB
Release files / elastiqp-0.1.0.tar.gz
| Download URL | elastiqp-0.1.0.tar.gz |
|---|---|
| Size | 184.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
04009f0c06cafe64f1bcc7cb402c6c94c407c9243ad08594ca098321d8066f2c
|
|
BLAKE2b-256 checksum How to use checksums |
0bde887485d011954ad6be376e5b39c4300955f25ab40e9c2ba5594ae52a6aca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | elastiqp-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 575.9 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
417130da8b0dfee9ee8af8e9d916e63060ba06eea506f7e49247a799389d13ef
|
|
BLAKE2b-256 checksum How to use checksums |
41e397ee2932c7e656e19cab585705cd7a96542da4ce6cf7015c672b5f4f217a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | elastiqp-0.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 506.2 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
7ad3aeb66b6441c30784c207260fc176167cad82bbdd02e039f7c573d1ce9632
|
|
BLAKE2b-256 checksum How to use checksums |
7f3e3dada317bd93b350cce4ea69e27568e76113adfae1e2bb23a2b9f203e70b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | elastiqp-0.1.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 499.9 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
cb336311b33ea9341f3e0a21109532372f804b1dbbc64bfc71d57762f5691c23
|
|
BLAKE2b-256 checksum How to use checksums |
39805b70f732128f376dbe37b2bbec09dbe92bec7dc0e6acf910125e57061b60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | elastiqp-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 575.9 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
922623a48f7111ce0caf59b330d4e642ef5633d25cde0ad7b38dc927ef000166
|
|
BLAKE2b-256 checksum How to use checksums |
81e7bd62136bbf988b314f563e9166580defb8c16d598fe10c51cb8d0e9d2afd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | elastiqp-0.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 506.3 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
94beb5a375f39f7c1e2fd579757d205e0a74993d27ae270fbee479369b49d95e
|
|
BLAKE2b-256 checksum How to use checksums |
063e59193e4ec2c8074551ce73fc747f330b71597a693bbd88fcaa2440bbf4a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | elastiqp-0.1.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 499.9 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
15236281e789e48ba99ec867c7d35b45b2288bf0c8c6a7c965b2bfd58a7acb4f
|
|
BLAKE2b-256 checksum How to use checksums |
253fd1b7ad2a8b14abf1b069d49a48054f475c3e219588e73ad8211b3aec595b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | elastiqp-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 577.3 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
a2c78e8e7c6fd1b3f46a9128c5a81f59e0fead414e5926a6c9fab2c9496eedb1
|
|
BLAKE2b-256 checksum How to use checksums |
5dd29feb1c0f160e7798386aa78c1edd443944a59656e848057ba7adfd8a7db7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | elastiqp-0.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 507.8 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
3259364c9ad77b81972eb3615ef429f9ff66060ccd5804c12c90282be19b4fee
|
|
BLAKE2b-256 checksum How to use checksums |
6037b2b19d5aede4ca8ef55722fea990ccf1358843d25cd5e6a05302dc079933
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | elastiqp-0.1.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 500.9 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
39ac64690c49526c2b2abc78c83ecfa0c6c73d1dabbb9b85296c7623342c8785
|
|
BLAKE2b-256 checksum How to use checksums |
2a3d41ffa206e9dcf1a82b3a45e6194c2f013124cfaf216865770b388baf3e90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | elastiqp-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 576.9 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
af45123c7db60ed60579c57cd23a07241db7d35af558f19e35eabfe5546eb3b0
|
|
BLAKE2b-256 checksum How to use checksums |
a0a2ccfcf874c262da2e9095ed7071c9a41c7e351d3f5cae6b645d92f879f9f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | elastiqp-0.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 507.7 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
ebbc1dd68703d416345f0ccfa81e7744068e4ead56b2de88c9b84df5f9081420
|
|
BLAKE2b-256 checksum How to use checksums |
b6ae713f6274732af2ec05ea4d6fbaa8ebc8a8026ad44afdb183e2ca1f64361e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | elastiqp-0.1.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 500.5 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
714c617aa9d312d3e20015a713b27da17da2f0d7636762e2b882db17f316c368
|
|
BLAKE2b-256 checksum How to use checksums |
8f33b02a48f00222797d4ffc5a9a155ba9406f3d83db5dbe5e6799a42035bc9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | elastiqp-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 570.0 kB |
| Tags | CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
decda0f8aff65dcad32a954dd9ee09d25fea2f7c15084091fd3a34b1f29ba535
|
|
BLAKE2b-256 checksum How to use checksums |
8b5ac73dac05df78d0c70ab9058289ee33d1945d5cfa77c2281cf62b13d0c73b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | elastiqp-0.1.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 502.3 kB |
| Tags | CPython 3.9 Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
caed2eebeeab455620a7c7348f8664df9f3de39a6c149cd55435d943bbb51ed4
|
|
BLAKE2b-256 checksum How to use checksums |
df99912c0f5cbaf1204d714ef0935621e76f4c3d485e260741021fe1252b2cf7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / elastiqp-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | elastiqp-0.1.0-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 496.7 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
00c6739ae057b274a28f6e24c1e81a1e4b32658bb651c44b725d257d1e765b16
|
|
BLAKE2b-256 checksum How to use checksums |
1c1cf925e55be1979c5fc21e91bb60f89a72063838e237336aac4f8d93823eb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log