auguste.gardette
08/18/2026, 4:45 PMsativa.py, one in epac/config.py, one new module. The files holding the decision rule are byte identical to upstream.
Three findings:
⢠Daniel's S. aureus case is reproducible. Relabelling k sequences of one species with a distant genus name, unmodified SATIVA recovers 28 of 33 injected mislabels, this version 33 of 33. Every miss happens when at least two sequences share the wrong label: the strict leave-one-out removes one and the remaining copies confirm the error, a fold removes several at once.
⢠Speed: 257 s to 15 s at 1600 sequences, 1536 s to 87 s at 5402, mostly from parallelism over queries. Agreement with 25 folds is 0.98 recall / 0.90 precision at 800 sequences, 0.85 / 0.78 at 5402. For scale, unmodified SATIVA against itself gives 0.92 / 0.90 when only its substitution model changes.
⢠A trap for anyone doing the same: EPA-ng reads its model from the RAxML_info SATIVA writes, and above 500 taxa that file comes from a GTRCAT run where alpha: 1.000000 is a placeholder. It was running GAMMA with an unfitted shape on every large alignment. Building the reference tree under GTRGAMMA fixes it for a few seconds of compute.
One thing that is not in the benchmark but matters as much, and connects to the clustering discussed above: before alignment I cluster with MMseqs2 and merge clusters back together, so each alignment stays small and homogeneous enough for SATIVA. With ITS, aligning across distant taxa gives an alignment so sparse that the placements degrade and SATIVA stops proposing anything, whatever the engine. Speed is not the only reason to cluster first.
My open question for the 25th: is a k-fold holdout an acceptable stand-in for the per-sequence leave-one-out, or is a batched exact one realistic at the libpll level? One sequence at a time through EPA-ng costs more than the RAxML it replaces, so batching is where the gain lives.Daniel Lundin
08/19/2026, 6:03 AMDaniel Lundin
08/19/2026, 6:05 AMauguste.gardette
08/19/2026, 6:24 AMauguste.gardette
08/19/2026, 8:09 AMauguste.gardette
08/19/2026, 8:39 AM-profile conda fails for one. Should I open GitHub issues for those?Daniel Lundin
08/19/2026, 10:03 AM-resume to allow restarts when something breaks or parameter choices change, 5. easier (IMO) to add steps to the pipeline. nf-core can, in addition: 1. provide standards for code and docs, 2. peer review (a double-edged sword since it can take time), 3. better chances for long-term maintenance, 4. a module repository. (I probably forgot things there.) The code you have would fit perfectly if modified into standalone programs that can be called by Nextflow. (Currently, my implementation has inline Python code. Would be much better with individual scripts in a repo under a release scheme.)
And yes, if we decide to go ahead with Nextflow/nf-core it would be great to have large scale test datasets.
Let's discuss further on Tuesday.Daniel Lundin
08/19/2026, 11:10 AMauguste.gardette
08/19/2026, 2:23 PMDaniel Lundin
08/19/2026, 2:29 PMauguste.gardette
08/20/2026, 2:14 PMDaniel Lundin
08/20/2026, 2:21 PMauguste.gardette
08/20/2026, 2:28 PM