seqtree 1.3.2__tar.gz → 1.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seqtree-1.3.2 → seqtree-1.3.3}/.gitignore +5 -1
- {seqtree-1.3.2 → seqtree-1.3.3}/CHANGELOG.md +12 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/CMakeLists.txt +1 -3
- {seqtree-1.3.2 → seqtree-1.3.3}/PKG-INFO +14 -5
- {seqtree-1.3.2 → seqtree-1.3.3}/README.md +11 -2
- {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/parallel.hpp +2 -2
- {seqtree-1.3.2 → seqtree-1.3.3}/pyproject.toml +4 -3
- seqtree-1.3.2/RELEASE_AUDIT.md +0 -12
- {seqtree-1.3.2 → seqtree-1.3.3}/.gitattributes +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/LICENSE +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/kmer_index.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/seqtree.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/text_index.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/types.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/__init__.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/control.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/data/control_human_trb_aa.txt.gz +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/distance.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/evalue.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/gapblock.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/layout.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pairwise.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pmhc.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pmhc_evalue.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/py.typed +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/seeds.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/text_evalue.py +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/_bindings.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/alignment_max.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/atomic_write.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum45.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum62.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum80.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/codec.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/count_unit.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/distance.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/engine_seqtm.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/engine_seqtrie.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/engines.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/gapblock.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/index.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/kmer_index.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/pairwise.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/pairwise_detail.hpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/pam100.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/pam250.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/positional_matrix.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/searcher.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/structural.inc +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/substitution_matrix.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/text_index.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/trie.cpp +0 -0
- {seqtree-1.3.2 → seqtree-1.3.3}/src/trie.hpp +0 -0
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to `seqtree`. Dates are release dates. From 1.0.0 the project follows semantic
|
|
4
4
|
versioning: breaking changes need a **major** bump.
|
|
5
5
|
|
|
6
|
+
## Unreleased
|
|
7
|
+
|
|
8
|
+
## 1.3.3
|
|
9
|
+
|
|
10
|
+
- Cap automatic native CPU budgets at 16 allocated CPUs; preserve larger explicit
|
|
11
|
+
requests within the allocation and serial inner kernels in sample workers.
|
|
12
|
+
|
|
13
|
+
- Reject unknown setup flags before creating an environment or installing packages.
|
|
14
|
+
- Keep native bindings in the reviewed nanobind 2.x range.
|
|
15
|
+
- Build documentation from declared extras on master/dev and pull requests;
|
|
16
|
+
deploy master only, without development builds cancelling release documentation.
|
|
17
|
+
|
|
6
18
|
## [1.3.1] — 2026-10-19
|
|
7
19
|
|
|
8
20
|
### Changed
|
|
@@ -7,9 +7,7 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
7
7
|
if(NOT CMAKE_BUILD_TYPE)
|
|
8
8
|
set(CMAKE_BUILD_TYPE Release)
|
|
9
9
|
endif()
|
|
10
|
-
|
|
11
|
-
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
|
12
|
-
endif() # MSVC Release already uses /O2; -O3 is not a valid MSVC flag
|
|
10
|
+
# Keep CMake/toolchain Release flags, including compiler-specific optimization.
|
|
13
11
|
|
|
14
12
|
option(SEQTREE_TESTS "Build C++ tests" OFF)
|
|
15
13
|
option(SEQTREE_BENCH "Build C++ benchmarks" OFF)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: seqtree
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
4
4
|
Summary: Fast fuzzy search over biological sequences (C++ core, Python bindings)
|
|
5
5
|
Keywords: sequence-search,fuzzy-matching,CDR3,immunology,bioinformatics,trie
|
|
6
6
|
Author-Email: ISALGO laboratory <mikhail.shugay@gmail.com>
|
|
@@ -22,8 +22,8 @@ Requires-Dist: biopython>=1.81; extra == "test"
|
|
|
22
22
|
Provides-Extra: bench
|
|
23
23
|
Requires-Dist: huggingface_hub; extra == "bench"
|
|
24
24
|
Provides-Extra: docs
|
|
25
|
-
Requires-Dist: sphinx; extra == "docs"
|
|
26
|
-
Requires-Dist: pydata-sphinx-theme; extra == "docs"
|
|
25
|
+
Requires-Dist: sphinx>=7; extra == "docs"
|
|
26
|
+
Requires-Dist: pydata-sphinx-theme>=0.15; extra == "docs"
|
|
27
27
|
Provides-Extra: control
|
|
28
28
|
Requires-Dist: huggingface_hub; extra == "control"
|
|
29
29
|
Provides-Extra: pmhc
|
|
@@ -36,7 +36,7 @@ Description-Content-Type: text/markdown
|
|
|
36
36
|
[](https://pypi.org/project/seqtree/)
|
|
37
37
|
[](LICENSE)
|
|
38
38
|
[](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml)
|
|
39
|
-
[](https://antigenomics.github.io/seqtree/)
|
|
40
40
|
|
|
41
41
|
Fast fuzzy search over biological sequences (amino-acid or nucleotide), as a C++
|
|
42
42
|
core with a minimal Python binding. Build an immutable index once, then search
|
|
@@ -64,7 +64,7 @@ for hit in idx.search("CASSLAPGATNEKLFF", p):
|
|
|
64
64
|
print(hit.ref_id, hit.score, hit.n_subs)
|
|
65
65
|
|
|
66
66
|
# parallel batch (releases the GIL)
|
|
67
|
-
results = idx.search_batch(queries, p, threads=0) # 0 =
|
|
67
|
+
results = idx.search_batch(queries, p, threads=0) # 0 = automatic, up to 16 allocated CPUs
|
|
68
68
|
|
|
69
69
|
# matrix-weighted budget. Name seqtrie -- engine="auto" always means seqtm.
|
|
70
70
|
# gap_open must follow the matrix: 2 * blosum62.scale() == 28, not the default 1.
|
|
@@ -300,3 +300,12 @@ with separate alignment-selection and final scoring coefficients.
|
|
|
300
300
|
insertion/deletion cap; its default preserves previous behavior. See the
|
|
301
301
|
[API reference](https://antigenomics.github.io/seqtree/api.html) for array contracts
|
|
302
302
|
and tie, count, exclusion and unsupported-value semantics.
|
|
303
|
+
|
|
304
|
+
## Agent skill
|
|
305
|
+
|
|
306
|
+
The public [seqtree skill](skills/seqtree/SKILL.md) guides use of the C++20 library
|
|
307
|
+
and Python bindings for sequence search, alignment, distances, and batch operations.
|
|
308
|
+
|
|
309
|
+
CPU budgets use `threads=0` for automatic parallel work, capped at 16 allocated CPUs.
|
|
310
|
+
Use `1` for serial work or a positive
|
|
311
|
+
count to override the automatic cap within the scheduler/container allocation.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://pypi.org/project/seqtree/)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml)
|
|
7
|
-
[](https://antigenomics.github.io/seqtree/)
|
|
8
8
|
|
|
9
9
|
Fast fuzzy search over biological sequences (amino-acid or nucleotide), as a C++
|
|
10
10
|
core with a minimal Python binding. Build an immutable index once, then search
|
|
@@ -32,7 +32,7 @@ for hit in idx.search("CASSLAPGATNEKLFF", p):
|
|
|
32
32
|
print(hit.ref_id, hit.score, hit.n_subs)
|
|
33
33
|
|
|
34
34
|
# parallel batch (releases the GIL)
|
|
35
|
-
results = idx.search_batch(queries, p, threads=0) # 0 =
|
|
35
|
+
results = idx.search_batch(queries, p, threads=0) # 0 = automatic, up to 16 allocated CPUs
|
|
36
36
|
|
|
37
37
|
# matrix-weighted budget. Name seqtrie -- engine="auto" always means seqtm.
|
|
38
38
|
# gap_open must follow the matrix: 2 * blosum62.scale() == 28, not the default 1.
|
|
@@ -268,3 +268,12 @@ with separate alignment-selection and final scoring coefficients.
|
|
|
268
268
|
insertion/deletion cap; its default preserves previous behavior. See the
|
|
269
269
|
[API reference](https://antigenomics.github.io/seqtree/api.html) for array contracts
|
|
270
270
|
and tie, count, exclusion and unsupported-value semantics.
|
|
271
|
+
|
|
272
|
+
## Agent skill
|
|
273
|
+
|
|
274
|
+
The public [seqtree skill](skills/seqtree/SKILL.md) guides use of the C++20 library
|
|
275
|
+
and Python bindings for sequence search, alignment, distances, and batch operations.
|
|
276
|
+
|
|
277
|
+
CPU budgets use `threads=0` for automatic parallel work, capped at 16 allocated CPUs.
|
|
278
|
+
Use `1` for serial work or a positive
|
|
279
|
+
count to override the automatic cap within the scheduler/container allocation.
|
|
@@ -67,7 +67,7 @@ inline unsigned available_cpus() {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
// Runs body(i, local) for every i in [0, n), across nt workers pulling contiguous chunks off
|
|
70
|
-
// one atomic cursor. `threads <= 0`
|
|
70
|
+
// one atomic cursor. `threads <= 0` selects up to 16 available CPUs; positive counts may exceed that cap.
|
|
71
71
|
//
|
|
72
72
|
// `make_local()` is called once per worker and its result handed to every body() that worker
|
|
73
73
|
// runs -- that is how a Searcher or a scratch buffer gets allocated once per thread rather
|
|
@@ -85,7 +85,7 @@ template <class MakeLocal, class Body>
|
|
|
85
85
|
void parallel_for(size_t n, int threads, MakeLocal make_local, Body body,
|
|
86
86
|
size_t chunk_min = 1, size_t chunk_max = 1024) {
|
|
87
87
|
const unsigned available = available_cpus();
|
|
88
|
-
unsigned nt = threads > 0 ? unsigned(threads) : available;
|
|
88
|
+
unsigned nt = threads > 0 ? unsigned(threads) : std::min(available, 16u);
|
|
89
89
|
if (nt > available || nt >= 1000)
|
|
90
90
|
throw std::invalid_argument("worker count exceeds the available CPU budget; request fewer threads");
|
|
91
91
|
if (n == 0) return;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["scikit-build-core>=0.12", "nanobind>=2.5"]
|
|
2
|
+
requires = ["scikit-build-core>=0.12", "nanobind>=2.5,<3"]
|
|
3
3
|
build-backend = "scikit_build_core.build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "seqtree"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.3"
|
|
8
8
|
description = "Fast fuzzy search over biological sequences (C++ core, Python bindings)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -26,7 +26,7 @@ dependencies = []
|
|
|
26
26
|
# seqtree itself has no runtime dependencies and must never import it.
|
|
27
27
|
test = ["pytest>=7.4", "pytest-cov>=4.1", "biopython>=1.81"]
|
|
28
28
|
bench = ["huggingface_hub"]
|
|
29
|
-
docs = ["sphinx", "pydata-sphinx-theme"]
|
|
29
|
+
docs = ["sphinx>=7", "pydata-sphinx-theme>=0.15"]
|
|
30
30
|
control = ["huggingface_hub"] # only needed to download controls larger than the bundled subset
|
|
31
31
|
pmhc = ["huggingface_hub"] # only needed to fetch the isalgo/pmhc_data epitope tables
|
|
32
32
|
|
|
@@ -40,6 +40,7 @@ wheel.packages = ["python/seqtree"]
|
|
|
40
40
|
cmake.build-type = "Release"
|
|
41
41
|
# Keep the sdist lean: ship only what builds the package. Anchor with a leading "/".
|
|
42
42
|
sdist.exclude = [
|
|
43
|
+
"/attic/",
|
|
43
44
|
"/bench", "/tests", "/docs", "/.github", "/setup.sh", "/build", "/appendix", "/examples",
|
|
44
45
|
# Local agent config: machine-specific absolute paths and unrelated repo names.
|
|
45
46
|
"/.claude", "/CLAUDE.md", "/AGENTS.md", "/ROADMAP.md", "/SOURCES.md", "/skills",
|
seqtree-1.3.2/RELEASE_AUDIT.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Release audit — 17 October 2026
|
|
2
|
-
|
|
3
|
-
The requested generic batch/search APIs are implemented. No new native algorithm is needed for the audited downstream requirements.
|
|
4
|
-
|
|
5
|
-
- Native batch search and edit histograms; aggregate insertion/deletion caps.
|
|
6
|
-
- Float64 global-alignment target reductions, separate candidate/final scoring semantics, fixed populations under exact exclusion.
|
|
7
|
-
- Grouped geometry, fixed audit partitions, bounded deterministic sparse radius hits and optional-geometry compatibility at the supported nanobind floor.
|
|
8
|
-
- Shared CPU allocation checks; one-thread inline execution and explicit over-budget rejection.
|
|
9
|
-
|
|
10
|
-
Verification on `0852ff5`: **379 passed, 1 Linux-only platform skip** across `test_batch_threads.py`, `test_alignment_max.py`, `test_edit_histogram.py`, `test_grouped_optional_geometry.py` and `test_grouped_sparse_hits.py`. An additional 280 checks cover grouped populations, withholding, paired lanes, offsets, score bins and partitions. Native budget was two CPUs; numerical libraries used one thread. The committed `examples/01_gapped_search.py` runs and its per-query cutoff/search output was inspected. Sphinx builds with `-W`.
|
|
11
|
-
|
|
12
|
-
The local `dev` commits `0126e00`, `858056b` and `0852ff5` were three commits ahead of the remote at audit start. They are preserved and included when this audited `dev` is pushed. The changelog now covers these capabilities; public API documentation already describes the alignment reductions. [Issue 18](https://github.com/antigenomics/seqtree/issues/18) tracks integration into the release head and the remaining exact-head cross-platform/wheel gate. Publishing remains the maintainer's action; this audit creates no tag or release. Focused checks do not substitute for complete release CI.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|