v0.3.0 — gap-block alignment, calibrated cutoffs, batch scoring, island profiles
Gap-block alignment, calibrated cutoffs, batch scoring, and per-island profiles — plus a corrected background control that changes every E-value.
Added
gapblock— single contiguous-indel alignment for V(D)J junctions, the position set by a gap prior (central_prior,profile_prior,frame_prior,positions_prior) rather than the score alone. Exactly optimal against unrestricted affine alignment on 98.8% of genuinely related pairs at a calibratedgap_open.gapblock.score_matrix/ScoreMatrix— every query × every reference in one GIL-released C++ call: ~532 M pairs/s on 16 cores,numpy.asarrayis zero-copy, and seqtree keeps its zero runtime dependencies. The shape a prototype-distance embedding needs, where nothing can be pruned.gapblock.IslandProfile— a per-island position weight matrix whose column penalty is measured against the column consensus, so it stays≥ 0, is0on the consensus, and flows throughthreshold_for_evalueunchanged. Beats min-over-members only at a strict cutoff (48.5% vs 37.6% at repertoire scale; indistinguishable at a loose one).threshold_for_evalue/thetas_from_scores— the per-query score cutoff that achieves a target E-value, inverted exactly from the integer scores.
Breaking
- The bundled control is regenerated as a uniform sample of productive clonotypes (it was the abundance head, 25.8× too self-similar). Every E-value moves. After upgrading, delete
~/.cache/seqtree/control_*.sqtreeso the cached index is rebuilt from the corrected control. engine="auto"always resolves toseqtm; passing a matrix toseqtriewithout an explicitmax_penaltynow raises.GapPriortakes(block_start, block_length, longer_length).
Full detail in CHANGELOG.md.