epibudget
A Python tool for choosing protein variants that expose mutation interactions when every experimental measurement has to earn its place.

The problem
Protein language models can rank thousands of mutations before a lab measures one. But selecting the variants predicted to be fittest is not the same as selecting the measurements that reveal how mutations interact. Under a plate budget of 48, 96, or 192 wells, that distinction determines whether the experiment produces a cluster of predicted winners or a dataset that constrains an epistasis map.
What I built
- Conjoint ESM-2 scoring applies every mutation before reading conditional scores, preserving context-dependent interaction signal.
- An interaction graph represents the pairwise and third-order loops that candidate measurements help close.
- A label-blind allocator ranks variants by loop count before any measured fitness enters the pipeline.
The implementation keeps loop count, predicted fitness, and ESM masking dispersion as separate strategies so that each contribution can be tested directly. In the historical code and artifacts, the loop-count baseline is named structural; it does not use protein 3D structure.
Current evidence boundary
On TrpB, info beats fitness and random for pairwise map recovery. The loop-count baseline exceeds info at budgets 96 and 192, but not at 48, so the result does not support an added benefit from ESM masking dispersion.
In the registered downstream benchmark, loop-count selection beats fitness-greedy in 20/20 partitions on both GB1 and TrpB. The masking-dispersion gate does not pass on either landscape.
All comparative results remain provisional. GB1 map-recovery remains inconclusive_zero_gpu, and the TrpB source mirror contains 871 imputed fitness values that are not identified row by row. No claim is made beyond these landscapes and the fixed downstream learner.