seqtree 1.0.0__tar.gz → 1.0.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.
- {seqtree-1.0.0 → seqtree-1.0.1}/CHANGELOG.md +8 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/CMakeLists.txt +1 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/PKG-INFO +1 -1
- {seqtree-1.0.0 → seqtree-1.0.1}/include/seqtree/parallel.hpp +20 -12
- {seqtree-1.0.0 → seqtree-1.0.1}/pyproject.toml +1 -1
- {seqtree-1.0.0 → seqtree-1.0.1}/.gitattributes +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/.gitignore +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/LICENSE +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/README.md +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/ROADMAP.md +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/SOURCES.md +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/.gitignore +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/.latexmkrc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/Makefile +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/epitope_detection.pdf +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/evalue.pdf +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/evalue.tex +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/evalue_matrix.pdf +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/mhc1_rocpr.pdf +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/mhc2_rocpr.pdf +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/appendix/refs.bib +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/examples/01_gapped_search.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/examples/02_sequence_dendrogram.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/examples/03_indel_positions.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/examples/04_island_profile.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/include/seqtree/kmer_index.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/include/seqtree/seqtree.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/include/seqtree/text_index.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/include/seqtree/types.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/__init__.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/control.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/data/control_human_trb_aa.txt.gz +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/distance.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/evalue.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/gapblock.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/layout.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/pairwise.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/pmhc.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/pmhc_evalue.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/py.typed +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/python/seqtree/seeds.py +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/skills/seqtree/SKILL.md +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/_bindings.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/atomic_write.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/blosum45.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/blosum62.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/blosum80.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/codec.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/distance.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/engine_seqtm.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/engine_seqtrie.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/engines.hpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/gapblock.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/index.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/kmer_index.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/pairwise.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/pam100.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/pam250.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/positional_matrix.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/searcher.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/structural.inc +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/substitution_matrix.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/text_index.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/trie.cpp +0 -0
- {seqtree-1.0.0 → seqtree-1.0.1}/src/trie.hpp +0 -0
|
@@ -3,6 +3,14 @@
|
|
|
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
|
+
## [1.0.1] — 2026-10-09
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- A one-thread batch executes on the calling thread instead of launching a worker.
|
|
11
|
+
- Worker scratch-allocation exceptions propagate to the caller rather than terminating the process.
|
|
12
|
+
- A partially started worker pool joins its running workers if thread creation fails.
|
|
13
|
+
|
|
6
14
|
## [1.0.0] — 2026-09-06
|
|
7
15
|
|
|
8
16
|
### Added
|
|
@@ -65,6 +65,7 @@ if(SEQTREE_TESTS)
|
|
|
65
65
|
tests/cpp/test_positional.cpp
|
|
66
66
|
tests/cpp/test_kmer_index.cpp
|
|
67
67
|
tests/cpp/test_text_index.cpp
|
|
68
|
+
tests/cpp/test_parallel.cpp
|
|
68
69
|
)
|
|
69
70
|
target_include_directories(seqtree_tests PRIVATE tests/cpp src)
|
|
70
71
|
target_link_libraries(seqtree_tests PRIVATE seqtree_core)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: seqtree
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.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>
|
|
@@ -37,30 +37,38 @@ void parallel_for(size_t n, int threads, MakeLocal make_local, Body body,
|
|
|
37
37
|
: std::max(1u, std::thread::hardware_concurrency());
|
|
38
38
|
nt = unsigned(std::min<size_t>(nt, n)); // n >= 1 here, so nt >= 1
|
|
39
39
|
|
|
40
|
+
// A serial budget runs on the calling thread; spawning one worker only adds overhead.
|
|
41
|
+
if (nt == 1) {
|
|
42
|
+
auto local = make_local();
|
|
43
|
+
for (size_t i = 0; i < n; ++i) body(i, local);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
40
47
|
std::atomic<size_t> next{0};
|
|
41
48
|
const size_t chunk = std::clamp<size_t>(n / (size_t(nt) * 8), chunk_min, chunk_max);
|
|
42
49
|
std::exception_ptr err;
|
|
43
50
|
std::mutex emu;
|
|
44
51
|
|
|
45
52
|
auto worker = [&] {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
// Scratch construction can allocate and throw too. Nothing may escape the entry point.
|
|
54
|
+
try {
|
|
55
|
+
auto local = make_local();
|
|
56
|
+
for (;;) {
|
|
57
|
+
const size_t start = next.fetch_add(chunk);
|
|
58
|
+
if (start >= n) break;
|
|
59
|
+
const size_t end = std::min(n, start + chunk);
|
|
60
|
+
for (size_t i = start; i < end; ++i) {
|
|
53
61
|
body(i, local);
|
|
54
|
-
} catch (...) {
|
|
55
|
-
std::lock_guard<std::mutex> lk(emu);
|
|
56
|
-
if (!err) err = std::current_exception();
|
|
57
|
-
return;
|
|
58
62
|
}
|
|
59
63
|
}
|
|
64
|
+
} catch (...) {
|
|
65
|
+
std::lock_guard<std::mutex> lk(emu);
|
|
66
|
+
if (!err) err = std::current_exception();
|
|
60
67
|
}
|
|
61
68
|
};
|
|
62
69
|
|
|
63
|
-
|
|
70
|
+
// A failed thread launch must also join workers already started before unwinding.
|
|
71
|
+
std::vector<std::jthread> pool;
|
|
64
72
|
pool.reserve(nt);
|
|
65
73
|
for (unsigned t = 0; t < nt; ++t) pool.emplace_back(worker);
|
|
66
74
|
for (auto& th : pool) th.join();
|
|
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
|
|
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
|