Feature support matrix#
Note
This page is generated from dev/backend_support_data.json,
which is produced by dev/backend_support_sweep.py —
an automated sweep that invokes every public function in
saiunit.math, saiunit.linalg, saiunit.fft, and every
public Quantity method across each locally-installed backend
and records the outcome. Re-run the sweep and the renderer to
refresh this page.
Cell legend#
Glyph |
Meaning |
|---|---|
|
Verified: the call returned a value of the expected backend kind. |
|
Skipped: the backend’s array-API surface does not expose the underlying op,
or it rejects a keyword saiunit forwards (e.g. JAX-only |
|
Failed: the call raised an unexpected exception on this backend. |
|
Works with a caveat (e.g. lazy result on dask, expected |
|
JAX-only by design — gated by |
|
Not applicable to backend dispatch (dtype factories, dimension predicates). |
|
Not tested in this report. Cupy is always |
Sweep environment. Backends invoked: numpy, jax, torch, dask, ndonnx.
Backends shown but not tested: cupy.
High-level summary#
Subpackage |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
saiunit.math |
Full ✓ |
Full ✓ |
? |
Partial ⚠ |
Mostly ⚠ |
Partial ⚠ |
saiunit.linalg |
Full ✓ |
Full ✓ |
? |
Mostly ⚠ |
Partial ⚠ |
Limited ✗ |
saiunit.fft |
Full ✓ |
Full ✓ |
? |
Full ✓ |
Full ✓ |
Limited ✗ |
Quantity methods |
Mostly ⚠ |
Mostly ⚠ |
? |
Partial ⚠ |
Partial ⚠ |
Partial ⚠ |
saiunit.lax |
JAX-only 🅙 |
Full ✓ |
? |
JAX-only 🅙 |
JAX-only 🅙 |
JAX-only 🅙 |
saiunit.autograd |
JAX-only 🅙 |
Full ✓ |
? |
JAX-only 🅙 |
JAX-only 🅙 |
JAX-only 🅙 |
saiunit.sparse |
JAX-only 🅙 |
Full ✓ |
? |
JAX-only 🅙 |
JAX-only 🅙 |
JAX-only 🅙 |
Rating thresholds: Full ≥ 95 % pass and zero fail; Mostly ≥ 80 % pass;
Partial ≥ 30 % pass; Limited < 30 % pass; JAX-only = gated by
require_jax_backend.
Backend-specific notes#
jax — full feature set; default backend. All JAX-only subpackages (
saiunit.lax,saiunit.autograd,saiunit.sparse) require this backend.numpy — eager CPU computation through
array_api_compat.numpy. A handful of reductions (amax,amin,mean,nan*variants) fail when saiunit forwards awhere=Nonekwarg numpy can’t interpret. These are listed with footnotes in the math tables below.cupy — not tested in this report (no CUDA toolkit in the sweep environment). Cells are
?. Cupy’s array-API surface tracks numpy closely, so support is expected to mirror the numpy column, but this document does not claim it.torch — through
array_api_compat.torch. The torch array-API surface lacks several ops saiunit dispatches to (cbrt,digamma, someeinopsreductions,axes=for n-D FFTs) and rejects JAX-flavored kwargs (precision,symmetrize_input,tol). Affected calls are recorded as skip rather than fail.dask — lazy arrays. Reductions and most array ops succeed but the result remains lazy until
.compute(). Persaiunit._base_quantity, the Python castsfloat(q)/int(q)/operator.index(q)/np.asarray(q)/hash(q)and theQuantity.tolistmethod raiseBackendErrorto avoid silent materialization — these cells are⚠with the BackendError text in the footnote.Quantity.itemon dask raises a different error (the dask Array has no.item()method) so it appears as⊘rather than⚠. Methods likeQuantity.float/.doubleare.astypein disguise and stay lazy on dask, so they pass.ndonnx — symbolic graph-building backend. Many array-API ops (
fft.*, severallinalg.*, complex / specialty math) are not implemented and surface as⊘skip rows. Saiunit does not encode unit information into the ONNX graph.
JAX-only subpackages#
These subpackages dispatch directly to JAX primitives that have no
array-API equivalent. Each entry point is wrapped with
saiunit._jax_guard.require_jax_backend, which raises
BackendError on any non-jax mantissa.
saiunit.lax — 101 public callable(s); all require jax.
Probe result |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
all functions |
🅙 |
✓ |
? |
🅙 |
🅙 |
🅙 |
List of saiunit.lax functions
|
|
|
|
saiunit.autograd — 7 public callable(s); all require jax.
Probe result |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
all functions |
✓ |
✓ |
? |
✗ |
✗ |
✗ |
List of saiunit.autograd functions
|
|
|
|
saiunit.sparse — 10 public callable(s); all require jax.
Probe result |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
all functions |
🅙 |
✓ |
? |
🅙 |
🅙 |
🅙 |
List of saiunit.sparse functions
|
|
|
|
saiunit.math#
Public callables in saiunit.math that go through the multi-backend
dispatcher. Grouped by source submodule for readability.
array_creation — Array creation#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
keep_unit — Unit-preserving#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
change_unit — Unit-changing#
saiunit.math — Unit-changing: no functions in this group.
accept_unitless — Dimensionless-only#
saiunit.math — Dimensionless-only: no functions in this group.
remove_unit — Unit-removing#
saiunit.math — Unit-removing: no functions in this group.
saiunit.math#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [1] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [2] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [3] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [4] |
✓ |
⊘ [5] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [6] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [7] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [8] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [9] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [10] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [11] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [12] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [13] |
|
✓ |
✓ |
? |
⊘ [14] |
✓ |
⊘ [15] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [16] |
⊘ [17] |
⊘ [18] |
|
✓ |
✓ |
? |
✓ |
⊘ [19] |
⊘ [20] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [21] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [22] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [23] |
|
✓ |
✓ |
? |
⊘ [24] |
✓ |
⊘ [25] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [26] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [27] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [28] |
✓ |
⊘ [29] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [30] |
✓ |
⊘ [31] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
⊘ [32] |
✓ |
⊘ [33] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [34] |
⊘ [35] |
|
✓ |
✓ |
? |
⊘ [36] |
✓ |
⊘ [37] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [38] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [3] |
|
✓ |
✓ |
? |
⊘ [39] |
⊘ [40] |
✗ [3] |
|
✓ |
✓ |
? |
⊘ [41] |
⊘ [42] |
⊘ [43] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [45] |
|
✓ |
✓ |
? |
⊘ [46] |
⊘ [47] |
⊘ [48] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [49] |
|
✓ |
✓ |
? |
✓ |
⊘ [50] |
⊘ [51] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [52] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [52] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [53] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [54] |
|
✓ |
✓ |
? |
⊘ [55] |
✓ |
⊘ [56] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [57] |
|
✓ |
✓ |
? |
⊘ [58] |
⊘ [59] |
⊘ [60] |
|
✓ |
✓ |
? |
✓ |
⊘ [61] |
⊘ [62] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [63] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [64] |
✓ |
⊘ [65] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [66] |
✓ |
⊘ [67] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [68] |
|
✓ |
✓ |
? |
✓ |
⊘ [69] |
⊘ [70] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [71] |
|
✓ |
✓ |
? |
⊘ [72] |
✓ |
⊘ [73] |
|
⊘ [74] |
✓ |
? |
⊘ [75] |
⊘ [74] |
⊘ [76] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [77] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
⊘ [78] |
✓ |
⊘ [79] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [80] |
✓ |
⊘ [81] |
|
✓ |
✓ |
? |
⊘ [82] |
⊘ [83] |
⊘ [84] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [85] |
✓ |
⊘ [86] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [87] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [88] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [89] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [90] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [91] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [92] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [93] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✗ [94] |
⊘ [95] |
|
✓ |
✓ |
? |
✓ |
⊘ [96] |
⊘ [97] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [98] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
⊘ [99] |
⊘ [100] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [101] |
|
✓ |
✓ |
? |
✓ |
⊘ [102] |
⊘ [103] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [104] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
⊘ [105] |
⊘ [106] |
⊘ [107] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [3] |
|
✓ |
✓ |
? |
✓ |
⊘ [108] |
⊘ [109] |
|
✓ |
✓ |
? |
⊘ [110] |
⊘ [111] |
⊘ [112] |
|
✓ |
✓ |
? |
⊘ [113] |
⊘ [114] |
⊘ [115] |
|
✓ |
✓ |
? |
⊘ [116] |
✓ |
⊘ [117] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [118] |
|
✓ |
✓ |
? |
⊘ [119] |
⊘ [120] |
⊘ [121] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [122] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [123] |
⊘ [124] |
|
✓ |
✓ |
? |
✓ |
⊘ [125] |
⊘ [126] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [127] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [128] |
✓ |
⊘ [129] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [130] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [131] |
⊘ [132] |
⊘ [133] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [134] |
⊘ [135] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✗ [136] |
⊘ [137] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [138] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
⊘ [139] |
✓ |
⊘ [140] |
|
✓ |
✓ |
? |
⊘ [141] |
✓ |
⊘ [142] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [143] |
⊘ [144] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [145] |
|
✓ |
✓ |
? |
⊘ [146] |
✓ |
⊘ [147] |
|
✓ |
✓ |
? |
⊘ [148] |
✓ |
⊘ [149] |
|
✓ |
✓ |
? |
⊘ [150] |
✓ |
⊘ [151] |
|
✓ |
✓ |
? |
⊘ [152] |
✓ |
⊘ [153] |
|
✓ |
✓ |
? |
⊘ [154] |
✓ |
⊘ [155] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [156] |
|
✓ |
✓ |
? |
✓ |
✗ [157] |
⊘ [158] |
|
✓ |
✓ |
? |
⊘ [159] |
✓ |
⊘ [160] |
|
✓ |
✓ |
? |
⊘ [161] |
✓ |
⊘ [162] |
|
✓ |
✓ |
? |
⊘ [163] |
✓ |
⊘ [164] |
|
✓ |
✓ |
? |
⊘ [165] |
✓ |
⊘ [166] |
|
✓ |
✓ |
? |
⊘ [167] |
✓ |
⊘ [168] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [169] |
|
✓ |
✓ |
? |
⊘ [170] |
✓ |
⊘ [171] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [172] |
|
✓ |
✓ |
? |
⊘ [173] |
✓ |
⊘ [174] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [175] |
✓ |
⊘ [176] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [177] |
✓ |
⊘ [178] |
|
✓ |
✓ |
? |
⊘ [179] |
✓ |
⊘ [180] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [181] |
|
✓ |
✓ |
? |
⊘ [182] |
✓ |
⊘ [183] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [184] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [3] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [185] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [186] |
✓ |
⊘ [187] |
|
✓ |
✓ |
? |
⊘ [188] |
✓ |
⊘ [189] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [190] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [191] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [192] |
✓ |
⊘ [193] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [194] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
⊘ [19] |
⊘ [20] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
⊘ [195] |
✓ |
⊘ [195] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [196] |
|
✓ |
✓ |
? |
🅙 |
🅙 |
🅙 |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [197] |
|
✓ |
✓ |
? |
⊘ [198] |
✓ |
⊘ [199] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [200] |
✓ |
⊘ [201] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [202] |
✓ |
⊘ [203] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [204] |
✓ |
⊘ [205] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [206] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [207] |
|
✓ |
✓ |
? |
✓ |
⊘ [208] |
⊘ [209] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [210] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [211] |
⊘ [212] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [191] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
jax.numpy#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
numpy#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
brainstate.math#
Non-dispatched helpers#
These names live under saiunit.math for convenience but do not
dispatch on backend — they are dtype factories (re-exported from
jax.numpy) or pure-Python predicates / introspection helpers over
Quantity / Unit objects. Behavior is identical on every
backend.
|
|
|
|
saiunit.linalg#
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [214] |
|
✓ |
✓ |
? |
✓ |
⊘ [215] |
⊘ [216] |
|
✓ |
✓ |
? |
✓ |
⊘ [50] |
⊘ [51] |
|
✓ |
✓ |
? |
✓ |
⊘ [217] |
⊘ [218] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [63] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [68] |
|
✓ |
✓ |
? |
⊘ [219] |
⊘ [220] |
⊘ [221] |
|
✓ |
✓ |
? |
⊘ [222] |
⊘ [223] |
⊘ [224] |
|
✓ |
✓ |
? |
⊘ [219] |
⊘ [220] |
⊘ [221] |
|
✓ |
✓ |
? |
⊘ [222] |
⊘ [223] |
⊘ [224] |
|
✓ |
✓ |
? |
✓ |
⊘ [108] |
⊘ [109] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [225] |
|
✓ |
✓ |
? |
✓ |
⊘ [123] |
⊘ [124] |
|
✓ |
✓ |
? |
✓ |
⊘ [226] |
⊘ [227] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [228] |
|
✓ |
✓ |
? |
✓ |
⊘ [134] |
⊘ [135] |
|
✓ |
✓ |
? |
✓ |
⊘ [229] |
⊘ [230] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [231] |
|
✓ |
✓ |
? |
✓ |
⊘ [143] |
⊘ [144] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [232] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [172] |
|
✓ |
✓ |
? |
✓ |
⊘ [233] |
⊘ [234] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [227] |
|
✓ |
✓ |
? |
✓ |
⊘ [235] |
⊘ [227] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [236] |
|
✓ |
✓ |
? |
⊘ [237] |
⊘ [238] |
⊘ [239] |
|
✓ |
✓ |
? |
⊘ [237] |
⊘ [238] |
⊘ [239] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [240] |
⊘ [241] |
|
✓ |
✓ |
? |
✓ |
⊘ [242] |
⊘ [243] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [197] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [210] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [244] |
saiunit.fft#
Routing varies inside saiunit.fft: _fft_change_unit.py calls
saiunit._backend.get_backend() directly (e.g. for fftfreq /
rfftfreq), while _fft_keep_unit.py delegates to the math
package’s _fun_keep_unit_unary helper and inherits its dispatch.
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [245] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [246] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [247] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [248] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [249] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [250] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [251] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [252] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [253] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [254] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [255] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [256] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [257] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [258] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [247] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [259] |
Quantity methods#
Methods on saiunit.Quantity itself. .to_<backend>() methods
ignore the current backend and convert to the named one — cells show
⊘ when the target backend isn’t installed in the sweep environment.
Materialization is documented above (see Backend-specific notes).
Quantity.tolist on dask is the one method that raises
BackendError from saiunit’s own guard (⚠).
.item reports ⊘ on dask / ndonnx because the underlying array
object does not expose .item().
Function |
numpy |
jax |
cupy |
torch |
dask |
ndonnx |
|---|---|---|---|---|---|---|
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [260] |
⊘ [261] |
⊘ [262] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [44] |
|
✓ |
✓ |
? |
⊘ [260] |
⊘ [261] |
⊘ [262] |
|
✓ |
✓ |
? |
✗ [263] |
✗ [264] |
✗ [265] |
|
✓ |
✓ |
? |
⊘ [266] |
⊘ [267] |
⊘ [268] |
|
⊘ [269] |
⊘ [269] |
? |
⊘ [269] |
⊘ [269] |
⊘ [269] |
|
⊘ [270] |
⊘ [270] |
? |
⊘ [270] |
⊘ [270] |
⊘ [270] |
|
✓ |
✓ |
? |
⊘ [271] |
✓ |
⊘ [53] |
|
✓ |
✓ |
? |
⊘ [272] |
✓ |
⊘ [273] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [274] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✗ [263] |
✗ [275] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [277] |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [278] |
⊘ [278] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
⊘ [279] |
⊘ [279] |
? |
⊘ [279] |
⊘ [279] |
⊘ [279] |
|
✓ |
✓ |
? |
⊘ [163] |
✓ |
⊘ [164] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [280] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [177] |
✓ |
⊘ [178] |
|
✓ |
✓ |
? |
✗ [263] |
⊘ [281] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [184] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✗ [263] |
✗ [275] |
✗ [282] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
⊘ [283] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
⊘ [284] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
⊘ [285] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
⊘ [286] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
⊘ [287] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
⊘ [283] |
✗ [276] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✗ [263] |
✗ [275] |
✗ [265] |
|
✓ |
✓ |
? |
⊘ [288] |
✓ |
✗ [289] |
|
✓ |
✓ |
? |
✗ [290] |
✓ |
✗ [291] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
⊘ [292] |
|
✓ |
✓ |
? |
✓ |
✗ [293] |
✓ |
|
✓ |
✓ |
? |
✗ [294] |
✓ |
✗ [295] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
⊘ [296] |
⊘ [296] |
? |
⊘ [296] |
⊘ [296] |
⊘ [296] |
|
✓ |
✓ |
? |
✗ [263] |
✓ |
✗ [265] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✗ [297] |
|
✓ |
⊘ [298] |
? |
⊘ [299] |
⊘ [300] |
✓ |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✓ |
✗ [301] |
✗ [302] |
|
✓ |
✓ |
? |
✓ |
⚠ [303] |
⊘ [304] |
|
✓ |
✓ |
? |
⊘ [305] |
✓ |
⊘ [306] |
|
✓ |
✓ |
? |
⊘ [198] |
✓ |
⊘ [307] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
? |
? |
? |
? |
? |
? |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
✗ [263] |
✗ [275] |
✗ [265] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
|
✓ |
✓ |
? |
⊘ [308] |
✓ |
⊘ [309] |
|
✓ |
✓ |
? |
✓ |
✓ |
✓ |
Coverage statistic#
Subpackage |
Mapped |
Non-dispatched |
Unmapped |
Total |
|---|---|---|---|---|
saiunit.math |
294 |
47 |
0 |
341 |
saiunit.linalg |
35 |
0 |
0 |
35 |
saiunit.fft |
16 |
0 |
0 |
16 |
Quantity |
78 |
0 |
1 |
79 |
Mapped = functions the sweep actually invoked.
Non-dispatched = type factories / predicates that don’t go
through backend dispatch.
Unmapped = no call pattern registered (will appear as ? in tables).
How this was produced#
dev/backend_support_sweep.py walks every public callable in the
subpackages above, picks a calling pattern from an in-script registry,
and invokes the function under with saiunit.using_backend(b) for
each backend b in the local environment. Outcomes are classified
as pass / skip / fail / warn / unmapped / na and
written to dev/backend_support_data.json.
dev/backend_support_render.py (this script’s source) reads that
JSON and emits the rst file you are currently reading. To refresh:
PYTHONPATH=. python dev/backend_support_sweep.py
PYTHONPATH=. python dev/backend_support_render.py
JAX-only subpackages are probed with one representative function per
subpackage rather than enumerated — every entry point in
saiunit.lax / .autograd / .sparse is gated identically.