seqtree 0.5.0__tar.gz → 0.6.0__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.5.0 → seqtree-0.6.0}/CHANGELOG.md +27 -0
  2. {seqtree-0.5.0 → seqtree-0.6.0}/PKG-INFO +1 -1
  3. {seqtree-0.5.0 → seqtree-0.6.0}/SOURCES.md +7 -1
  4. {seqtree-0.5.0 → seqtree-0.6.0}/pyproject.toml +1 -1
  5. {seqtree-0.5.0 → seqtree-0.6.0}/src/structural.inc +4 -4
  6. {seqtree-0.5.0 → seqtree-0.6.0}/.gitattributes +0 -0
  7. {seqtree-0.5.0 → seqtree-0.6.0}/.gitignore +0 -0
  8. {seqtree-0.5.0 → seqtree-0.6.0}/CMakeLists.txt +0 -0
  9. {seqtree-0.5.0 → seqtree-0.6.0}/LICENSE +0 -0
  10. {seqtree-0.5.0 → seqtree-0.6.0}/README.md +0 -0
  11. {seqtree-0.5.0 → seqtree-0.6.0}/ROADMAP.md +0 -0
  12. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/.gitignore +0 -0
  13. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/.latexmkrc +0 -0
  14. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/Makefile +0 -0
  15. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/epitope_detection.pdf +0 -0
  16. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/evalue.pdf +0 -0
  17. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/evalue.tex +0 -0
  18. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/evalue_matrix.pdf +0 -0
  19. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/mhc1_rocpr.pdf +0 -0
  20. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/mhc2_rocpr.pdf +0 -0
  21. {seqtree-0.5.0 → seqtree-0.6.0}/appendix/refs.bib +0 -0
  22. {seqtree-0.5.0 → seqtree-0.6.0}/examples/01_gapped_search.py +0 -0
  23. {seqtree-0.5.0 → seqtree-0.6.0}/examples/02_sequence_dendrogram.py +0 -0
  24. {seqtree-0.5.0 → seqtree-0.6.0}/examples/03_indel_positions.py +0 -0
  25. {seqtree-0.5.0 → seqtree-0.6.0}/examples/04_island_profile.py +0 -0
  26. {seqtree-0.5.0 → seqtree-0.6.0}/include/seqtree/kmer_index.hpp +0 -0
  27. {seqtree-0.5.0 → seqtree-0.6.0}/include/seqtree/seqtree.hpp +0 -0
  28. {seqtree-0.5.0 → seqtree-0.6.0}/include/seqtree/types.hpp +0 -0
  29. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/__init__.py +0 -0
  30. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/control.py +0 -0
  31. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/data/control_human_trb_aa.txt.gz +0 -0
  32. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/distance.py +0 -0
  33. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/evalue.py +0 -0
  34. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/gapblock.py +0 -0
  35. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/layout.py +0 -0
  36. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/pairwise.py +0 -0
  37. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/pmhc.py +0 -0
  38. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/pmhc_evalue.py +0 -0
  39. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/py.typed +0 -0
  40. {seqtree-0.5.0 → seqtree-0.6.0}/python/seqtree/seeds.py +0 -0
  41. {seqtree-0.5.0 → seqtree-0.6.0}/skills/seqtree/SKILL.md +0 -0
  42. {seqtree-0.5.0 → seqtree-0.6.0}/src/_bindings.cpp +0 -0
  43. {seqtree-0.5.0 → seqtree-0.6.0}/src/atomic_write.hpp +0 -0
  44. {seqtree-0.5.0 → seqtree-0.6.0}/src/blosum45.inc +0 -0
  45. {seqtree-0.5.0 → seqtree-0.6.0}/src/blosum62.inc +0 -0
  46. {seqtree-0.5.0 → seqtree-0.6.0}/src/blosum80.inc +0 -0
  47. {seqtree-0.5.0 → seqtree-0.6.0}/src/codec.cpp +0 -0
  48. {seqtree-0.5.0 → seqtree-0.6.0}/src/distance.cpp +0 -0
  49. {seqtree-0.5.0 → seqtree-0.6.0}/src/engine_seqtm.cpp +0 -0
  50. {seqtree-0.5.0 → seqtree-0.6.0}/src/engine_seqtrie.cpp +0 -0
  51. {seqtree-0.5.0 → seqtree-0.6.0}/src/engines.hpp +0 -0
  52. {seqtree-0.5.0 → seqtree-0.6.0}/src/gapblock.cpp +0 -0
  53. {seqtree-0.5.0 → seqtree-0.6.0}/src/index.cpp +0 -0
  54. {seqtree-0.5.0 → seqtree-0.6.0}/src/kmer_index.cpp +0 -0
  55. {seqtree-0.5.0 → seqtree-0.6.0}/src/pairwise.cpp +0 -0
  56. {seqtree-0.5.0 → seqtree-0.6.0}/src/pam100.inc +0 -0
  57. {seqtree-0.5.0 → seqtree-0.6.0}/src/pam250.inc +0 -0
  58. {seqtree-0.5.0 → seqtree-0.6.0}/src/positional_matrix.cpp +0 -0
  59. {seqtree-0.5.0 → seqtree-0.6.0}/src/searcher.cpp +0 -0
  60. {seqtree-0.5.0 → seqtree-0.6.0}/src/substitution_matrix.cpp +0 -0
  61. {seqtree-0.5.0 → seqtree-0.6.0}/src/trie.cpp +0 -0
  62. {seqtree-0.5.0 → seqtree-0.6.0}/src/trie.hpp +0 -0
@@ -3,6 +3,33 @@
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.0] — 2026-07-17
7
+
8
+ ### Fixed
9
+
10
+ - **`structural` scored A–N contacts as if they did not interact, because the source table is
11
+ corrupted there.** The Miyazawa–Jernigan A–N contact energy was transcribed as `0.00` — the
12
+ generator's comment excused it as a pair the source left unlisted. It is not unlisted. In
13
+ `MJ_Keskin_potentials.csv` the lower triangle runs `A-A`, `R-A`, `R-R`, `[N-A]`, `N-R`, …, and
14
+ the `N-A` slot reads `V,1` (mirrored `1,V`), where `1` is a mangled residue symbol. The true
15
+ value is **0.15**. It is not a stray duplicate of `V-N` either — the V row separately lists
16
+ `N = 0.12`.
17
+
18
+ Substituting `0.00` for `0.15` understated A's interaction strength and overstated N's
19
+ (`q(A)` −0.04100 → −0.03350, `q(N)` +0.04350 → +0.05100). Since `structural` is rank-1 by
20
+ construction — every cell is a function of the 20 per-residue strengths — this moved the
21
+ strong→weak ordering that the matrix exists to encode, swapping N and P:
22
+ `FWCLYMIVHGAT`**`NP`**`RSQDEK` → `FWCLYMIVHGAT`**`PN`**`RSQDEK`.
23
+
24
+ Four cells of the 24×24 grid change: `A-W`/`W-A` 6 → 5, and `B-C`/`C-B` 4 → 3 (`B` is
25
+ `mean(N, D)`, so N's shift carries into it). **Scores from `structural()` change for sequences
26
+ containing A, W, or B**; all other matrices are untouched. N and P were near-tied, which is why
27
+ a real correction to the ordering moves so few cells.
28
+
29
+ - **The same comment claimed the source is "near- but not perfectly symmetric".** It is perfectly
30
+ symmetric — 0 asymmetric directed pairs across all 400. The symmetrisation in
31
+ `structural_grid()` is a no-op guard, not a repair, and is now documented as such.
32
+
6
33
  ## [0.5.0] — 2026-07-16
7
34
 
8
35
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seqtree
3
- Version: 0.5.0
3
+ Version: 0.6.0
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>
@@ -32,12 +32,18 @@ possible; and out-of-frame junctions escape thymic selection, making them a samp
32
32
  | | |
33
33
  |---|---|
34
34
  | provenance | **derived** (published log-odds / interaction-strength matrices) |
35
- | origin | BLOSUM62 (NCBI); EMBOSS EPAM250, EPAM100; Miyazawa–Jernigan interaction strengths |
35
+ | origin | BLOSUM62 (NCBI); EMBOSS EPAM250, EPAM100; Miyazawa–Jernigan interaction strengths, transcribed into `MJ_CONTACT` in `bench/gen_matrices.py` from the `MJ` rows of `tcren-ms/src/tcren/data/MJ_Keskin_potentials.csv` (Miyazawa & Jernigan, J Mol Biol 1996, as tabulated by Keskin et al., Protein Sci 1998) |
36
36
  | regenerate | `python bench/gen_matrices.py` |
37
37
 
38
38
  Stored as non-negative penalties via the Gram transform `pen[a][b] = s[a][a] + s[b][b] − 2·s[a][b]`,
39
39
  clamped at zero, so `penalty(a, a) == 0` and the score defines a ball.
40
40
 
41
+ **Known corruption in the MJ source.** `MJ_Keskin_potentials.csv` has no `A,N` row: the lower-triangle
42
+ slot where `N-A` belongs is mangled to `V,1` (mirrored `1,V`) for *both* the `MJ` and `Keskin`
43
+ potentials. `MJ_CONTACT` carries the correct `A-N = 0.15` from that row, so the constant will not
44
+ diff cleanly against the CSV at that pair. The `Keskin` rows are unused here. Fix not yet upstreamed
45
+ to `tcren-ms`.
46
+
41
47
  ## Downloaded on demand
42
48
 
43
49
  ### `load_control(name)` → `~/.cache/seqtree/control_*.sqtree`
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "seqtree"
7
- version = "0.5.0"
7
+ version = "0.6.0"
8
8
  description = "Fast fuzzy search over biological sequences (C++ core, Python bindings)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -4,11 +4,11 @@
4
4
  static const int32_t kStructuralSize = 24;
5
5
  static const int32_t kStructural[24 * 24] = {
6
6
  // A R N D C Q E G H I L K M F P S T W Y V B Z X *
7
- 10, 9, 9, 7, 6, 8, 7, 10, 9, 6, 6, 5, 6, 5, 9, 8, 9, 6, 6, 7, 8, 7, 7, 0,
7
+ 10, 9, 9, 7, 6, 8, 7, 10, 9, 6, 6, 5, 6, 5, 9, 8, 9, 5, 6, 7, 8, 7, 7, 0,
8
8
  9, 10, 10, 8, 4, 9, 8, 8, 8, 5, 4, 6, 5, 4, 10, 10, 9, 4, 5, 6, 9, 9, 7, 0,
9
9
  9, 10, 10, 8, 4, 9, 8, 8, 8, 5, 4, 6, 5, 4, 10, 10, 9, 4, 5, 6, 9, 9, 7, 0,
10
10
  7, 8, 8, 10, 3, 9, 10, 7, 6, 3, 3, 8, 3, 2, 8, 9, 8, 3, 3, 4, 9, 9, 6, 0,
11
- 6, 4, 4, 3, 10, 4, 2, 6, 7, 9, 10, 1, 9, 9, 4, 4, 5, 10, 10, 8, 4, 3, 6, 0,
11
+ 6, 4, 4, 3, 10, 4, 2, 6, 7, 9, 10, 1, 9, 9, 4, 4, 5, 10, 10, 8, 3, 3, 6, 0,
12
12
  8, 9, 9, 9, 4, 10, 9, 8, 7, 4, 4, 7, 4, 3, 9, 10, 9, 3, 4, 5, 9, 9, 7, 0,
13
13
  7, 8, 8, 10, 2, 9, 10, 6, 6, 3, 2, 8, 3, 2, 8, 8, 7, 2, 3, 4, 9, 9, 6, 0,
14
14
  10, 8, 8, 7, 6, 8, 6, 10, 9, 7, 6, 5, 6, 5, 8, 8, 9, 6, 6, 8, 8, 7, 7, 0,
@@ -21,10 +21,10 @@ static const int32_t kStructural[24 * 24] = {
21
21
  9, 10, 10, 8, 4, 9, 8, 8, 8, 5, 4, 6, 5, 4, 10, 10, 9, 4, 5, 6, 9, 9, 7, 0,
22
22
  8, 10, 10, 9, 4, 10, 8, 8, 7, 5, 4, 6, 5, 4, 10, 10, 9, 4, 4, 6, 9, 9, 7, 0,
23
23
  9, 9, 9, 8, 5, 9, 7, 9, 8, 6, 5, 6, 5, 4, 9, 9, 10, 5, 5, 7, 9, 8, 7, 0,
24
- 6, 4, 4, 3, 10, 3, 2, 6, 6, 9, 10, 0, 9, 10, 4, 4, 5, 10, 9, 8, 3, 3, 6, 0,
24
+ 5, 4, 4, 3, 10, 3, 2, 6, 6, 9, 10, 0, 9, 10, 4, 4, 5, 10, 9, 8, 3, 3, 6, 0,
25
25
  6, 5, 5, 3, 10, 4, 3, 6, 7, 10, 10, 1, 10, 9, 5, 4, 5, 9, 10, 9, 4, 3, 6, 0,
26
26
  7, 6, 6, 4, 8, 5, 4, 8, 8, 9, 8, 2, 9, 8, 6, 6, 7, 8, 9, 10, 5, 5, 7, 0,
27
- 8, 9, 9, 9, 4, 9, 9, 8, 7, 4, 4, 7, 4, 3, 9, 9, 9, 3, 4, 5, 9, 9, 7, 0,
27
+ 8, 9, 9, 9, 3, 9, 9, 8, 7, 4, 4, 7, 4, 3, 9, 9, 9, 3, 4, 5, 9, 9, 7, 0,
28
28
  7, 9, 9, 9, 3, 9, 9, 7, 6, 4, 3, 8, 4, 2, 9, 9, 8, 3, 3, 5, 9, 9, 6, 0,
29
29
  7, 7, 7, 6, 6, 7, 6, 7, 7, 7, 6, 4, 7, 6, 7, 7, 7, 6, 6, 7, 7, 6, 7, 0,
30
30
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
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