scrna_matrix
A cache-aligned sparse matrix engine for high-dimensional scRNA-seq.
Header-only C++20, built around a 64-byte cache-line-aligned block-compressed
sparse row format (Block_CSR<T>), with runtime-dispatched SIMD sparse
dot-product and cosine-similarity kernels and zero-copy pybind11
interoperability with NumPy and SciPy csr_matrix buffers.
Motivation
scRNA-seq datasets regularly exceed 1 million cells. Standard analysis frameworks store expression data as CSC or CSR matrices, but k-NN graph construction, cell-cell cosine distance and library-size normalization access that memory non-contiguously. The result is cache thrashing, and at scale an out-of-memory failure on hardware that should have been sufficient.
Block_CSR aligns its value and index arrays to cache-line boundaries and
exposes SIMD kernels tuned for sparse-vector operations, so these workloads stay
in cache. Equally important, it avoids duplicating data when crossing the
C++/Python boundary: a buffer that already satisfies the alignment invariant is
adopted in place rather than copied.
Directory structure
scrna_matrix/
├── CMakeLists.txt
├── docs/
│ ├── AUDIT.md # static-analysis and security review log
│ ├── BENCHMARKS.md
│ └── MANUSCRIPT.tex
├── include/matrix/
│ ├── block_csr.hpp # alignas(64) Block_CSR<T>, AlignedAllocator, adopt path
│ ├── knn_graph.hpp # exact brute-force k-NN and the HNSW pathway
│ └── simd_math.hpp # scalar/NEON/AVX2/AVX-512 kernels, runtime dispatch,
│ # WideAcc and checked_narrow
├── third_party/
│ └── hnswlib/ # vendored hnswlib v0.9.0 (Apache-2.0), locally patched
├── src/
│ └── python_bindings.cpp # pybind11 zero-copy bindings
├── tests/
│ ├── test_matrix_ops.cpp
│ ├── test_wide_accumulation.cpp # source scan; fails the build on a bare float acc
│ ├── test_hnsw_persist.cpp
│ ├── test_python_bindings.py
│ └── benchmark_1m_cells.py
└── examples/
├── scrna_anndata.py # scanpy-compatible neighbors()
└── scanpy_integration.ipynb
The vendored hnswlib is patched, not pristine. The patches are recorded in
third_party/hnswlib/VERSION.txt; the most important is patch 4, which threads
the ef search parameter through searchKnnWithEf so a query never writes
shared index state.
Build
Requires a C++20 compiler and CMake 3.20 or newer, and optionally OpenMP, Eigen3 and pybind11.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
ctest --test-dir build --output-on-failure
This produces build/test_matrix_ops and, when pybind11 is found, a
scrna_matrix_py*.so extension module importable from Python by adding build/
to PYTHONPATH. ctest runs both the C++ tests and, when pytest is available,
the binding tests.
Build a Debug configuration too when changing the engine. The alignment and
span-length invariants are assert-based and compile out under NDEBUG.
AVX-512 kernels are opt-in at configure time with -DSCRNA_ENABLE_AVX512=ON,
and AVX2 is compiled in automatically wherever the toolchain supports it. Both
are selected at runtime through CPUID, with per-function target attributes
rather than a whole-binary ISA flag, so enabling them does not make the binary
unrunnable on older CPUs.
OpenMP is mandatory for this module and configuration fails without it. This
is the one module in pto-core where a missing dependency is a hard error, and
it is deliberate. It used to be optional with a warning fallback, and the result
was that _OPENMP went undefined, every #pragma omp compiled to serial code,
and the suite reported 100% passed while never executing a parallel iteration. A
silently single-threaded engine that CI signs off on is worse than a build that
stops.
OpenMP on macOS
Apple's clang does not ship an OpenMP runtime, so find_package(OpenMP) fails
by default. With libomp installed from Homebrew or conda, point CMake at it:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
-DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I$PREFIX/include" \
-DOpenMP_CXX_LIB_NAMES=omp \
-DOpenMP_omp_LIBRARY=$PREFIX/lib/libomp.dylib \
-DCMAKE_BUILD_RPATH=$PREFIX/lib
Note -Xpreprocessor rather than -Xclang. The latter passes CMake's own
detection test and then fails to link, which is exactly the kind of
false-positive detection the hard-fail probe exists to catch. The configure
output reports which case you are in.
Python usage
import scrna_matrix_py as scrna
import scipy.sparse as sp
csr = sp.load_npz("cells.npz")
# to_aligned guarantees the 64-byte alignment that lets BlockCSR adopt these
# buffers in place. Without it, adoption still happens whenever NumPy's own
# allocation is already aligned (usual at realistic sizes) but is not guaranteed.
mat = scrna.BlockCSR.from_scipy_csr(
scrna.to_aligned(csr.data.astype("float32")),
scrna.to_aligned(csr.indices.astype("int32")),
scrna.to_aligned(csr.indptr.astype("int32")),
csr.shape[0], csr.shape[1],
)
print(mat.is_zero_copy, scrna.simd_isa()) # True scalar|avx2|avx512
graph = scrna.build_knn_graph(mat, k=15) # exact, O(n^2)
neighbor_idx, neighbor_sim, k = graph.to_numpy()
Do not .astype() your indices before handing them over. The narrowing
conversion at the NumPy boundary is range-checked in both entry points, and an
int64 column index that wraps during your own cast lands in range, so nothing
downstream can tell it was ever wrong.
A buffer is adopted only when it is provably immutable, and that is not fastidiousness. The AVX2 and AVX-512 gather kernels index a dense scratch buffer with the adopted column indices using unchecked hardware gathers. This means the bounds validation performed once at construction is the only thing standing between the inner loop and an arbitrary memory write, which is exactly why a buffer the caller can still mutate afterward may not be adopted at all.
Scaling past roughly 50k cells
method="hnsw" swaps the exact search for an HNSW index. The caveat that
matters is that hnswlib indexes dense vectors and has no sparse
representation, so it belongs on a reduced representation rather than raw gene
space:
# Recommended: approximate search on a PCA embedding.
graph = scrna.build_knn_graph_dense(X_pca.astype("float32"), k=15, method="hnsw")
# Check the cost before building; sparsity does not reduce it.
scrna.hnsw_index_bytes(1_300_000, 50) # 0.49 GB
scrna.hnsw_index_bytes(1_300_000, 2000) # 9.94 GB
Measured: 1.3M cells by 50 dimensions in 37.1 s at 1.01 GB peak RSS, including index construction and all 1.3M queries, against roughly 1.6 hours extrapolated for the exact path at about 3.5 ns per n-squared.
In 1,000-dimensional gene space the ordering inverts and HNSW is slower than exact, by 0.05x. Each HNSW distance touches 1,000 dense dimensions where the exact path touches roughly 60 non-zeros, so a smaller number of comparisons does not pay for their individual cost. On a 50-dimensional PCA embedding with real cluster structure, HNSW wins by 11.2x at 50,000 cells at a recall of 0.997. In other words, the representation and not the algorithm decides which backend wins, and this module states that rather than leaving you to rediscover it by benchmarking both.
HNSW results are approximate and not reproducible across multi-threaded runs.
Use method="brute" when you need ground truth or determinism.
Parameter bounds that are not arbitrary
| Parameter | Bound | Why |
|---|---|---|
HnswParams::M |
2 to 10,000 | The range hnswlib honours. Below it the library is undefined behaviour, since 1/log(1) is infinity cast to int. Above it hnswlib clamps silently and the index saves but cannot load. |
capacity |
at most 2,147,483,647 | KnnGraph neighbour ids are int32. Refused in both the constructor and the loader. |
k |
any | It is a row stride and is never clamped. Short rows keep the -1 sentinel, even though the candidate count asked of hnswlib is clamped. |
n_cols |
unbounded | A stated residual. A huge declared width fails as std::bad_alloc rather than a named error. |
Scanpy and AnnData
examples/scrna_anndata.py is a drop-in replacement for sc.pp.neighbors:
import scanpy as sc
from scrna_anndata import neighbors
adata = sc.datasets.pbmc3k()
# ... standard preprocessing ...
neighbors(adata, n_neighbors=15) # fills obsp/uns the way scanpy expects
sc.tl.leiden(adata) # works unchanged
See examples/scanpy_integration.ipynb for
the full worked example with live outputs.
Selecting the SIMD kernel
Dispatch is automatic. SCRNA_FORCE_ISA=scalar|avx2|avx512 overrides it for
testing, which is how every compiled path gets exercised on one machine.
Requesting a kernel the CPU cannot execute will fault, which is why it is
opt-in.
What this module does not do
Read this before planning work here, because the boundary is not obvious from the name.
There is no Matrix Market reader, no barcode or feature TSV reader, and no CLI. That parsing belongs to scanpy and anndata upstream of this module. There is also no per-cell or per-gene accumulator to overflow, which rules out a whole class of question people arrive with.
Status
Implemented and tested:
Block_CSR<T>cache-aligned layout, with structural validation (column indices bounds-checked at construction, which is what makes the gather kernels memory-safe) and an adopt-in-place path for buffers that already satisfy the alignment invariant.- Scalar, NEON, AVX2 and AVX-512 kernels for sparse cosine similarity, selected by runtime CPU dispatch.
- Exact brute-force k-NN with O(k) per-thread memory through a bounded top-k heap, and row norms hoisted out of the O(n^2) loop.
- Approximate k-NN via vendored hnswlib, with a memory guard that refuses oversized indices rather than thrashing, densification done one row at a time so the full dense matrix is never materialised, and distances routed through the runtime-dispatched kernels.
- Zero-copy Python interop in both directions, with
.is_zero_copyreporting which path was taken, and the GIL released during graph construction. - End-to-end AnnData integration writing
obsp['distances'],obsp['connectivities']anduns['neighbors']in scanpy's own layout, sosc.tl.leiden,umapandpagaconsume it directly, matchingsc.pp.neighborsneighbour for neighbour on pbmc3k.
Not done, and not to be quoted until it is:
- A like-for-like 1.3M-cell comparison against
scanpy.pp.neighbors. The scalability goal is met. The 20x-speedup and 60%-RSS claims are comparisons that have not been run. Note thatsc.pp.neighborson PCA is itself approximate and near-linear, so it is a peer ofmethod="hnsw"rather than a baseline the module should categorically dominate. - HNSW recall above 50k cells. It is 0.997 at 50k; beyond that there is no feasible exact baseline to measure against. There has been no HNSW parameter sweep at all, and every number uses the defaults.
- Throughput numbers for the AVX2 and AVX-512 kernels. They are compile- and correctness-verified but have not run on hardware that natively supports them, so every benchmark on record is from the scalar path.
- A structure-aware fuzzer over
from_scipy_csr. That is the entry point at which one of the audit's eleven findings, an unchecked narrowing conversion, was found by manual probing rather than by fuzzing.
Correctness rules specific to this module
Two of these are enforced by tests that read the source rather than run it, because a rule a human has to remember is a rule that gets broken in the next sibling function.
Accumulate floating-point reductions in WideAcc<T> and narrow once through
checked_narrow(). The intuition about why is wrong in an instructive way. A
bare float accumulator does not gradually lose precision on large input. It
saturates to infinity, the downstream non-finite guard maps that to a similarity
of zero, and two identical rows become each other's worst possible match. The
input was finite, no exception was raised, no diagnostic was printed, and the
neighbour graph is wrong. This is the module's most repeated defect: four
instances found by four different techniques across three review passes, none of
which was looking for it.
Two corollaries. Stay wide until the last operation, because
cosine_from_dot_wide(dot, na, nb) divides 1e60 by 1e60 and gets 1.0 where
narrowing the dot first gets infinity and reports 0. And do not add a
float acc = 0 at all: test_wide_accumulation.cpp scans the module's sources
and fails the build. A deliberate narrow accumulator marks itself
// SCRNA_FLOAT_ACC_OK: <why>, which is a grep target rather than a rubber
stamp. The four vector-kernel scalar tails are the only ones today, and they are
safe because the dispatchers recompute in double whenever a kernel returns a
non-finite result.
Size every KnnGraph through detail::checked_graph_slots(n, k). That
product also offsets every write, so an unchecked n * k is a wild store rather
than a small allocation. Brute force had the check. The four HNSW producers did
not.
Serialize index mutations. add_*, set_labels and save_index run under
write_mutex_, because add_* reads size() as its first label and hnswlib's
addPoint updates an existing label instead of failing. Two concurrent adds
silently kept half the cells. Queries deliberately do not take that lock:
hnswlib's search is safe against a concurrent insertion, and serializing queries
would forfeit exactly the parallel throughput that releasing the GIL exists to
provide.
This module's record is 18 confirmed defects, 4 of them High or Critical,
across the reviews and the 2026-09-11 audit and its second round. The two High
ones were silent: the unchecked n * k storing through a null pointer, and the
concurrent-mutation race leaving a perfectly valid index holding half its rows.
Round 2 also established by measurement rather than assertion that a zero-norm
vector produces no NaN anywhere (it scores a defined 0 and never displaces a
real neighbour), and that every CSR structural invariant already failed closed.
Two sanitizer notes for reproducing any of that: a UBSan suppression is inert
under -fno-sanitize-recover=all, so use -fno-sanitize=alignment for
hnswlib's known misaligned store; and AlignedAllocator rounds allocations up
to 64 bytes, so an ASan overread reproduction needs posix_memalign at the
exact size.
The Python binding layer's sanitizer coverage comes from Linux CI rather than
from a macOS host, and the reason is checkable rather than assumed: macOS System
Integrity Protection strips DYLD_* variables from a protected process before
it starts, and those variables are exactly what preload-based instrumentation of
a dynamically loaded Python extension requires.
Benchmarking
See docs/BENCHMARKS.md for datasets, metrics, the
baseline comparison protocol, and the two methodology pitfalls that make naive
comparisons misleading: numba JIT warm-up dominating a single first call, and a
graph built from X being a different computation from scanpy's PCA default.
tests/benchmark_1m_cells.py runs it.
docs/AUDIT.md is the module-level review log, with findings,
the evidence for each, and the items still open.
License
MIT, under the root ../../LICENSE. Vendored hnswlib is
Apache-2.0 and its grant is reproduced in
../../THIRD_PARTY_LICENSES.md.
Metadata
Release files for scrna-matrix 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scrna_matrix-0.1.7.tar.gz | 260.7 kB | Details |
Built distributions (wheels)
Total release size: 8.1 MB
Release files / scrna_matrix-0.1.7.tar.gz
| Download URL | scrna_matrix-0.1.7.tar.gz |
|---|---|
| Size | 260.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
42a49a7840b604d6c56ad89539df785eb5307a8501c8aa0b7094b542eaa13ddf
|
|
BLAKE2b-256 checksum How to use checksums |
5fb33f9ecc48cace3cb85f79eb94eb295f6fdb8483a0c7325f732e64c7e3e7ca
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 345.5 kB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
4d0a9445d0cab1a48d16e8abdd29f2ea7322f2f6fc22d89c468c854baf78a976
|
|
BLAKE2b-256 checksum How to use checksums |
412602c835e7af969ed82a07e0813178fa168640f8db54763babe054d677d9c1
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp313-cp313-manylinux_2_28_aarch64.whl
| Download URL | scrna_matrix-0.1.7-cp313-cp313-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 319.8 kB |
| Tags | CPython 3.13 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
0d52b9d9b1c91f82d38af6193af7811cd4a548e31c09694678d49dfd772285e2
|
|
BLAKE2b-256 checksum How to use checksums |
a0bcdca9ebe972fb4d4c7fef6e34cc0d7d1b56d6fafd423709a4c0e940646663
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp313-cp313-macosx_15_0_arm64.whl
| Download URL | scrna_matrix-0.1.7-cp313-cp313-macosx_15_0_arm64.whl |
|---|---|
| Size | 424.6 kB |
| Tags | CPython 3.13 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
bd8cd6a1bf7db9d6b14c82ebd6808c12a5277457acf0d5983e53afcc4879b0d1
|
|
BLAKE2b-256 checksum How to use checksums |
6f2e2408f9439798449a76e69d099cee9d2fbe4982f05be27461dc2b3adf10c0
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp313-cp313-macosx_14_0_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp313-cp313-macosx_14_0_x86_64.whl |
|---|---|
| Size | 476.0 kB |
| Tags | CPython 3.13 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
62c6239870ed6b0de99cce42e861b366dd76913057223e35f70ab65b56f3a9bf
|
|
BLAKE2b-256 checksum How to use checksums |
8cab4d5a87d4486ddb1f1ebc67f6395f4e066956134ab54e115713be64586b03
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 345.4 kB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
80582187a447edcb293ccf4dfd34c32e5d400eaa6b3aaa5662b13cc4d2794e43
|
|
BLAKE2b-256 checksum How to use checksums |
1f32c3cef353c9f208b8c937ac0b8388f6c22d1cd51c578cef665d7dd845fdba
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp312-cp312-manylinux_2_28_aarch64.whl
| Download URL | scrna_matrix-0.1.7-cp312-cp312-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 320.0 kB |
| Tags | CPython 3.12 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
7281ce419848f3d76cee07b08abab6d10e7e9b1df7f76160dc9a0ec8d03d8e84
|
|
BLAKE2b-256 checksum How to use checksums |
96049490655980e0d97355eb4652577136b5bca62acc77ab0a8d363d4a77ae39
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp312-cp312-macosx_15_0_arm64.whl
| Download URL | scrna_matrix-0.1.7-cp312-cp312-macosx_15_0_arm64.whl |
|---|---|
| Size | 424.6 kB |
| Tags | CPython 3.12 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4a39073eb075095fd8b6cb9cf6a0d3cb01be369b16e39e4b17c764b0e4a2f763
|
|
BLAKE2b-256 checksum How to use checksums |
7516ac6341b38ed400f775b548dcc201ae29282fb01b93e228b24b2cad69a3a5
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp312-cp312-macosx_14_0_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp312-cp312-macosx_14_0_x86_64.whl |
|---|---|
| Size | 475.9 kB |
| Tags | CPython 3.12 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
7b7ebbcfe23279488238210a4f413a7bb223aa2690c1e1f4873eaa67c4b81cb0
|
|
BLAKE2b-256 checksum How to use checksums |
d16c2b6b8969cb0f03890d5819647e077bdde09dba32c1172fc501ce5ec0b1ed
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp311-cp311-manylinux_2_28_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp311-cp311-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 343.9 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ba62ac6fdde1f91b5bbc11972e05849a8a35903526125d7101b987457ade24a5
|
|
BLAKE2b-256 checksum How to use checksums |
61e506b3f66474f2620462df200e433fe49d08e2b2fd2a365960c2f7cd4c0d91
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp311-cp311-manylinux_2_28_aarch64.whl
| Download URL | scrna_matrix-0.1.7-cp311-cp311-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 319.0 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
571323871c86b2b097453c1108317c558ecb6bb7d8ab94401601d13413df8617
|
|
BLAKE2b-256 checksum How to use checksums |
ac0608443d8ad86159bccf57f5d4aa18c4945c0b674901ab6b636404db47ede8
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp311-cp311-macosx_15_0_arm64.whl
| Download URL | scrna_matrix-0.1.7-cp311-cp311-macosx_15_0_arm64.whl |
|---|---|
| Size | 423.7 kB |
| Tags | CPython 3.11 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
94f2d72cf18ba0c7dd8a4284d072370b5c6edebe9997685fa1594b54cc6f735e
|
|
BLAKE2b-256 checksum How to use checksums |
d7fc090f4311b4ac3470aed33a68eeb96106053e0f49cbc0f5dcdf5980352634
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp311-cp311-macosx_14_0_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp311-cp311-macosx_14_0_x86_64.whl |
|---|---|
| Size | 474.4 kB |
| Tags | CPython 3.11 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
7d729e6796715b7c2c5b554a2ab9686dc66d49c0c11a6438045f44796f68ceb4
|
|
BLAKE2b-256 checksum How to use checksums |
d28ac2d821bd30103c8fef678ac97a05314d56f2d6f5bb336fcc1d78914ff903
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp310-cp310-manylinux_2_28_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp310-cp310-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 343.3 kB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
4046f93c1769869eac89000cc1e2bb0476b4de98d0a16dbb06bdb8864a8fa8bd
|
|
BLAKE2b-256 checksum How to use checksums |
16678003e38ef2a13c1d5c5ccd15aedaa988e8aaa56254be8bbea2ed96e28060
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp310-cp310-manylinux_2_28_aarch64.whl
| Download URL | scrna_matrix-0.1.7-cp310-cp310-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 318.2 kB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
9f7d3135e2a512f7161b1e542cb9b406a52f3a6ba7c89a90b59d97ffcb7d598c
|
|
BLAKE2b-256 checksum How to use checksums |
5f442877f8c87cfdd1c9b30d35303888b72beecad8217f56b48008acddb5a932
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp310-cp310-macosx_15_0_arm64.whl
| Download URL | scrna_matrix-0.1.7-cp310-cp310-macosx_15_0_arm64.whl |
|---|---|
| Size | 422.6 kB |
| Tags | CPython 3.10 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
dc4bb61ef126211cd6d79c149d0c6a9901515e60b70c3c0de4dd03fa3bd76499
|
|
BLAKE2b-256 checksum How to use checksums |
5849a93581f8c51f5f93d51593375d43e70a95aaca5ca80aa3bb937d59820f66
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp310-cp310-macosx_14_0_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp310-cp310-macosx_14_0_x86_64.whl |
|---|---|
| Size | 473.1 kB |
| Tags | CPython 3.10 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
f559d44626ad43a650ebbb4504cf99b628392df4441e3d7d6a90f05ef95946eb
|
|
BLAKE2b-256 checksum How to use checksums |
8e5bb87656bd379a05756d76bb0a60ac179b5814d24235bcfed3cf7d4d87e1f7
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp39-cp39-manylinux_2_28_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp39-cp39-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 343.4 kB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
438a3650cfc6b55b2045c194c2f9bd254f44e07a1a977e805b021bcf02c7846e
|
|
BLAKE2b-256 checksum How to use checksums |
3846fdc734115640db72d64998267dd9a73509bc328e5eb8f40350c210e59882
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp39-cp39-manylinux_2_28_aarch64.whl
| Download URL | scrna_matrix-0.1.7-cp39-cp39-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 318.6 kB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
6c816bae8e98fc23ac595a515cc562bba0d31684371088fec50a9c6fc464f1be
|
|
BLAKE2b-256 checksum How to use checksums |
b0ad6bf0e5ec52c83ef8978ae26bf5e236fce08d21636dd25c513c620c73fba4
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp39-cp39-macosx_15_0_arm64.whl
| Download URL | scrna_matrix-0.1.7-cp39-cp39-macosx_15_0_arm64.whl |
|---|---|
| Size | 422.7 kB |
| Tags | CPython 3.9 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d1512d7c14d335a6cb3223d0363d98ab9779bddddfce7833806fc5432a8aa09e
|
|
BLAKE2b-256 checksum How to use checksums |
99347726e42b2bab9711b7efcbd30f78c940af1382cbaeb4313c65cbc32560a2
|
| 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 20, 2026.
Transparency logRelease files / scrna_matrix-0.1.7-cp39-cp39-macosx_14_0_x86_64.whl
| Download URL | scrna_matrix-0.1.7-cp39-cp39-macosx_14_0_x86_64.whl |
|---|---|
| Size | 473.2 kB |
| Tags | CPython 3.9 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
2895f8cbb9891ba2314e6f9587075e37a9b9dbc80fbe312ab1365ca2fe8e0c3c
|
|
BLAKE2b-256 checksum How to use checksums |
614ffb32bbe32df3c63f9b8e49b60af35008021ae7c961ecfd36adb57b30d930
|
| 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 20, 2026.
Transparency log