Hailing Ducks LD annotation benchmark#

Decision#

Hailing Ducks remains an opt-in LD annotation backend. It is roughly twice as fast as Gentropy and uses less memory on the measured loci, but Hailing Ducks v1.1.0 intentionally rejects multiple distinct requested variants at the same genomic position. The large fixture therefore has a small pair-coverage gap. Gentropy remains the default until that gap is resolved.

The promotion gates are:

  • zero shared-value mismatches at absolute tolerance 1e-8;

  • zero backend-only pairs in both directions on the large regression locus;

  • successful SNP, indel, allele-flip, native hg38 HT, and BM smoke checks;

  • peak task memory below the configured 16 GiB local-test allocation; and

  • wall time no worse than Gentropy on representative small and large loci.

Environment and method#

Measurements were taken on 29 July 2026 against the public Pan-UKBB EUR, CSA, and AFR resources in us-east-1. Gentropy used the existing Nextflow task traces. Hailing Ducks used the pinned ghcr.io/project-defiant/hailing-ducks:v1.1.0 native CLI inside the collector image.

Hailing timings separate the extension call—which combines remote HT/BM query and native LD/status Parquet materialisation—from collector adaptation and the final combined output write. Hailing Ducks v1.1.0 does not expose network lookup and native output-write timings separately.

Results#

Metric

Small chr1 locus

Large chr1 locus

Input locus variants

4,951

19,432

Hailing output pairs

1,058,236

24,249,143

Gentropy output pairs

1,058,236

24,279,447

Shared-value mismatches

0

0

Maximum absolute shared difference

0.0

0.0

Hailing wall time

1m50s

7m48s

Gentropy wall time

3m22s

15m15s–16m53s

Hailing native query/materialise

1m35s

7m08s

Hailing collector adaptation

0.93s

22.09s

Hailing final output write

0.18s

4.94s

Hailing peak RSS

0.71 GiB

7.84 GiB

Gentropy peak RSS

10.47 GiB

13.41–13.71 GiB

Hailing output size

8.57 MiB

214.24 MiB

Gentropy output size

18.02 MiB

432.82 MiB

Correctness findings#

The small locus has exact row and value parity across AFR, EAS, and NFE.

For the large locus, every one of the 24,249,143 Hailing pairs exists in the Gentropy output with exactly the same LD value. Gentropy has 30,304 additional pairs, including seven additional diagonals. Those seven variants occur at positions with two distinct requested variant IDs in the same study-locus. Hailing Ducks reports this request shape as multiple_variants_at_position; it is not a rounding, contig, indel, or allele-sign error. The missing share is approximately 0.125% of the Gentropy pair set.

Operational safeguards#

  • params.ld_annotation_method defaults to hailing_ducks. Gentropy is retained only as an explicitly configured comparison backend.

  • Hailing Ducks uses ancestry-specific requests derived from study metadata.

  • params.hailing_ducks_max_cached_blocks defaults to 8.

  • Adapted ancestry outputs are written to temporary Parquet files before the final union, avoiding an in-memory cross-ancestry accumulator.

  • The process continues to run per fineMappingLocusSetId.

  • Zero-pair ancestry statistics feed the existing locus-level invalidation.

  • collector ld_parity fails when shared LD values exceed the configured tolerance and reports backend-only and diagonal differences explicitly.

  • make -C tools/collector hailing-s3-smoke is opt-in and network-dependent; ordinary unit and nf-test suites remain offline.