Skip to main content

Smith-Waterman and Needleman-Wunsch alignments with a nanobind C++23 backend.

Project description

stride-align

stride-align is a blazing fast library to tell you how "similar" two strings are. It does this by implementing the Smith-Waterman and Needleman-Wunsch algorithms. Instead of giving you a lecture, we're going to learn by doing. Let's dive right into how it works.

Installation

pip install stride-align

On Loongson systems, install NumPy from your Linux distribution before installing stride-align, and grab the LoongArch64 wheel from the GitHub release instead of PyPI (PyPI does not yet accept the linux_loongarch64 or manylinux_2_38_loongarch64 platform tags):

sudo apt install python3-numpy

PY=$(python3 -c 'import sys; print(f"cp{sys.version_info.major}{sys.version_info.minor}")')
pip install \
  https://github.com/adamdeprince/stride-align/releases/download/v0.2.0/stride_align-0.2.0-${PY}-${PY}-linux_loongarch64.whl

Prebuilt LoongArch64 wheels are available for Python 3.10, 3.11, 3.12, 3.13, and 3.14. If you are on a different Python (or just want to build from source), pip install stride-align falls back to the source distribution on PyPI, which compiles the LSX/LASX kernels locally.

First, just a disclaimer: I'm not using religious texts here to push an agenda - for this demo I need multiple largish public domain documents that have the same meaning but are phrased differently. The Bible just happens to fit that demo requirement freakishly well.

Imagine we have two sentences - let's use the first sentence in Genesis for this:

In the American Standard Version we have: "In the beginning God created the heavens and the earth."

In the King James Version we have: "In the beginning God created the heaven and the earth."

We can see with our eyes there's a difference - heavens vs heaven. But how do we quantify this difference? We'd use this little bit of code:

import stride_align as sa

print(sa.smith_waterman_normalized_score(
      "In the beginning God created the heavens and the earth.",
      "In the beginning God created the heaven and the earth."))

When we run this it prints:

0.9907407407407407

Normalized scores are between 0 and 1. A score of 1 means the inputs are an exact match under the default scoring model. Scores near 0 mean the inputs have little in common, though Smith-Waterman may still find small local matches inside otherwise unrelated strings.

Now let's change the text and see what happens to the score.

import stride_align as sa

print(sa.smith_waterman_normalized_score(
      "In the beginning God created the heavens and the earth.",
      "The quick brown fox jumped over the lazy dog."))

and Python prints

0.12222222222222222

Starting to get the idea? The more similar the strings, the higher the score.

Let's build a bigger example, something that gives us a feel for the library's performance. You'll probably notice that we switch between Smith-Waterman and Needleman-Wunsch and may be wondering which to use when. Use Needleman-Wunsch when you want to compare the whole input against the whole input. Use Smith-Waterman when you want to find the best matching region inside larger inputs.

Okay, let's move on to the demo code. You need requests for this part of the demo:

pip install requests
import os, time, requests
import stride_align as sa

if not os.path.exists("kjv.txt"):
    response = requests.get("https://openbible.com/textfiles/kjv.txt")
    response.raise_for_status()
    response.encoding = "utf-8-sig"
    open("kjv.txt", "w", encoding="utf-8").write(response.text)

lines = [line.strip().lower() for line in open("kjv.txt")][2:]

while True:
    if not (query := input("Enter a snippet to match.  Press enter to end.\n")):
        break
    t = time.perf_counter()
    scores = sa.needleman_wunsch_normalized_scores(query.lower(), lines)
    best = int(scores.argmax())
    print()
    print("Score:", float(scores[best]))
    print(lines[best])
    print("Search time: %0.2fms" % ((time.perf_counter() - t) * 1000))
    print()
    print()

Now how can we use this? Suppose we have a random Bible verse and want to know what chapter and verse it comes from. grep you say? Oh, heavens, no, we made a mistake. The verse we have is from a different translation, say the Catholic Public Domain, and what we have on our computer is the King James Bible. grep's exact string matching won't work here. How do we find the chapter and verse? We search for the "closest" or "most similar" string using stride-align, of course.

In our demo the first part concerns itself with downloading and caching. The good folks at Open Bible put this text where it's HTTP-reachable, but we want to be respectful of their IT budget so we cache what we download. It's just good citizenship.

In the next part we load all of the lines into a list. We remove newlines and make everything lower case because we don't want to get all fiddly about whether we're holding the shift key.

Lastly that while True: loop collects a line of text, presumably the Bible verse from the Catholic version of the Bible we want to look up the chapter and verse for, and matches it against all of the lines in the King James Bible using the batch form of Needleman-Wunsch. It returns an array of scores. We use argmax() to find the best-scoring line and then print the line associated with that index. Let's try it.

I'm going to use Jeremiah 4:28 from the Catholic Bible - it's actually quite different from the same verse in the King James Bible. Let's see what happens ...

$ python3 demo2.py
Enter a snippet to match.  Press enter to end.
The earth will mourn, and the heavens will lament from above. For I have spoken, I have decided, and I have not regretted. Neither will I be turned away from it.

Score: 0.3598901098901099
jeremiah 4:28	for this shall the earth mourn, and the heavens above be black: because i have spoken [it], i have purposed [it], and will not repent, neither will i turn back from it.
Search time: 206.51ms

... and we found it! And pretty quickly too.

Now let's do another demo: spell checking.

This is a toy spell checker, not a production one. It ignores punctuation, capitalization, word frequency, proper nouns, and context. The point is to show the same one-query-against-many-candidates pattern on a familiar task.

import os, sys
import stride_align as sa

paths = ['/usr/share/dict/words',
         '/usr/dict/words',
         '/var/lib/dict/words',
         '/etc/dictionaries-common/words']

for path in paths:
    if os.path.exists(path):
        break
else:
    print("Sorry, I can't find your dictionary", file=sys.stderr)
    exit(1)


words = [line.strip().lower() for line in open(path)]


for line in sys.stdin:
    new_line = []
    for word in line.split():
        scores = sa.needleman_wunsch_normalized_scores(word.lower(), words)
        word = words[int(scores.argmax())]
        new_line.append(word)
    print(' '.join(new_line), flush=True)

The first thing this script does is try to find our operating system's list of correctly spelled words. Its location can vary from distribution to distribution. Once we've found it, we load it, strip off newlines and start the act of spell checking.

The spell checking looks a lot like the matching we did before. For each candidate word, we match it against all of the words in our list of correctly spelled words, use argmax() to find the highest-scoring candidate, and replace the word with that candidate. We could speed things up with some optimizations, like not searching for a match for correctly spelled words, but this is a demo and that optimization is left as an exercise for the reader.

Let's see how it works!

$ cat - | python3 demo3.py
this is a demonstrtion of a spel checker
it doesn't matter that I can't spell corectly

this is a demonstration of a spell checker
it doesn't matter that i can't spell correctly

Details

The current scaffold provides:

  • Needleman-Wunsch score-only alignment
  • Needleman-Wunsch alignment with traceback
  • Smith-Waterman score-only alignment
  • Smith-Waterman alignment with traceback
  • A backend layout that matches the specialization pattern used in massive-speedup
  • CPU/backend detection and Python-side backend dispatch

The native boundary accepts:

  • bytes against bytes
  • str against str
  • sequences of immutable hashable Python objects
  • mixed sequence/object inputs where a str or bytes side is treated as a sequence

Direct bytes versus str pairs raise TypeError.

The current implementations are generic dynamic-programming kernels with preprocessing that serializes Python inputs into 8, 16, 32, or 64-bit token streams. SIMD-specialized backends can replace the backend translation units later without changing the Python API.

Score-only functions return numeric scores. The normalized variants return scores between 0 and 1. Path functions return alignment result objects containing the score, aligned values, operations, and CIGAR-style summaries where available.

API

import stride_align

score = stride_align.needleman_wunsch_score("ACGT", "ACCT")
scores = stride_align.Scores("ACGT", variant="needleman_wunsch").compare(["ACCT", "AGGT"])
result = stride_align.smith_waterman_path("ACCGT", "CCG")
wide_result = stride_align.smith_waterman_path("ACCGT", "CCG", width=64)
object_result = stride_align.needleman_wunsch_path(
    [frozenset({1}), frozenset({2})],
    [frozenset({1}), frozenset({3})],
)

print(score)
print(scores)
print(result.score, result.aligned_query, result.aligned_target, result.operations)
print(wide_result.score)
print(object_result.aligned_query, object_result.aligned_target)

Use Scores(...).compare([...]) or the *_scores() functions for one-query against many-target score workloads. That path prepares the query/profile once and is the preferred performance API for repeated English/Chinese text comparisons.

Traceback outputs preserve the paired fast-path type:

  • str inputs return aligned str
  • bytes inputs return aligned bytes
  • sequence/object inputs return aligned tuple values with None gaps

Pass width=8, 16, 32, or 64 to force the internal token/scoring width instead of using automatic selection.

Some functions expose CIGAR strings, short for "Concise Idiosyncratic Gapped Alignment Report". CIGAR is the compact alignment-operation notation used by SAM/BAM tooling. If you want the full formal version, see the SAM specification.

Levenshtein and Damerau-Levenshtein

Beyond Smith-Waterman and Needleman-Wunsch, stride-align exposes two unit-cost edit-distance metrics with their own SIMD-batched code paths:

import stride_align

# Levenshtein (Myers 1999 bit-parallel) — inserts, deletes, substitutes
stride_align.levenshtein_score("kitten", "sitting")               # -> 3
stride_align.levenshtein_normalized_score("kitten", "sitting")    # -> 0.571...
stride_align.levenshtein_scores("kitten", ["kit", "sitting"])     # -> ndarray[int64]
stride_align.levenshtein_normalized_scores("kitten", targets)     # -> ndarray[float64]

# Optional `score_cutoff` (rapidfuzz convention): bail early per-target,
# results that exceed the cutoff come back as `cutoff + 1`.
stride_align.levenshtein_scores(query, targets, score_cutoff=3)

# Damerau-Levenshtein (OSA-restricted, Hyyrö 2002) — adds adjacent
# transposition at unit cost. This is what rapidfuzz exposes as
# OSA.distance and is what most callers asking for
# "Damerau-Levenshtein" actually want.
stride_align.damerau_levenshtein_score("ab", "ba")                # -> 1
stride_align.damerau_levenshtein_scores(query, targets)           # -> ndarray[int64]

Both algorithms use a bit-parallel Myers-style inner loop. The batch variants pack one target per SIMD lane (*_scores) and currently specialize on every architecture's primary 64-bit-lane SIMD:

  • x86: SSE4.1 / AVX2 / AVX-512 / AVX10-256 / AVX10-512
  • ARM: NEON (Linux + macOS), SVE / SVE2
  • LoongArch: LSX / LASX
  • PowerPC: VSX

Patterns up to 64 chars run a single-word Myers; 65-256 chars use the multi-word kernel (W=2/3/4). Beyond 256, the implementation falls through to a scalar bit-parallel dispatch.

See BENCHMARK.md for cross-architecture numbers.

Optimizations and Benchmarks

Careful attention has been, and continues to be, paid to stride-align's performance story. The library includes SIMD optimization for a variety of common targets, including x86, Arm, and LoongArch.

LoongArch / Loongson. The Loongson optimization story is especially telling: for the checked benchmark case -- English text, 16-bit score width, score-only Smith-Waterman -- the LASX backend is 16x faster than the generic backend and 22.4x faster than Parasail.

If you are a researcher using Loongson servers and benefiting from this speedup, citations, bug reports, benchmark cases, and tiny inexpensive Chinese souvenirs are appreciated. Tea, calligraphy bookmarks, paper-cut ornaments, Chinese knot charms, panda keychains, and small dragon desk objects are all welcome. Please do not send anything expensive or anything that requires customs paperwork.

See complete benchmarks.

Native Microbench

For perf profiling without Python frames or benchmark orchestration, configure a native x86 microbench build:

nanobind_dir="$(.venv/bin/python -m nanobind --cmake_dir)"
cmake -S . -B build/perf \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DSTRIDE_ALIGN_BUILD_MICROBENCH=ON \
  -DSTRIDE_ALIGN_PERF_SYMBOLS=ON \
  -DPython_EXECUTABLE=.venv/bin/python \
  -Dnanobind_DIR="$nanobind_dir"
cmake --build build/perf --target stride_align_x86_microbench
build/perf/stride_align_x86_microbench --backend avx2 --shape 1:many --pass english --width 16
python tools/x86_microbench_regression.py \
  --binary build/perf/stride_align_x86_microbench \
  --cpu 2 \
  --backends avx2,avx512bwvl \
  --shapes 1:1,1:many \
  --passes english,chinese \
  --widths 16,32 \
  --write-json /tmp/stride-align-x86-microbench.json
.venv/bin/python tools/pinned_benchmark_sweep.py \
  --output-dir /tmp/stride-align-pinned \
  --cpu 2 \
  --iterations 15 \
  --warmups 3

STRIDE_ALIGN_PERF_SYMBOLS=ON keeps nanobind modules unstripped and adds debug symbols plus frame pointers while preserving -O3.

The checked-in native microbench baseline lives at benchmarks/x86_microbench_baseline.json. Treat it as a local guardrail with a loose threshold, not as a cross-machine SLA.

Citations

If you use my software in your research, please cite me.

@software{deprince_stride_align,
  author       = {DePrince, Adam},
  title        = {stride-align: Fast Smith-Waterman and Needleman-Wunsch alignment for Python},
  year         = {2026},
  publisher    = {GitHub},
  url          = {https://github.com/adamdeprince/stride-align},
  note         = {Python/C++ library for sequence and string alignment}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stride_align-0.2.0.tar.gz (35.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

stride_align-0.2.0-cp314-cp314-manylinux_2_39_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ ARM64

stride_align-0.2.0-cp314-cp314-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ppc64le

stride_align-0.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stride_align-0.2.0-cp314-cp314-macosx_15_0_arm64.whl (723.0 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

stride_align-0.2.0-cp313-cp313-manylinux_2_39_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ ARM64

stride_align-0.2.0-cp313-cp313-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ppc64le

stride_align-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stride_align-0.2.0-cp313-cp313-macosx_15_0_arm64.whl (723.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

stride_align-0.2.0-cp312-cp312-manylinux_2_39_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ ARM64

stride_align-0.2.0-cp312-cp312-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ppc64le

stride_align-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stride_align-0.2.0-cp312-cp312-macosx_15_0_arm64.whl (721.8 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

stride_align-0.2.0-cp311-cp311-manylinux_2_39_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ ARM64

stride_align-0.2.0-cp311-cp311-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ppc64le

stride_align-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stride_align-0.2.0-cp311-cp311-macosx_15_0_arm64.whl (723.5 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

stride_align-0.2.0-cp310-cp310-manylinux_2_39_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ ARM64

stride_align-0.2.0-cp310-cp310-manylinux_2_34_ppc64le.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ppc64le

stride_align-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stride_align-0.2.0-cp310-cp310-macosx_15_0_arm64.whl (725.4 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file stride_align-0.2.0.tar.gz.

File metadata

  • Download URL: stride_align-0.2.0.tar.gz
  • Upload date:
  • Size: 35.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for stride_align-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f173c8d360148869432ebb0111ddd4638f6f62cc3d761e776218b4fae3e0585f
MD5 0ba30076396be4b3ee0e1505c97d01d8
BLAKE2b-256 478d88c7e1f6d83902549fc3bbc8fd88fd19efe7f722bff723042a4b904917f9

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp314-cp314-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp314-cp314-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 6b787c536584a3085810d8f9847d2f9dff484da26dcf1c98ebda08e2c26b1f8e
MD5 f728e459267394c403897c72fe5fd745
BLAKE2b-256 cacedd41122026eef9095f7b2cd33da1ed220d0b0f87df4ca8925aae0a6bbfe7

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp314-cp314-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp314-cp314-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 27e55b1e84d612f5f0cc531bc9b1d7184c905d02f18510b1fb2351279fb001b2
MD5 9f3553bd459c419d2fbf3a647c5552e9
BLAKE2b-256 06e7675540a0f8c8b0312b8309e8caba92d17985d150f517394eb39c664f3a38

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8e6a67087ea4b54d85f7f9ff175191f79ff0b3206d9f964ab1b40ddb5594e6ff
MD5 75863930cd0e3c494829a389d780239e
BLAKE2b-256 eb24603c74b9f4ec8a59b5c0765eeaeb00520133531e1238ca4f3970628f0bca

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 60fa7f411a0fca98f84f3685c8d6bc19f949d2533de9c3371e5443ac8137c7ab
MD5 69aa09b3790eb8559b4cf75de0e10997
BLAKE2b-256 17222db3f409cec73a34b99972fa9910ac372a5b3f7d6acf3487374df106f1b0

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp313-cp313-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp313-cp313-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 797b5a738db1cb1be65da942633986fbc9f73cc6bcc328b84aadcae5731d8616
MD5 9336b31038b943ae5b4e2ee2d599d3db
BLAKE2b-256 96090ba13338b57b94ac907be3e4d97e1e1a9855a330675058da37c16807fb11

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp313-cp313-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp313-cp313-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 9e71fd6f83a421cfbcdf0d120f0fe9581dbd8bf048e921b3fbd91433ec721bc2
MD5 6d0f0606cb749b5bb1bc599b89d949ad
BLAKE2b-256 bd65798b9dfe22cb52b8edaf69c69b1fe8adf5311371fe69140a32a5eb49aafb

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 59e159fd1f45fa63ae9585a82d4517c99de72ae4294ab49cd3cf7838e4d7e9b5
MD5 83bf319b9f6016c868f5428ace8f821e
BLAKE2b-256 f4da79b6ee0895cde9bcf7152f36c5fd8a9b77230db5343bc3e44a70cbde62b3

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5a8526a17cd8d6d55232cd63dc67c6bde220dab52c17d9d0c88ceafa5f28ab78
MD5 5923bfc2000ea986cb187f09ef6f8f0a
BLAKE2b-256 cafb7445fde228d8361335079f00abc97f69e724331a3f6bcd5037254030a7b9

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp312-cp312-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 6c1272f6e04677ebd97a6ecdc003623bc46c90a8a48cd55deda2030e71672b07
MD5 1181836cfcea955f3f05486f45b108e4
BLAKE2b-256 41e962c24fe2f9a27f2a592ac8a2ad41c52147a4631e47cd71facf10d0649bd5

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp312-cp312-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp312-cp312-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 b9d1ca69361c968496deab863eb9a927222b91cea0f517b9230345ea8e7f1298
MD5 2db5b7088faf713a99c2cd6d8568ebc6
BLAKE2b-256 417b78e6e2ee850b841f3f1af1357b58ca9631a4a162b27dac22333a7c176dca

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd685a2f7608cbe0c0e2b000c00348fb0db3dea05905f3d732ab2562d74a724d
MD5 319bbedbd4da9ac6d64602d0010c5861
BLAKE2b-256 c5525054191889a0d8d67b6bc4d1ce4fc4ea6231e5e931e95ec413e22ac8c454

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 710db0687422dd05ff1d5ae60e74c8724c12ae3fabe39d8e674ebbcd4cb7ffbd
MD5 082f0cd39f2a3d141aa66c219d45d45b
BLAKE2b-256 e6e80a8deae34f3fbba8fa6a6a4955d04ceb9b970702e2a119392b71ce2368ce

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp311-cp311-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp311-cp311-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 adebfc4999585b78b65e35fc4c1690feb1219969533cb31b5319a77de201edcd
MD5 1bb944f0cd430b3cb0637ef690de981b
BLAKE2b-256 0d31de751168fdb946624b23f76176dd9362e203d8a3f746272f9dc1b3a82596

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp311-cp311-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp311-cp311-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 53fc88693ab28be544f2c0d8ec2f181b36b44c50ce802f50347a8f4351fc5c44
MD5 0f8c6ad07b45b7f418f470641650e14b
BLAKE2b-256 3ae6554c3e714289a5ebf601c8136e7f4202d2e671968ab9c5344cfab2565af0

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b985a588da1dc0cc9a18f7f0d28b28dec5f15254fcf0306dabef712c542e8e8
MD5 54b5aadcf9f4471bb72e16679ac0c783
BLAKE2b-256 e8a226e5ef09373f02c492a2bb38ee6655aeae46564920039ef09930a9cf1830

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f566dce6e259a745ceae44632f90d30235ecc5e694f29ac5245742b787cc65c7
MD5 e45d861ad73dd8c6329cf0118c4a2b64
BLAKE2b-256 686034470b06e8201ade38bd9e80c124a407dc68d296bcf5c3dd127a8b1c9074

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp310-cp310-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp310-cp310-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 8ba197106e9bd439534e77e86d018ed9f28654881abb3ba6a7f856a22ce5e860
MD5 28d327d03e2c73a2714d27a7c7a5bea5
BLAKE2b-256 57884d75ef206d5eef43e20622ce7f8a4636056d2c03689aecf7b7ca55fe880f

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp310-cp310-manylinux_2_34_ppc64le.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp310-cp310-manylinux_2_34_ppc64le.whl
Algorithm Hash digest
SHA256 cda99f6893221c63f8d1baa7ddc4b179a09c476aaaeae096c5a4d3e240f230e6
MD5 9903b0738852fc6785c069ab58958781
BLAKE2b-256 10747f33308b4a20d780943b6746002d4b17edc64ece2eb38fe0f39a58866ed1

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b70762500da4a40dda516e46b6482e4a8809302052ccb10b24865047f1dac043
MD5 db1213583383ccc9c02f28ff59011b63
BLAKE2b-256 115e3764d745ecc658260b11678dc16ca832744df3b67eaf5ce9bfa290731899

See more details on using hashes here.

File details

Details for the file stride_align-0.2.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for stride_align-0.2.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5dda1724221313535d0920a806888a62c9971bbe888d90be06b5b246d62c567a
MD5 3e3d3b4166a9333ed05d9b845f99cda0
BLAKE2b-256 1fe0065601873305200a8a83b8ea9f99c14f1a0513a3e48d2af15cefcb7a2932

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page