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.
Files changed (53) hide show
  1. {seqtree-1.3.2 → seqtree-1.3.3}/.gitignore +5 -1
  2. {seqtree-1.3.2 → seqtree-1.3.3}/CHANGELOG.md +12 -0
  3. {seqtree-1.3.2 → seqtree-1.3.3}/CMakeLists.txt +1 -3
  4. {seqtree-1.3.2 → seqtree-1.3.3}/PKG-INFO +14 -5
  5. {seqtree-1.3.2 → seqtree-1.3.3}/README.md +11 -2
  6. {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/parallel.hpp +2 -2
  7. {seqtree-1.3.2 → seqtree-1.3.3}/pyproject.toml +4 -3
  8. seqtree-1.3.2/RELEASE_AUDIT.md +0 -12
  9. {seqtree-1.3.2 → seqtree-1.3.3}/.gitattributes +0 -0
  10. {seqtree-1.3.2 → seqtree-1.3.3}/LICENSE +0 -0
  11. {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/kmer_index.hpp +0 -0
  12. {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/seqtree.hpp +0 -0
  13. {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/text_index.hpp +0 -0
  14. {seqtree-1.3.2 → seqtree-1.3.3}/include/seqtree/types.hpp +0 -0
  15. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/__init__.py +0 -0
  16. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/control.py +0 -0
  17. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/data/control_human_trb_aa.txt.gz +0 -0
  18. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/distance.py +0 -0
  19. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/evalue.py +0 -0
  20. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/gapblock.py +0 -0
  21. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/layout.py +0 -0
  22. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pairwise.py +0 -0
  23. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pmhc.py +0 -0
  24. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/pmhc_evalue.py +0 -0
  25. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/py.typed +0 -0
  26. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/seeds.py +0 -0
  27. {seqtree-1.3.2 → seqtree-1.3.3}/python/seqtree/text_evalue.py +0 -0
  28. {seqtree-1.3.2 → seqtree-1.3.3}/src/_bindings.cpp +0 -0
  29. {seqtree-1.3.2 → seqtree-1.3.3}/src/alignment_max.cpp +0 -0
  30. {seqtree-1.3.2 → seqtree-1.3.3}/src/atomic_write.hpp +0 -0
  31. {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum45.inc +0 -0
  32. {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum62.inc +0 -0
  33. {seqtree-1.3.2 → seqtree-1.3.3}/src/blosum80.inc +0 -0
  34. {seqtree-1.3.2 → seqtree-1.3.3}/src/codec.cpp +0 -0
  35. {seqtree-1.3.2 → seqtree-1.3.3}/src/count_unit.hpp +0 -0
  36. {seqtree-1.3.2 → seqtree-1.3.3}/src/distance.cpp +0 -0
  37. {seqtree-1.3.2 → seqtree-1.3.3}/src/engine_seqtm.cpp +0 -0
  38. {seqtree-1.3.2 → seqtree-1.3.3}/src/engine_seqtrie.cpp +0 -0
  39. {seqtree-1.3.2 → seqtree-1.3.3}/src/engines.hpp +0 -0
  40. {seqtree-1.3.2 → seqtree-1.3.3}/src/gapblock.cpp +0 -0
  41. {seqtree-1.3.2 → seqtree-1.3.3}/src/index.cpp +0 -0
  42. {seqtree-1.3.2 → seqtree-1.3.3}/src/kmer_index.cpp +0 -0
  43. {seqtree-1.3.2 → seqtree-1.3.3}/src/pairwise.cpp +0 -0
  44. {seqtree-1.3.2 → seqtree-1.3.3}/src/pairwise_detail.hpp +0 -0
  45. {seqtree-1.3.2 → seqtree-1.3.3}/src/pam100.inc +0 -0
  46. {seqtree-1.3.2 → seqtree-1.3.3}/src/pam250.inc +0 -0
  47. {seqtree-1.3.2 → seqtree-1.3.3}/src/positional_matrix.cpp +0 -0
  48. {seqtree-1.3.2 → seqtree-1.3.3}/src/searcher.cpp +0 -0
  49. {seqtree-1.3.2 → seqtree-1.3.3}/src/structural.inc +0 -0
  50. {seqtree-1.3.2 → seqtree-1.3.3}/src/substitution_matrix.cpp +0 -0
  51. {seqtree-1.3.2 → seqtree-1.3.3}/src/text_index.cpp +0 -0
  52. {seqtree-1.3.2 → seqtree-1.3.3}/src/trie.cpp +0 -0
  53. {seqtree-1.3.2 → seqtree-1.3.3}/src/trie.hpp +0 -0
@@ -25,6 +25,10 @@ tmp/
25
25
  /CLAUDE.md
26
26
  /ROADMAP.md
27
27
  /SOURCES.md
28
- /skills/
28
+ /skills/*
29
+ !/skills/seqtree/
29
30
  /add_bindings.py
30
31
  /add_native.py
32
+
33
+ # Private retired branches, notes and scratch; never package or publish.
34
+ /attic/
@@ -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
- if(NOT MSVC)
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.2
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
  [![Python](https://img.shields.io/pypi/pyversions/seqtree.svg)](https://pypi.org/project/seqtree/)
37
37
  [![License](https://img.shields.io/badge/license-GPLv3-green)](LICENSE)
38
38
  [![CI](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml/badge.svg)](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml)
39
- [![Docs](https://github.com/antigenomics/seqtree/actions/workflows/docs.yml/badge.svg?branch=dev)](https://antigenomics.github.io/seqtree/)
39
+ [![Docs](https://github.com/antigenomics/seqtree/actions/workflows/docs.yml/badge.svg?branch=master)](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 = all cores
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
  [![Python](https://img.shields.io/pypi/pyversions/seqtree.svg)](https://pypi.org/project/seqtree/)
5
5
  [![License](https://img.shields.io/badge/license-GPLv3-green)](LICENSE)
6
6
  [![CI](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml/badge.svg)](https://github.com/antigenomics/seqtree/actions/workflows/ci.yml)
7
- [![Docs](https://github.com/antigenomics/seqtree/actions/workflows/docs.yml/badge.svg?branch=dev)](https://antigenomics.github.io/seqtree/)
7
+ [![Docs](https://github.com/antigenomics/seqtree/actions/workflows/docs.yml/badge.svg?branch=master)](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 = all cores
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` means the detected available CPU budget.
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.2"
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",
@@ -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