The Verification Venue · pointed at the space behind the answer

Six Hundred Fifty-Four Million Family Trees

Ask a program to infer an evolutionary tree and it hands you one tree. At four taxa that looks like a decision: there are only three possible answers. At twelve taxa there are 654,729,075, and the tree you were handed is one of them. This page scores every single one, in your browser, and shows what the search could not tell you: the winner stands on a plateau.

This is the sequel in spirit, not in method, to more data, wrong tree. That page grows DNA down a four-species tree and watches an inference method converge on the wrong answer. This page does the opposite thing: it assumes the method finds a good tree and asks how big and how crowded the space was that the answer came from. Four taxa cannot show it, because three trees make inference look like a choice. Complete enumeration can.

Taxa · 9

Nine taxa is 135,135 trees, scored in about a second: the whole instrument, small. Twelve is 654,729,075 and takes a minute or two on a typical machine. Pick a size, then press Go. ↓ Ten is 2,027,025 and eleven is 34,459,425, each a rung the ladder climbs.

← log-likelihood distance below the maximum (bin width 0.5)trees within 2.0 →

Maximum log-likelihood

·

at tree index ·

Trees within 2.0 of the max

·

· trees visited

idle

The scoring is Felsenstein's pruning algorithm under a two-state symmetric substitution model, on 40 simulated sites compressed to distinct patterns with their multiplicities, with branch probabilities held fixed at the generating values. Fixed is load-bearing: real phylogenetic likelihood optimises branch lengths per topology, which reshapes the surface. Holding them fixed is what makes visiting all 654,729,075 trees affordable, and every plateau number on this page is a statement about this fixed-length surface, at this seed (20260825), on this simulated dataset, and about nothing else.

The check · run in front of you, refusing to be decorative

Before any headline number is shown, the compiled engine and a slow, obviously written JavaScript reference run the same battery of small instances and must agree fingerprint for fingerprint. The control button deliberately breaks the reference and requires the comparison to go red. The planted-data button regenerates the sequences down a different stated topology and requires the same unmodified engine to find that tree.

battery rowwasmreferencematch

control not yet run: the comparison has never been watched failing.
planted-data control not yet run.
decomposition check: runs automatically at 9 taxa; press the button for the full 12-taxon second pass.

engine hash: loading…

What none of this rules out: the two implementations share the simulator and the model equations, because the dataset is part of the contract both implement. Agreement proves the enumeration, the pruning code and the bookkeeping agree; it cannot catch a misunderstanding both authors shared. Two decompositions agreeing rules out boundary errors and very little else. At 9 and 10 taxa the slow reference completes the entire space, so the full result there is checked end to end; only 11 and 12 rest on the decomposition and the visited-count invariant. Run it yourself: node research/six-hundred-fifty-four-million-trees/verify-six-hundred-fifty-four-million-trees.mjs. The reproducible-build check is offline: your browser has no compiler, so it runs in that verifier, not here.

The point estimate is a plateau, not a peak

A search returns one tree and cannot report the rank it achieved. Enumeration can. Three things become visible only because every tree was scored:

(i) The shape of the top. The histogram above is the distribution of log-likelihood depth below the maximum, binned at half a unit. The count in its first four bins is the plateau: every tree within 2.0 of the best. It is far greater than one, and its exact value is a property of this dataset and seed, printed live, never asserted.

(ii) What hill-climbing achieves. Nearest-neighbour-interchange climbing from a random start lands on a local optimum. Because the whole space was scored, that optimum's exact rank is knowable. Ranks are computed against the retained top 4,096 trees; a landing spot below that is reported as beyond the leaderboard rather than guessed.

(iii) What a short branch does. Regenerating the data down a different stated topology with one very short internal branch (substitution probability 4/256 instead of 48 or 64) makes the two halves of the tree nearly indistinguishable. The plateau swells and the maximum's margin over its nearest rival collapses.

requires a completed 12-taxon enumeration.
requires a completed 12-taxon enumeration; the short-branch run is a second full pass and takes about as long.
baseline not yet measured.
What's exactly true, what's a model, and what this page refuses to claim

Exactly true. The enumeration visits every one of the (2n−5)!! topologies, the indexing is a verified bijection (every index at 6 and 7 taxa decodes to a distinct canonical split system), and the maximum, plateau count and histogram are exact for this dataset, this seed, this model, these fixed branch probabilities.

Idealised. Two states, no rate variation, equal base frequencies, branch probabilities fixed at the generating values, sequences simulated rather than observed. Real likelihood phylogenetics optimises branch lengths per topology; this page does not, and says so everywhere it prints a plateau figure.

Not claimed. Nothing about real organisms. Nothing about heuristic search being unreliable: the honest finding is about what a search cannot report, namely its own rank, not about what it finds. The plateau count is one number for one dataset, not a general law of phylogenetics.