3-Adic Hyperbolic VAE โ Cytochrome C Phylogeny Validation
Three trained conditions from docs/plans/PHYLOGENY-VALIDATION-PIPELINE.md
(repo: https://github.com/gesttaltt/3-adic-ml), testing whether a p-adic /
hyperbolic VAE architecture recovers real cytochrome c phylogeny (39 species,
UniProt Pfam PF00034, NCBI taxonomy) better than simpler baselines.
Conditions
| Condition | Architecture | Losses |
|---|---|---|
A (condition_A_euclidean/) |
Flat Euclidean VAE | Standard reconstruction + Gaussian KL |
B (condition_B_hyperbolic_generic/) |
TernaryVAEV6Controllable, factored=false |
Reconstruction + generic hyperbolic KL only, all p-adic-specific losses off |
C (condition_C_padic/) |
TernaryVAEV6Controllable, same as v24.0_tangent_fix.yaml |
Full p-adic hierarchy/geodesic/algebraic loss curriculum |
Fase 4 result: does embedding distance recover taxonomy?
raw_encoding_baseline = zero-model control (Euclidean distance on raw
hydropathy-encoded aligned sequences, no VAE). Any condition must beat this
to demonstrate the architecture learned something beyond
conserved-sequence-implies-close-relative.
| Condition | Spearman vs. taxonomic distance | Mantel p | Verdict |
|---|---|---|---|
| raw_encoding_baseline | 0.7228 | 0.0001 | does not beat baseline |
| A_euclidean | 0.6285 | 0.0001 | does not beat baseline |
| B_hyperbolic_generic | 0.6538 | 0.0001 | does not beat baseline |
| C_padic | 0.4955 | 0.0001 | does not beat baseline |
Full results with bootstrap CIs: phylogeny_recovery_results_full.json.
Follow-up: Condition D (taxonomy-conditioned), with a real species holdout
condition_D_taxonomy_conditioned/ tests a narrower question the table
above left open: hyperbolic geometry is well-suited to trees, but nothing
above ever pointed a hyperbolic loss at the real tree -- C pointed it at
v_3(index) instead. Condition D uses a new TaxonomyGeodesicLoss
(targets real inter-species taxonomic distance) and, for the first time in
this repo, a genuine species-level holdout: trained on 30/39 species,
evaluated separately on the 9 held out (stratified across kingdoms, never
seen in training). See condition_D_taxonomy_conditioned/heldout_species.json
for the exact list.
| Split | Spearman | vs. raw baseline (same subset) |
|---|---|---|
| Held-in (30 species, seen in training) | 0.8404 | beats 0.7228 (expected) |
| Held-out (9 species, never in training) | 0.5091 | loses to 0.7803 |
A no-encoder sanity check (39 free Poincare points fit directly against the
taxonomy matrix, no VAE) scored 0.9057 -- confirming hyperbolic geometry can
represent this tree well on its own. That advantage did not transfer once an
encoder had to derive placement from the same collision-heavy 3-symbol
hydropathy encoding used throughout this dataset (see index_collision in
the results JSON). Bootstrap CIs at n=9 held-out species are wide
([-0.12, 0.87] vs. [-0.04, 0.94]), so this is best read as "no detectable
held-out generalization advantage," not a definitive negative.
Full methodology and all four splits (held-in/held-out/mixed/overall):
phylogeny_recovery_results_D_taxonomy_conditioned.json and
TAXONOMY-CONDITIONED-EMBEDDING-PLAN.md
in the source repo.
Loading
import torch
ckpt = torch.load("condition_C_padic/checkpoint.pt", weights_only=True)
See the source repo's src/models/vae.py (TernaryVAEV6Controllable) and
src/models/vae_baseline.py (TernaryVAEEuclideanBaseline) for the model
classes these checkpoints load into.