aadc-ode
ODE integration with exact adjoints on aadc-ng.
Two families of solvers:
C++ kernel replay (on tape) — the RHS f(y, p) is recorded once
into its own tape, and each step records a compute block that replays it.
| Solver | Method | For |
|---|---|---|
bdf_solve |
Semi-implicit Euler, frozen Jacobian | Stiff systems |
rk4_solve |
Classical Runge-Kutta 4th order | Non-stiff, fixed step |
Python discrete adjoint — adaptive integration forward, then a backward sweep computes exact dJ/dp via vector-Jacobian products from the AAD kernel.
| Solver | Method | For |
|---|---|---|
adaptive_rk45 |
Dormand-Prince 4(5), adaptive step | Non-stiff, high accuracy |
fixed_rk4 |
Classical RK4, fixed step | Non-stiff |
discrete_adjoint |
Backward sweep (one VJP per stage) | Exact dJ/dp for ERK |
What "exact" means here, because it is the one place a knowledgeable user
could be misled: exact for the discrete map with the recorded step
sequence. The accepted steps h_list are frozen and the adaptive controller
is not differentiated — that is the semantics of the cited paper, not an
approximation introduced by this port. It is also why the backward sweep needs
the forward solve's time grid and cannot invent one:
t_list, x_list, h_list, k_stages = aadc_ode.adaptive_rk45(f, x0, (t0, tf))
dJdp = aadc_ode.discrete_adjoint(aad_rhs, x_list, h_list, k_stages,
aadc_ode.DORMAND_PRINCE_45, p,
dJdx_T=dJdx_T,
t_list=t_list) # <- pass it
Pass t_list (or t0= if that is all you have). Omitting both reconstructs
the stage times from 0.0, which is correct only for an autonomous RHS or a
solve that started at t=0 — and wrong, silently, otherwise. It now warns;
t0=0.0 is how an autonomous RHS says so and silences it.
AadRhs records the RHS once and replays that one recording at every
stage of every step, so a plain if x[0] > 0: inside the RHS freezes its
branch at the recording point and uses it at states arbitrarily far away —
wrong values and flipped derivatives. Recording therefore raises if the
tape reports any active-to-passive conversion; use iif / a masked blend, or
allow_passive=True if the branch really is constant over the whole
trajectory.
The discrete adjoint is the method from:
R. Martins, E. Lakshtanov. A C++ implementation of the discrete adjoint sensitivity analysis method for explicit adaptive Runge-Kutta methods enabled by automatic adjoint differentiation and SIMD vectorization. Applied Mathematics and Computation, 2025. arXiv:2410.01911
src/bdf.{hpp,cpp} C++ library: KernelBlock, LUSolveBlock, drivers
src/bdf_selftest.cpp native checks, incl. the two Python cannot express
bindings/aadcbdf_pybind.cpp ONE type_caster — where gradients are won or lost
packaging/aadc_ode/ wheel: C++ extension + Python solvers (rk, adjoint)
tests/ every assertion is on a DERIVATIVE
ci/build.sh · ci/build.ps1 compile + link (no code generation step)
Build and test
. ci/pins.env && SDK_VER="$SDK_VERSION" SDK_SRC_VERSION="$SDK_SRC_VERSION" \
CORE_WHEEL_VERSION="$CORE_WHEEL_VERSION" bash ci/build.sh python3.10 python3.11 python3.12 python3.13 python3.14
pip install dist/aadc_ode-*.whl
pytest tests/ -q
A requested interpreter that is not installed is a fatal error (matching
ci/build.ps1). For a local run that should just build whatever is present,
set STRICT=0 to skip missing interpreters instead.
Windows: powershell -File ci\build.ps1 -Pythons 3.10,3.11,3.12,3.13,3.14, from
inside an MSVC environment. CI covers linux-x86_64, linux-aarch64,
macos-arm64 and windows-x64.
Use
import aadc, aadc_ode
lam = [1.0, 10.0, 100.0, 1000.0]
# 1. Record the RHS once, in ordinary Python.
k = aadc_ode.Kernel()
states, _ = k.begin(n_states=4)
k.end([-lam[i] * states[i] for i in range(4)])
# 2. Record the loop onto an outer tape. 100 steps -> 100 blocks, ONE kernel.
f = aadc.Functions()
f.start_recording()
y0 = [aadc.idouble(1.0) for _ in range(4)]
args = [v.mark_as_input() for v in y0]
xT = aadc_ode.bdf_solve(k, y0, dt=1e-3, n_steps=100, jac_lag=10)
cost = sum((x * x for x in xT[1:]), xT[0] * xT[0])
out = cost.mark_as_output()
f.stop_recording()
# 3. Replay and differentiate, at any point — not just the recording point.
ws = f.create_workspace()
for a in args:
ws.set_val(a, 1.0)
ws.forward()
ws.set_diff(out, 1.0)
ws.reverse()
print([ws.diff(a) for a in args])
begin hands back copies of the library-owned input variables, and that
direction is the whole design. An aadc-ng tape slot is keyed by the address
of its variable, and this binding marshals Real by value — so a
mark_states(y) taking your list would mark throwaway copies while you kept
using the originals. Zero gradients, nothing raised. With begin, your
expressions sit downstream of the real inputs and the adjoint reaches them.
Design notes
Four properties that affect how you can use this package, rather than how it came to be:
Lane-generic blocks. The compute blocks are ComputeBlockT, so a tape
containing them runs on a vector workspace as well as a scalar one. The
avx2_lanes self test drives four AVX2 lanes with four different initial
conditions and requires them to reproduce four scalar runs bitwise:
PASS avx2_lanes 4 lanes vs 4 scalar runs, worst |delta| = 0.000e+00
One reverse sweep per step, not one per state. A kernel block seeds every
output with the outer adjoint and reverses once, computing x̄ += Jᵀȳ directly
instead of assembling a full Jacobian. On a 27-state model that is one sweep
per step rather than 27.
Thread-safe replay. Each thread gets its own kernel replay workspace. The
concurrent_replay self test runs eight threads against one tape and requires
bitwise agreement with the sequential run.
The frozen Jacobian is an option, and it is an approximation. The
semi-implicit step's cached 1 - dt·J_ii is a record-time constant:
replaying with bumped inputs reuses the Jacobian captured while recording.
That is the standard semi-implicit trade — the Jacobian is a preconditioner,
not part of the answer — but it is an approximation to the derivative of the
scheme. freeze_jacobian=False turns it off; jac_lag=1 refreshes it every
step.
What is not differentiated
luSolve takes the LU factorisation and pivot vector as passive data and
differentiates only the right-hand side. That is the right split for a BDF
step — the iteration matrix is a preconditioner rebuilt from the cached
Jacobian, not a differentiable input — but it is a real limitation for anyone
wanting dx/dA. Adding it means differentiating the factorisation itself
(Ā = -x̄ xᵀ and friends), which is a separate piece of work.
Testing philosophy
Every test asserts a derivative. A binding that passivates Real, a second
libaadc-ng image, or a block whose reverse never reaches the outer tape all
produce values correct to the last digit and gradients of exactly zero — so a
value check proves nothing.
The stiff adjoints are checked against a closed form, not finite differences. By T = 0.1 the λ=1000 component has decayed to ~1e-60, and a central difference of a quantity that small is pure cancellation noise; FD gets that adjoint wrong by 0.15%, which would either fail a correct implementation or force a tolerance loose enough to accept a wrong one.
The avx2_lanes and concurrent_replay checks are native C++ and bound as
aadc_ode.selftest(). They have to be: aadc_ng's own Python
external-function block is scalar-only and its callbacks are
Jacobian-supplying, so a Python-only suite could not exercise either — and
those are precisely the capabilities this package adds.
Packaging
Per-interpreter (pybind11 is not abi3), on top of the abi3 aadc_ng,
bridged by the _aadc_ng._C_API capsule. This wheel ships no
libaadc-ng: it links the copy inside the installed aadc_ng wheel and finds
it again by RPATH ($ORIGIN/../aadc_ng, @loader_path/../aadc_ng, and on
Windows by import order — delvewheel is deliberately not run).
Recording state is thread-local inside libaadc-ng, so a second image gives
the extension and the aadc module private recording contexts. For this
package that failure would be total: every entry point either opens a
recording or records a block onto one someone else opened.
test_exactly_one_library_image asserts it directly.
Unlike aadc-example-pybind11 this build does not define
AADCNG_ALLOW_TO_PASSIVE_BOOL. That macro enables active-to-passive bool
conversions across the whole translation unit, and a package whose entire
purpose is keeping an exact adjoint through a stiff solver should not switch on
implicit passivation to compile itself. bdf.hpp includes only
<aadcNG/idoubleNG.h> — never the <aadcNG/aadcNG.h> umbrella — which keeps
the deleted iboolNG::operator bool() doing its job.
Licence and support
aadc-ode is distributed under the MatLogica EULA and depends on the aadc
core, which runs in Community Edition unless licensed — non-commercial and
academic use only. The full licence and the third-party notices travel inside
the wheel, under aadc_ode-<version>.dist-info/licenses/.
For commercial licensing, advanced features or support: matlogica.com · info@matlogica.com
Release files for aadc-ode 0.6.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 3.9 MB
Release files / aadc_ode-0.6.3-cp314-cp314-win_amd64.whl
| Download URL | aadc_ode-0.6.3-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 169.7 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
03a06dc5f58639481ece4a08032d122b390442a18a1e02dd7f6f58084be39084
|
|
BLAKE2b-256 checksum How to use checksums |
73200ef7ba39299c90ffdadbd22d76d50c4f29f2103c1ed5794f34040612ab31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | aadc_ode-0.6.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 219.9 kB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
12714a0a966e50c1cb39bd6d35fa530ec20e00d18d417c4dc138aa03212060e0
|
|
BLAKE2b-256 checksum How to use checksums |
7d99fb2e11dac84bc03a8c930d81b9056cb384d6d772ca04e848b44b988724f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | aadc_ode-0.6.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 208.0 kB |
| Tags | CPython 3.14 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
3d1a61107e125aed3c5f3d3b1d4d514241a5f87973047afc45b063f406205133
|
|
BLAKE2b-256 checksum How to use checksums |
bb01baa3b82618777597f8a81beaccb8b956556c823bbd37da5d4cf819bac391
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | aadc_ode-0.6.3-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 179.9 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b2a2355ea19384c7271822a342fbe968a98ad29f626ef9453d07725c45defbe9
|
|
BLAKE2b-256 checksum How to use checksums |
52a15505fd3fd696a32dd55a0e69a38664787bb17e16631c8b27ed44f54a3ec6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp313-cp313-win_amd64.whl
| Download URL | aadc_ode-0.6.3-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 165.8 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4fcb4b72a1a2415573123317147df3b62fb2d04e1b589ccac634e3e198ca7d70
|
|
BLAKE2b-256 checksum How to use checksums |
5143e8a950dec7a9f42f64ffd99011889d78c207d1a7189eda7a10feb5f4df9d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | aadc_ode-0.6.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 219.6 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
87c5b772b4d2785001bd37c29d1298aa121bc9069b69c89add9ee7793f3f4424
|
|
BLAKE2b-256 checksum How to use checksums |
61bd2b406aab180c2671762abb2587d16e1dd00df30012812e4daec285e5ed4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | aadc_ode-0.6.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 207.3 kB |
| Tags | CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
391f49fb1ab7472faf8ff1ed7e96edcfc3e9ec2547dce4ca5abc95c813d4a759
|
|
BLAKE2b-256 checksum How to use checksums |
db9ac166cbbc1eb614519c33e1079908157718975645ffff864ad2834a3c3c77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | aadc_ode-0.6.3-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 179.6 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ba91ee9ef8d2c071c82ff9fb694b9af9843c65b0ee884ac35989b76c3ee5217b
|
|
BLAKE2b-256 checksum How to use checksums |
b0a04bcefec8623b00b0cfcabd321ebae106d8dfabb0f2012d1869342f6e0ad8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp312-cp312-win_amd64.whl
| Download URL | aadc_ode-0.6.3-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 165.8 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
7ba412eea501a6d93c320c3f4184db978c9a0f33bb4e6e6353c8a8f20dfa5076
|
|
BLAKE2b-256 checksum How to use checksums |
58517d28a5a3572800a9e6c39a2f6338bf463867a985c62b8c3c2d6f84e1b78b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | aadc_ode-0.6.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 219.5 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
b84b7abbd97e137f9cd76711a7ad9c2fd7af3fc6817c0b542c016f99a94c661d
|
|
BLAKE2b-256 checksum How to use checksums |
5a00f1e155f6e9f0b3c4a44c706faff4da442795f862f9b3c2f28e079610ae9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | aadc_ode-0.6.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 207.2 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
61631e16e42cc349efdcfafb6bac12a88f4ec9241bd5342b736ec491ecc66488
|
|
BLAKE2b-256 checksum How to use checksums |
fd18709bfe1fcddd0572529d4daa50aae8c9ab24b8440acbdc004c6bf992fb56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | aadc_ode-0.6.3-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 179.5 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1c0d8b0f318cbee1260ec1a0af4f2cef90c9df00bc760ad72ca8e9ee19639910
|
|
BLAKE2b-256 checksum How to use checksums |
64fd442aecf9660d647ff2958c4d21e04a6b60e8a5141d57163516b47076ce1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp311-cp311-win_amd64.whl
| Download URL | aadc_ode-0.6.3-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 165.1 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8bf4f036a4f339f78408bbd897abdfc2f2e0bf4e535c87abbf3d3a8d0d4c1e7b
|
|
BLAKE2b-256 checksum How to use checksums |
b7a30bcc91d83ab5a0697c41e4d29632b3ddb704186ab34cb0370fa999e8a511
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | aadc_ode-0.6.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 218.4 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8cd531a5625f812b52e36edd22b289a05713d336fbd39b23e730f94850ff2538
|
|
BLAKE2b-256 checksum How to use checksums |
bea69b5a9e7b62b4927e2e2bcff549d1d001fb70655bf28b21b90e44dc02ebb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | aadc_ode-0.6.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 208.2 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
424e455e2002025ef6730a792fa5f94ecfb0437ba9850f974adfee1eeb3cc6ff
|
|
BLAKE2b-256 checksum How to use checksums |
222a451365fb6f822a965b9b9c66c34fcc2999a5a4f51eb9db85ec47ffd68579
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | aadc_ode-0.6.3-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 178.8 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
07686ce062d3e07229e1e5b9f975f41da4e435b9fa9c542de39929270003314e
|
|
BLAKE2b-256 checksum How to use checksums |
52d9961f33e69d7aabf56ac3ee91d02abe8bd279af3d4e9677239f704afc5f1f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp310-cp310-win_amd64.whl
| Download URL | aadc_ode-0.6.3-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 164.4 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
88e72b5f0b2ace36ac8e5e9a7de9acbd9458b45c46052becbf69c5dabb7488fc
|
|
BLAKE2b-256 checksum How to use checksums |
7c1d15be0ffb9f08b0e95dd00a1c706ac3b97c2b9a2c42a575a1d2489995148e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | aadc_ode-0.6.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 216.7 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
e7607ed87b323eea3b4f6db48c311a57021f1a3b56288c503a24f1dc40ca2b92
|
|
BLAKE2b-256 checksum How to use checksums |
95404401929a4f970b12fdc7ccfe8d627477b9f84a691d7544ce91b866c7099c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | aadc_ode-0.6.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 206.7 kB |
| Tags | CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
10dab165add465a397a1839bb7f4df8adf30383489149561219cb321071a3af7
|
|
BLAKE2b-256 checksum How to use checksums |
dbeb9b0608c29f53dccb1401a7c8f645fcf0622e01706cd7189adb16b0a59890
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|
Release files / aadc_ode-0.6.3-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | aadc_ode-0.6.3-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 177.5 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
61856cacecff04adc66b47ae4b374dfa3202d7377013d2acb27a8f522c81f0d3
|
|
BLAKE2b-256 checksum How to use checksums |
b7f5693ff468dfcc3cf59770ef4aaaeffe665fa6f15edf0819d22ded34441404
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.2
|