Add bridge-derived census (n=6..10) to the disjunction section

Cross-tabulate bridge-derived vs intertwining-tree coverage: the
bridge-derived share falls from 100% (n=6) to 62.7% (n=10), the
disjunction never relies on it alone, and the "neither" column is
identically zero throughout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 02:27:49 -04:00
parent b1d681f39e
commit d9007c8697
7 changed files with 191 additions and 49 deletions
@@ -0,0 +1,84 @@
"""Survey: for each n, how many maximal planar graphs (plane-triangulation
iso classes) are *bridge-derived* level graphs of some Even Level Graph.
Bridge-derivedness is decided exhaustively via the backward bridge-switch
orbit (see small_n_probe.is_bridge_derived): a triangulation G is
bridge-derived iff some valid parity partition L of G admits an Even Level
Graph (parity L) in G's backward bridge-orbit. Feasible only at small n.
Also cross-tabulates against the intertwining-tree property so the two
covering families in the disjunction conjecture can be compared.
Usage: python3 bridge_derived_survey.py [n_max] (default 11)
"""
import sys
import os
import time
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from triangulation_gen import enumerate_all_triangulations
from small_n_probe import is_bridge_derived
from test_disjunction import is_intertwining_tree
def survey_n(n):
t0 = time.time()
tris = enumerate_all_triangulations(n)
n_bridge = 0
n_inter = 0
n_bridge_and_inter = 0
n_bridge_only = 0
n_inter_only = 0
n_neither = 0
for G in tris:
bd = is_bridge_derived(G)
it = is_intertwining_tree(G)[0]
if bd:
n_bridge += 1
if it:
n_inter += 1
if bd and it:
n_bridge_and_inter += 1
elif bd:
n_bridge_only += 1
elif it:
n_inter_only += 1
else:
n_neither += 1
return {
'n': n,
'total': len(tris),
'bridge': n_bridge,
'inter': n_inter,
'bridge_and_inter': n_bridge_and_inter,
'bridge_only': n_bridge_only,
'inter_only': n_inter_only,
'neither': n_neither,
'elapsed': time.time() - t0,
}
def main():
n_max = int(sys.argv[1]) if len(sys.argv) > 1 else 11
rows = []
print(f'{"n":>3} {"total":>7} {"bridge-deriv":>13} {"%":>6} '
f'{"inter":>7} {"b&i":>6} {"b-only":>7} {"i-only":>7} '
f'{"neither":>8} {"sec":>7}', flush=True)
for n in range(6, n_max + 1):
r = survey_n(n)
rows.append(r)
pct = 100.0 * r['bridge'] / r['total'] if r['total'] else 0.0
print(f'{r["n"]:>3} {r["total"]:>7} {r["bridge"]:>13} {pct:>5.1f}% '
f'{r["inter"]:>7} {r["bridge_and_inter"]:>6} '
f'{r["bridge_only"]:>7} {r["inter_only"]:>7} '
f'{r["neither"]:>8} {r["elapsed"]:>6.1f}', flush=True)
if r['neither']:
print(f' *** {r["neither"]} triangulation(s) at n={n} are '
f'NEITHER bridge-derived nor intertwining trees ***',
flush=True)
return rows
if __name__ == '__main__':
main()