DNA-encoded libraries
Reading the
unreadable.
Seven and a half million molecules carry a signal almost nobody can extract. We built the estimator that extracts it — without a single binding label.
← → to navigateOne experiment. Millions of measurements. Almost all of them discarded.
A DNA-encoded library screen is the cheapest way in pharma to ask millions of molecules a question at once. The answer comes back as a sequencing read count — and the standard practice is to apply a hand-picked cutoff and throw the rest away. The data is not the bottleneck. Reading it is.
Almost every molecule was seen exactly once.
A single read is close to no information. Across all ten libraries the singleton share runs 97.4% to 99.9%. Every per-molecule number computed from this data is dominated by the prior you impose on it — which is why the counts normally get thrown away.
A cutoff is a guess. We let each library tell us where its own signal starts.
Every library's count histogram is fitted as two overlapping populations — one that is pure sequencing noise, one that is real binding. Five candidate zero-truncated families per library, chosen by BIC. What falls out is not a threshold but a probability.
P(signal | count) for qDOS30. The decision boundary lands at 3 — but it was derived, not chosen, and it comes out at 4 in qDOS18_3. Ten libraries, ten separate fits.
Six stages. No human ever labels a molecule.
The fitted distribution assigns every molecule a label. A gradient-boosted tree then learns to predict that label from chemical structure alone — so it can score molecules that were never in the library at all. Counts teach the model; structure lets it travel.
The easiest way to fake a good number on DEL data is to let the model mark its own homework.
Molecules built from the same two building blocks are near-identical. Split them at random across training and test and the model simply recognises what it has already seen — and every reported score is inflated.
So the folds are grouped by disynthon pair: a deterministic hash of the library and the (b1, b2) pair decides which fold a molecule belongs to. The guarantee is absolute — no molecule is ever scored by a model that saw its own building-block pair. All 7,465,100 labelled rows were scored this way.
common.py · fold_of(lib, b1, b2, K)
It finds the signal.
Every design choice was settled by a 154-run bake-off on identical folds: how to treat single-read molecules, which fingerprint, which learner. The configuration that won programmatically was rejected — its features cannot be computed for a molecule outside the library. We measured the price of that constraint: 0.003 AUC.
Two scored entries in the active learning phase.
The challenge scores distinct series first, not raw hits — because a programme needs several independent chemical starting points, not fifty variations of one. Our scored entries came from the fingerprint selection model. The count model described here has never been scored, and nothing on the following slides claims otherwise.
We can prove which part of the result was the model and which was the selection rule.
Two entries, byte-identical score columns, one difference: how widely the 50 picks were spread across chemical space. The identical AUCs are the proof the model was untouched — so the entire difference in outcome is attributable to the rule. That is a controlled experiment, run prospectively, against a held-out set we could not see. It also told us the rule is close to a spent lever: across cap settings the series count moves within a narrow band.
The two models barely agree. That is the asset, not the problem.
A fingerprint model trained on 39 known binders and a count model trained on zero binders pick almost disjoint molecules — yet both concentrate their agreement exactly at the top. Two independent lines of evidence about the same chemistry. Combining them has never been tested end to end. That is the single largest piece of unspent headroom in the programme.
This is not one answer. It is a procedure that runs on any DEL screen.
Nothing in the method is specific to PGK2. It needs read counts and structures — which every DEL screen already produces. The release is frozen, hash-manifested and bit-exact reproducible, and the discarded data is retained with a recorded reason for each exclusion. An auditor can rerun it and get the same numbers.
We know exactly where this model is weak, because we went looking.
Held-out AUC when whole building blocks are hidden from training — the regime that applies when scoring molecules from outside the library. 0.959 drops to 0.827, and one library falls to 0.586. No published method solves off-library transfer; the literature does not demonstrate it either. We report the number that a competitor's deck would leave out, because it is the number that defines the next piece of work.
Three pieces of work, in priority order.
[ the ask — amount, use of funds, milestone ]