contributions
open-source contributions to scientific software projects
Ran AlphaFold 3 on an AMD Instinct MI300X and found that run_alphafold.py assumed every GPU reports a numeric compute capability. AMD reports 'gfx942', so startup crashed with an unexplained ValueError. Proposed an actionable error that names the device and points to --jax_backend=cpu, with no change on NVIDIA. Verified the CPU backend on the MI300X matched an RTX 5080 CUDA reference (pTM 0.83, mean pLDDT 90.20), and mapped the remaining blockers for ROCm support in tokamax and the ROCm JAX plugin. Fixed in run_alphafold.py by Augustin Zidek. cfbfddd
Found that template queryIndices outside the sequence were never validated. An index past the end crashed later in featurisation with a bare numpy error, and a negative index was accepted silently: the chain folded against an alignment the user never specified, and the run looked normal. Proposed rejecting out-of-range indices at parse time alongside the existing PTM bounds check, verified end to end on the real pipeline. The fix was implemented differently by Augustin Zidek, with validation and tests added to folding_input.py, citing the PR as its basis. c6ea94f
The performance docs said the JAX persistent compilation cache avoids recompilation between runs, but gave no measured effect. Benchmarked it on an RTX 5080: subsequent runs drop from ~143-148 s to ~32 s with the cache enabled, and cached runs are bit-identical (0.000000 Å difference) where uncached runs vary by ~0.131 Å RMSD. Wording kept deliberately non-specific since measurements came from a single machine. Adapted into docs/performance.md by Augustin Zidek. a66cc52
Restored backwards compatibility for input JSON written by AlphaFold 3 versions 3.0.0 through 3.0.3, which serialized empty template maps as "templateIndices": null and caused a TypeError when loaded in 3.0.4. Null values are now read as empty maps rather than passed directly to zip(). Also added strict=True to the zip call so mismatched queryIndices and templateIndices lengths raise instead of silently truncating. Merged with a refactor by Augustin Zidek. 2546145
Removed two unused tensors (disto_target and token_to_rep_atom) inherited from a training featurizer but never read by the inference forward pass, along with the _compute_disto_target helper (~40 lines). Added a regression test asserting the exact set of expected featurizer output keys. On an RTX 5080: GPU memory reduced from 155.1 to 16.8 MiB (~9x smaller), host-to-device copy time from ~9.8 to ~1.3 ms per batch (~7x faster). Merged by Nikhil Shenoy.
Replaced two sequential einsum operations in OuterProductMean with a single fused three-way einsum, reducing peak intermediate tensor memory from ~256 MB to ~72 MB (3.56x reduction) with no throughput regression. Outputs verified numerically identical on an RTX 5080. Merged by Augustin Zidek; included in v3.0.4 release notes. 7b4c2a5
Fixed a crash in folding_input.py where serializing a ProteinChain with an empty query_to_template_map caused a TypeError on deserialization. The list(values) or None pattern was converting empty lists to null, which then broke zip(queryIndices, None). Removed the or None clause so empty template maps serialize as [], consistent with how queryIndices is already handled. Merged by Augustin Zidek. 62136ec
Corrected four critical errors across bioinformatic analysis skills: replaced incorrect normal-distribution p-values in rnaseq-de with a proper Welch t-test (prior method had a 90.6% false discovery rate at n=3); fixed a flipped sign in the Gompertz age formula in proteomics-clock that caused a consistent +6.13-year bias; extended ORF detection in analyze-fasta from 3 forward frames to all 6 (enabling reverse-complement gene discovery); and added EM admixture convergence checking to genome-compare to prevent silent failures. Added unit tests and scipy dependency declaration.
Corrected the GF-matrix vibrational analysis implementation to use mass-weighted Cartesian coordinates. The prior code used unweighted coordinates, causing heavy atoms (Br, I, S) to artificially dominate eigenvalue calculations and misidentify soft conformational modes. Fix substantially reranks low-frequency modes in heavy-atom systems, e.g. 2-iodothiophene shifted from 3 to 5 correctly identified soft modes, with iodine displacement dropping from 59% to ~3%.
Ported the RDKit 2026.03 BFGS gradient-convergence denominator fix into nvMolKit's CUDA minimizer kernels, gated behind a version check to preserve compatibility with older RDKit builds. Applied to both the batched and per-molecule BFGS paths (bfgs_minimize.cu, bfgs_minimize_permol_kernels.cu).
Fixed a decade-old bug in the BFGS optimizer where negative energy values (common in MMFF94/UFF force fields) caused the convergence denominator to clamp to 1.0, artificially tightening gradient tolerance and triggering spurious "too many iterations" errors. Replaced funcVal with fabs(funcVal) in BFGSOpt.h and added a regression test covering always-negative energy trajectories.
Six targeted GPU performance and correctness improvements across independent subsystems: replaced sequential block reductions with warp-shuffle patterns in conformer RMSD (17→3 sync calls); switched TFD kernels to double-precision sqrt with division-by-zero guards; moved eigensolver buffer allocation to a persistent class member; introduced per-device similarity caching; preserved signed-energy reference behavior in BFGS; and fused Butina clustering GPU→CPU sync points from ~6 to 2 per iteration.
Fixed six distinct bugs across the RoseTTAFold-All-Atom codebase: initialized L_s/offset before use in multi-chain PDB parsing; removed a line in protein.py overwriting insertion counts with residue indices; corrected an undefined variable in Track_module.py's symmetry fitting; added a guard for empty-tensor torch.cat() in the refinement block; fixed a tensor shape mismatch from (L,1) to (1,L,1); and removed unreachable dead code in parsers.py.