seqtree 0.6.0__tar.gz → 0.6.1__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 (62) hide show
  1. {seqtree-0.6.0 → seqtree-0.6.1}/CHANGELOG.md +11 -0
  2. {seqtree-0.6.0 → seqtree-0.6.1}/PKG-INFO +5 -2
  3. {seqtree-0.6.0 → seqtree-0.6.1}/README.md +4 -1
  4. {seqtree-0.6.0 → seqtree-0.6.1}/pyproject.toml +1 -1
  5. {seqtree-0.6.0 → seqtree-0.6.1}/skills/seqtree/SKILL.md +1 -1
  6. {seqtree-0.6.0 → seqtree-0.6.1}/src/gapblock.cpp +5 -5
  7. {seqtree-0.6.0 → seqtree-0.6.1}/.gitattributes +0 -0
  8. {seqtree-0.6.0 → seqtree-0.6.1}/.gitignore +0 -0
  9. {seqtree-0.6.0 → seqtree-0.6.1}/CMakeLists.txt +0 -0
  10. {seqtree-0.6.0 → seqtree-0.6.1}/LICENSE +0 -0
  11. {seqtree-0.6.0 → seqtree-0.6.1}/ROADMAP.md +0 -0
  12. {seqtree-0.6.0 → seqtree-0.6.1}/SOURCES.md +0 -0
  13. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/.gitignore +0 -0
  14. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/.latexmkrc +0 -0
  15. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/Makefile +0 -0
  16. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/epitope_detection.pdf +0 -0
  17. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/evalue.pdf +0 -0
  18. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/evalue.tex +0 -0
  19. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/evalue_matrix.pdf +0 -0
  20. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/mhc1_rocpr.pdf +0 -0
  21. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/mhc2_rocpr.pdf +0 -0
  22. {seqtree-0.6.0 → seqtree-0.6.1}/appendix/refs.bib +0 -0
  23. {seqtree-0.6.0 → seqtree-0.6.1}/examples/01_gapped_search.py +0 -0
  24. {seqtree-0.6.0 → seqtree-0.6.1}/examples/02_sequence_dendrogram.py +0 -0
  25. {seqtree-0.6.0 → seqtree-0.6.1}/examples/03_indel_positions.py +0 -0
  26. {seqtree-0.6.0 → seqtree-0.6.1}/examples/04_island_profile.py +0 -0
  27. {seqtree-0.6.0 → seqtree-0.6.1}/include/seqtree/kmer_index.hpp +0 -0
  28. {seqtree-0.6.0 → seqtree-0.6.1}/include/seqtree/seqtree.hpp +0 -0
  29. {seqtree-0.6.0 → seqtree-0.6.1}/include/seqtree/types.hpp +0 -0
  30. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/__init__.py +0 -0
  31. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/control.py +0 -0
  32. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/data/control_human_trb_aa.txt.gz +0 -0
  33. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/distance.py +0 -0
  34. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/evalue.py +0 -0
  35. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/gapblock.py +0 -0
  36. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/layout.py +0 -0
  37. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/pairwise.py +0 -0
  38. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/pmhc.py +0 -0
  39. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/pmhc_evalue.py +0 -0
  40. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/py.typed +0 -0
  41. {seqtree-0.6.0 → seqtree-0.6.1}/python/seqtree/seeds.py +0 -0
  42. {seqtree-0.6.0 → seqtree-0.6.1}/src/_bindings.cpp +0 -0
  43. {seqtree-0.6.0 → seqtree-0.6.1}/src/atomic_write.hpp +0 -0
  44. {seqtree-0.6.0 → seqtree-0.6.1}/src/blosum45.inc +0 -0
  45. {seqtree-0.6.0 → seqtree-0.6.1}/src/blosum62.inc +0 -0
  46. {seqtree-0.6.0 → seqtree-0.6.1}/src/blosum80.inc +0 -0
  47. {seqtree-0.6.0 → seqtree-0.6.1}/src/codec.cpp +0 -0
  48. {seqtree-0.6.0 → seqtree-0.6.1}/src/distance.cpp +0 -0
  49. {seqtree-0.6.0 → seqtree-0.6.1}/src/engine_seqtm.cpp +0 -0
  50. {seqtree-0.6.0 → seqtree-0.6.1}/src/engine_seqtrie.cpp +0 -0
  51. {seqtree-0.6.0 → seqtree-0.6.1}/src/engines.hpp +0 -0
  52. {seqtree-0.6.0 → seqtree-0.6.1}/src/index.cpp +0 -0
  53. {seqtree-0.6.0 → seqtree-0.6.1}/src/kmer_index.cpp +0 -0
  54. {seqtree-0.6.0 → seqtree-0.6.1}/src/pairwise.cpp +0 -0
  55. {seqtree-0.6.0 → seqtree-0.6.1}/src/pam100.inc +0 -0
  56. {seqtree-0.6.0 → seqtree-0.6.1}/src/pam250.inc +0 -0
  57. {seqtree-0.6.0 → seqtree-0.6.1}/src/positional_matrix.cpp +0 -0
  58. {seqtree-0.6.0 → seqtree-0.6.1}/src/searcher.cpp +0 -0
  59. {seqtree-0.6.0 → seqtree-0.6.1}/src/structural.inc +0 -0
  60. {seqtree-0.6.0 → seqtree-0.6.1}/src/substitution_matrix.cpp +0 -0
  61. {seqtree-0.6.0 → seqtree-0.6.1}/src/trie.cpp +0 -0
  62. {seqtree-0.6.0 → seqtree-0.6.1}/src/trie.hpp +0 -0
@@ -3,6 +3,17 @@
3
3
  All notable changes to `seqtree`. Dates are release dates; the project is pre-1.0, so a **minor**
4
4
  bump may carry breaking changes.
5
5
 
6
+ ## [0.6.1] — 2026-07-30
7
+
8
+ ### Fixed
9
+
10
+ - **`gapblock_matrix`'s out-of-alphabet error named only the bad symbol**, not which sequence it
11
+ came from (`"symbol '_' is not in the alphabet"`) — unhelpful when a single malformed row (e.g.
12
+ a `junction_aa` containing a legacy out-of-frame marker) is buried in a batch of hundreds of
13
+ thousands. The message now names the side, index, and offending string:
14
+ `"queries[42] ('CASSIRS_YEQYF'): symbol '_' is not in the alphabet"`. No change to which symbols
15
+ are accepted (still the standard 20 + B/Z/X/* for `alphabet="aa"`).
16
+
6
17
  ## [0.6.0] — 2026-07-17
7
18
 
8
19
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seqtree
3
- Version: 0.6.0
3
+ Version: 0.6.1
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>
@@ -114,8 +114,11 @@ needs a C++17 compiler and CMake (pulled in automatically by the build).
114
114
 
115
115
  ## Build from source
116
116
 
117
+ Needs [uv](https://docs.astral.sh/uv/) (`brew install uv`); `setup.sh` uses it for the venv and
118
+ the editable install.
119
+
117
120
  ```fish
118
- bash setup.sh # repo-local .venv + editable install
121
+ bash setup.sh # uv-managed .venv + editable install
119
122
  bash setup.sh --tests # + pytest
120
123
  bash setup.sh --bench # + benchmark deps (huggingface_hub, psutil)
121
124
  ```
@@ -80,8 +80,11 @@ needs a C++17 compiler and CMake (pulled in automatically by the build).
80
80
 
81
81
  ## Build from source
82
82
 
83
+ Needs [uv](https://docs.astral.sh/uv/) (`brew install uv`); `setup.sh` uses it for the venv and
84
+ the editable install.
85
+
83
86
  ```fish
84
- bash setup.sh # repo-local .venv + editable install
87
+ bash setup.sh # uv-managed .venv + editable install
85
88
  bash setup.sh --tests # + pytest
86
89
  bash setup.sh --bench # + benchmark deps (huggingface_hub, psutil)
87
90
  ```
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "seqtree"
7
- version = "0.6.0"
7
+ version = "0.6.1"
8
8
  description = "Fast fuzzy search over biological sequences (C++ core, Python bindings)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -237,7 +237,7 @@ Count it in the control.
237
237
  4. OLGA generates from `P_gen`, which is **not** the post-selection background `P_0`. Do not use
238
238
  an OLGA sample as the null for an operational cutoff.
239
239
  5. Rebuild after pulling: a stale `_core.so` has silently shadowed new Python-visible C++ methods
240
- more than once (`pip install -e .`).
240
+ more than once (`bash setup.sh`, or `uv pip install -e .`).
241
241
 
242
242
  ## Layering
243
243
 
@@ -9,13 +9,13 @@
9
9
  namespace seqtree {
10
10
  namespace {
11
11
 
12
- std::vector<uint8_t> encode(const Codec& c, const std::string& s) {
12
+ std::vector<uint8_t> encode(const Codec& c, const std::string& s, const char* label, size_t idx) {
13
13
  std::vector<uint8_t> out(s.size());
14
14
  for (size_t i = 0; i < s.size(); ++i) {
15
15
  uint8_t v = c.encode(s[i]);
16
16
  if (v == Codec::kInvalid)
17
- throw std::invalid_argument(std::string("symbol '") + s[i] +
18
- "' is not in the alphabet");
17
+ throw std::invalid_argument(label + std::string("[") + std::to_string(idx) + "] ('" + s +
18
+ "'): symbol '" + s[i] + "' is not in the alphabet");
19
19
  out[i] = v;
20
20
  }
21
21
  return out;
@@ -85,11 +85,11 @@ std::vector<int32_t> gapblock_matrix(const std::vector<std::string>& queries,
85
85
  std::vector<std::vector<uint8_t>> qc(N), rc(K);
86
86
  uint32_t longest = 0;
87
87
  for (size_t i = 0; i < N; ++i) {
88
- qc[i] = encode(codec, queries[i]);
88
+ qc[i] = encode(codec, queries[i], "queries", i);
89
89
  longest = std::max<uint32_t>(longest, uint32_t(qc[i].size()));
90
90
  }
91
91
  for (size_t k = 0; k < K; ++k) {
92
- rc[k] = encode(codec, refs[k]);
92
+ rc[k] = encode(codec, refs[k], "refs", k);
93
93
  longest = std::max<uint32_t>(longest, uint32_t(rc[k].size()));
94
94
  }
95
95
 
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