Views
No views yet
ibm-research/MoLFormer-XL-both-10pct (MolFormer-XL), frozen: SMILES → mean-pooled token
embedding → 768-d, then a 2-layer MLP (768→1024→768).sentence-transformers/all-MiniLM-L6-v2 (MiniLM), frozen: each of the 7 metadata
fields is embedded separately (mean-pooled, L2-normalized) → 384-d, then a learned
per-field projection → 64-d (7×64 = 448-d total).
A missing/empty field uses a learned per-field "missing" embedding instead of the text embedding,
so absent metadata is handled gracefully and distinctly from any real value.[mol_mlp (768) | metadata (448)] = 1216-d.[z_A, z_B] (2×1216) + molecule A's bioavailability scalar (value_A / 100)
→ 2433-d input.sigmoid(logit) = P(transfer). ~407M trainable params; encoders frozen.molecule_name, species_or_population, dose, oral_exposure_mode, qualifying_conditions, comparator, extra_detailsNone/"", for a missing field
— the model then uses its learned per-field "missing" embedding.1from transformers import AutoModel
2m = AutoModel.from_pretrained("jiosephlee/starling-transfer-ssv2-srcval", trust_remote_code=True).eval()
3
4out = m(
5 smiles_a=["CC(=O)Oc1ccccc1C(=O)O"], # molecule A (bioavailability known)
6 smiles_b=["CCO"], # molecule B (candidate)
7 metadata_a=[{"species_or_population": "human", "dose": "325 mg", "oral_exposure_mode": "tablet"}],
8 metadata_b=[{"species_or_population": "human"}], # missing fields are fine
9 source_value=[68.0], # molecule A's RAW oral_bioavailability_value (e.g. percent)
10)
11p_transfer = out.logits.sigmoid() # batched: pass parallel lists for many pairssource_value is molecule A's raw oral_bioavailability_value; the model scales it internally by
100. Inputs are batched lists of equal length.same_species_v2 oral-bioavailability transfer split (~338M molecule pairs; the frozen
embeddings are precomputed once and the head is trained on top). The label is |value_A - value_B|
thresholded, so the model uses A's known value as an anchor and learns to estimate B's
bioavailability from its structure + metadata.