You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wave B (this issue, right after A): the variants-output surface, which needs new channels decoded into the window buffer (DecodedWindow) per backend.
Scope (Wave B)
Bring StreamingDataset up to the written Dataset's variant-level output surface:
with_seqs("variants") (RaggedVariants) and with_seqs("variant-windows") (_FlatVariantWindows).
min_af / max_af filtering. Note: on the written path this is implemented only for variants output (get_variants_flat, _flat_variants.py); haplotype/annotated output raises NotImplementedError (_haps.py:707). Streaming matches that — hence AF lives in Wave B, not A.
var_fields (custom per-call FORMAT / INFO columns; default ["alt","ilen","start"]).
Why this is the expensive half
The written variants path (get_variants_flat) does not use a reconstruct kernel — it uses assemble_variant_buffers_u8/i32 + gather/compact helpers, consuming per-variant data the current streaming buffer (src/record_stream/transpose.rs::DecodedWindow) does not carry:
REF allele bytes (ref/ref_offsets) — for RaggedVariants.ref/end and variant-windows.
dataset-global variant ids — streaming's geno_v_idxs are window-local column indices.
fill_decoded_window throws all of this away today; Wave B must extract it per backend (VCF/PGEN INFO/REF decode via genoray DenseChunk; SVAR1/SVAR2 read it from their stores).
Part of the write-free
StreamingDataseteffort — seedocs/roadmaps/streaming-dataset.md(Plan 5). Split out of #277.#277 (output-mode breadth) splits along a hard technical seam into two waves:
with_len, jitter, andwith_seqs("annotated")— all reuse the existing streaming window buffer and the fused reconstruct kernels. Plumbing, not new decode.DecodedWindow) per backend.Scope (Wave B)
Bring
StreamingDatasetup to the writtenDataset's variant-level output surface:with_seqs("variants")(RaggedVariants) andwith_seqs("variant-windows")(_FlatVariantWindows).min_af/max_affiltering. Note: on the written path this is implemented only forvariantsoutput (get_variants_flat,_flat_variants.py); haplotype/annotated output raisesNotImplementedError(_haps.py:707). Streaming matches that — hence AF lives in Wave B, not A.var_fields(custom per-call FORMAT / INFO columns; default["alt","ilen","start"]).Why this is the expensive half
The written variants path (
get_variants_flat) does not use a reconstruct kernel — it usesassemble_variant_buffers_u8/i32+ gather/compact helpers, consuming per-variant data the current streaming buffer (src/record_stream/transpose.rs::DecodedWindow) does not carry:ref/ref_offsets) — forRaggedVariants.ref/endand variant-windows.AFINFO field — formin_af/max_af.var_fields(Surface genoray SparseVar custom FORMAT fields (Number=G) in Dataset/RaggedVariants, not just dosage #231).geno_v_idxsare window-local column indices.fill_decoded_windowthrows all of this away today; Wave B must extract it per backend (VCF/PGEN INFO/REF decode via genorayDenseChunk; SVAR1/SVAR2 read it from their stores).Also in scope
skills/genvarloader/SKILL.mdupdates for every new knob (per CLAUDE.md's public-API + docs-audit gates).Parity oracle
Byte-identical vs
gvl.write()+Dataset[r, s]under the matchingwith_seqs(...)/min_af/max_af/var_fieldsconfig.Backends
SVAR1 + VCF + PGEN (the backends merged into
streaming). SVAR2 (#298) picks up the same generic code when it merges.