hex

36.7. Performance🔗

The six-way comparison runs C dense nauty, C sparse nauty, C Traces, Hex dense, Hex sparse and Alex Meiburg's IsoGraph on the same 333 labelled graphs from 20 families, through 3,072 vertices. It measures native canonicalization after input construction. For Hex sparse this includes parsing the returned label and producing normalized sparse canonical rows. It does not include certificate production or kernel replay.

Canonicalization time by graph family for all six implementations

Six-way cactus plot of canonicalization times

Open the family plot or cactus plot at full size to inspect the individual curves.

In the retained measurements, the implementations complete these numbers of instances within the five-second per-call cutoff:

implementation

completed / 333

C dense nauty

307

C sparse nauty

318

C Traces

308

Hex dense

282

Hex sparse

310

IsoGraph

296

On 282 cases completed by both Hex implementations, the median per-instance sparse/dense time ratio is 0.25. On 296 cases completed by both Hex sparse and IsoGraph, the corresponding ratio is 0.73. These ratios describe different solved subsets. The sparse measurements were refreshed while the other five series were retained from earlier sessions on the same shared host, so the ratios are observations about this corpus, not universal speed factors.

The family plot shows where each algorithm does well. A cross marks where a series stops: a call exceeding five seconds stops that series on the family, and larger sizes are not attempted. Missing observations are not assigned the cutoff time. The cactus plot sorts each series' completed instances independently; farther right means more completed instances, while lower means less time. Neither plot claims a general complexity bound for graph isomorphism.

The protocol uses two passes, a warmup and five timed calls per case (one when warmup exceeds one second), and reports the minimum completed call. The comparison report records the corpus, versions, input boundaries, stopping rules, raw outcomes and reproduction commands. Its search and conversion figure and tables separate construction and relabelling costs. Constructing a sparse graph from edges avoids a dense intermediate; converting an existing matrix still requires reading that matrix.

Conformance compares Hex dense with C dense, and Hex sparse with C sparse. The sparse comparison agrees on visited-node counts on every completed case. Its per-node scaling check passes the recorded 0.2 exponent tolerance on every family with enough matched sizes. This is evidence that the representation improvements preserve the intended search, rather than evidence that dense, sparse and Traces explore the same tree.

Proof-producing use has separate costs. A call to graph_iso must construct a proof whose decisive checks run in the kernel. Positive transporter checks and negative certificate replays can have very different costs, and neither can be inferred from native canonicalization timings. The validation report links the separate automorphism, certificate-production, native-replay and imported kernel-proof measurements. The public totality and correctness theorems apply to the optimized sparse search used in the comparison.