Two populations cross the same network and pay the same price per edge. The equilibrium fixes how much flows on every edge, and cannot say whose flow it is: the set of splits it cannot tell apart is a face, and its dimension is a number this page decides in exact rationals — 6 on the network of Bakaryan, Aoun, de Lima Ribeiro, Hovakimyan and Gomes. Drag a direction of that face and watch the two populations trade an edge while every total holds. Drop an edge and watch the dimension re-decided.
Every band is one member of the face, drawn as such: its width is the flow, population a the brighter side, population b the darker, and the dotted outline says it was chosen, not decided. Filled nodes are exits; the two larger nodes are the entrances a and b. Click an edge to drop it.
k is decided. The two populations’ conservation systems are stacked, restricted to the 11 edges both can reach, and their null space is computed over the rationals: dimension 6, rank 5. The same arithmetic runs in this tab. It is the theorem of the face law, k = |shared| − cons + z, decided in Python on 7,850 networks and recorded in certs/facelaw-theorem.json; the JavaScript engine here is a second copy of that rule, and the page refuses to build unless the two agree on every k, z and shortcut they share (6 cycle rows, 3 failing instances, the paper’s network).
The totals are chosen. Table I of the paper prints rounded integers, and rounded integers are not a flow: at nodes 3 (-1), 4 (+2), 5 (+1), 6 (-1), 7 (-1) the printed outflow does not equal the inflow. The totals drawn are the nearest conserving flow to Table I in the least-squares sense, solved exactly — no edge moves by more than 21/37 (0.568), inside the rounding. That is one member of the rounding box, so it is drawn dotted. The totals themselves are reproduced within their rounding and proved on the Wardrop page; this page does not re-prove them.
The split is chosen. Population a’s share of each shared edge is one point of the face, found by exact max-flow and centred so that no flow sits at zero (smallest slack 3/2). The sliders move it along the 6 directions of the null space; the ranges are where a flow would turn negative. Nothing decides which point the players actually chose — the paper’s own scenario S1 has unique totals and a split that moves across re-seeds, which is exactly the non-uniqueness this face measures.
The shortcut k = |shared| − cons is what one would guess and what the paper’s network makes look like a law (z = 0 there). It is wrong exactly when the shared subgraph has a component with no exit, and then it undercounts by that number of components. Across 3,925 random networks the theorem was tested on (seed 5320260901), the shortcut failed 571 times and z was positive 571 times — the same 571 networks. Three of them, from the record, and the constructed family that forces it:
Every network in the gallery is a preset above. The engine that decided them is playground/census/engine.js, written fresh in JavaScript with BigInt rationals against the Python record, and the facts on this page were written by make-facts.mjs after that cross-check passed.