Skip to content

Commit 7e5d467

Browse files
committed
Found Milestone 15 (The Representative Problem / DFT-Hodge boundary): conjecture, lemma, failure reclassification; register exp_01 (rapidity connection + affine holonomy) and exp_02 (coherence per-scope); exp_03 deferred at smoke test
1 parent 21f6bb8 commit 7e5d467

8 files changed

Lines changed: 1060 additions & 0 deletions

File tree

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Milestone 15: The Representative Problem (The DFT-Hodge Boundary)
2+
3+
**Status**: active (exploratory)
4+
**Founded**: 2026-06-11
5+
**Origin**: SEC's earliest work targeted the Hodge conjecture (see `hodge_conjecture/`,
6+
archived; mapping honestly withdrawn from the SEC paper as unproven). Fourteen milestones
7+
later, the framework's empirical failure boundary has reproduced the Hodge partition from
8+
the other side. This milestone formalizes that and re-poses the continuum failures under it.
9+
(Note: the roadmap's earlier "M15 = dynamics as orbit flow" slot was fulfilled by P13–P16
10+
under Milestone 14; this milestone takes the number with a new subject.)
11+
12+
---
13+
14+
## The Conjecture
15+
16+
**DFT-Hodge Conjecture.** *Every physically measurable invariant class has an algebraic
17+
(PAC-tree / ADE) representative. Selection of a metric representative of a class is frame
18+
data contributed by an observer (M13 definitional parallax); it is not derivable from the
19+
PAC/SEC axioms, and demanding it without declaring the frame is ill-posed.*
20+
21+
Equivalently: the framework computes cohomology; observers supply gauge. The
22+
algebraic/continuum score split (M11 100%, M12 94%, M14 91% vs metric-layer 25–85%) is not
23+
a competence frontier — it is the Hodge decomposition of the theory's claims. Harmonic
24+
(class-level) content survives; representative-level content fails exactly when posed
25+
frame-free.
26+
27+
## The Lemma (already proven; restated)
28+
29+
**Lemma (M13.5 exp_14/exp_16).** Any isomorphism-invariant metric on ADE vertex sets is
30+
positive-semidefinite with kernel exactly the orbit equivalence: same-orbit vertices have
31+
identical complement spectra, hence zero distance, under every candidate tested (complement
32+
spectra, heat kernels, characteristic polynomials, spectral zeta, combinations — 0/6
33+
diagrams PD in all cases). The framework's metric layer is therefore *canonically a metric
34+
on the orbit quotient* — a class-level (cohomological) metric. This is not a defect to fix
35+
(M14 proved it fundamental); it is the structural fact the conjecture is built on.
36+
37+
## Failure reclassification
38+
39+
| Failure | Class content (passed) | Representative demand (failed) | Frame data required |
40+
|---|---|---|---|
41+
| Rapidity composition (M13 exp_08, errors 99–292%) | Per-step deformation along paths is well-defined | Chord (pairwise spectral distance) compared to arc (path sum) — pairwise distance is not a path metric | Choice of worldline: composition is a path notion; the chord is a different object |
42+
| Coherence limit non-universal (M13.5 exp_15, 0/4) | Per-family rates well-defined; D-family converges (CV 0.051) | One universal limit pooled across families and parity classes (A-family even/odd mixed → CV 0.45) | Scope declaration: which family/parity class |
43+
| PSD degeneracy (M13.5 exp_14/16, 0/4) | Orbit structure exact | A positive-definite vertex metric — impossible for isomorphism-invariant constructions (the Lemma) | Symmetry breaking: distinguishing same-orbit vertices requires non-invariant data |
44+
| Positional interference (M14 exp_06, 1/4) | Orbit-space interference exact (T1: constructive 2.0, destructive ~0) | Vertex-space fringes from an orthogonal, delocalized orbit basis (cross-terms ≡ 0) | Aut-breaking perturbation: a representative position basis is a gauge choice |
45+
46+
## Evidence file (prior, independent)
47+
48+
- M11–M14 algebraic results: 91–100% (class-level claims).
49+
- confluent_identity (March 2026, discrete Hodge on PAC fluid): conservation is
50+
**within-scope** (Δ-buffer reduces variance 16% per-parent vs 3.7% pooled); per-hop
51+
attenuation ≈ 1/φ; 2-hop ≠ product of 1-hops (each scope boundary transforms, not
52+
attenuates); the coupling "ceiling" is rank-compression, not geometry.
53+
- Midnight invariant-rule ledger: 6/6 — registered relations survive, registered
54+
coordinates die (adopted as registration discipline 2026-06-11).
55+
56+
## What would falsify the conjecture
57+
58+
1. A continuum-layer failure that does **not** decompose as (class content passes) +
59+
(representative demand fails).
60+
2. A frame-free derivation of a metric representative from the axioms (this would be
61+
*good news* for the framework and fatal for the conjecture).
62+
3. Re-posed class-level claims failing where the original representative-level claims
63+
failed — the failures were never about frames at all.
64+
65+
## Experiments
66+
67+
| # | Script | Re-poses | Status |
68+
|---|--------|----------|--------|
69+
| 01 | `exp_01_rapidity_one_form.py` | M13 exp_08 — arc vs chord; affine holonomy as first curvature invariant | registered |
70+
| 02 | `exp_02_coherence_per_scope.py` | M13.5 exp_15 — per-class limits and their ratios | registered |
71+
| 03 | `exp_03_representative_gauge.py` | M14 exp_06 — visibility under Aut-breaking gauge ε | registered (stretch) |
72+
73+
Pre-registration: `journals/2026-06-11_m15-exp01-03-preregistration.md`. All claims
74+
relational per the invariant-registration rule.
75+
76+
## Core machinery (reused, not reimplemented)
77+
78+
`milestone13/core/identity_complement.py`: `complement_spectrum`, `vertex_orbits`,
79+
`complement_deformation_rate`, `max_deformation_rate`. M14 orbit construction for exp_03.
80+
81+
## FDO Links
82+
83+
- `milestone-15-representative-problem` (to be created on first outcomes)
84+
- `pac-series`, `midnight-observational-contact`, `hodge-conjecture-symbolic-collapse`
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
"""
2+
M15 core -- class/representative machinery.
3+
4+
Builds on milestone13's identity_complement (complement spectra, orbits,
5+
deformation). Adds:
6+
- ADE + affine-A + unicyclic graph builders
7+
- the complement-eigenvector CONNECTION (Procrustes transport over shared
8+
support) and its cycle holonomy -- the genuinely non-exact object.
9+
(Scalar/vector spectral differences are potentials -> exact -> zero
10+
holonomy identically; M15 founding journal, exp_01 registration.)
11+
12+
Gauge note: each vertex's frame is the eigenvector matrix of its complement
13+
subgraph, computed once (deterministic eigh). Holonomy is defined up to
14+
conjugation by the start vertex's frame; its eigenvalue ANGLES and the
15+
Frobenius deficit ||H - I|| are conjugation-invariant up to the registered
16+
tolerance, and labeling-invariance is tested explicitly, not assumed.
17+
"""
18+
19+
import sys
20+
import numpy as np
21+
from pathlib import Path
22+
23+
_M13_CORE = Path(__file__).resolve().parent.parent.parent / "milestone13" / "core"
24+
sys.path.insert(0, str(_M13_CORE))
25+
from identity_complement import ( # noqa: E402
26+
PHI, INV_PHI, LN_PHI,
27+
complement_spectrum, vertex_orbits,
28+
complement_deformation_rate, max_deformation_rate,
29+
find_shortest_path, _convert_numpy,
30+
)
31+
32+
RESULTS_DIR = Path(__file__).resolve().parent.parent / "results"
33+
34+
35+
def save_m15_results(experiment_name, data):
36+
import json
37+
from datetime import datetime
38+
RESULTS_DIR.mkdir(exist_ok=True)
39+
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
40+
out = RESULTS_DIR / f"{experiment_name}_{ts}.json"
41+
with open(out, 'w') as f:
42+
json.dump(data, f, indent=2, default=str)
43+
print(f"\n Results saved: {out}")
44+
return out
45+
46+
47+
# ============================================================
48+
# Graph builders
49+
# ============================================================
50+
51+
def build_path(n):
52+
"""A_n Dynkin diagram: path on n vertices."""
53+
a = np.zeros((n, n))
54+
for i in range(n - 1):
55+
a[i, i + 1] = a[i + 1, i] = 1.0
56+
return a
57+
58+
59+
def build_d(n):
60+
"""D_n: path on n-1 vertices with an extra leaf on vertex 1."""
61+
a = np.zeros((n, n))
62+
for i in range(n - 2):
63+
a[i, i + 1] = a[i + 1, i] = 1.0
64+
a[1, n - 1] = a[n - 1, 1] = 1.0
65+
return a
66+
67+
68+
def build_cycle(m):
69+
"""Affine A_{m-1} extended Dynkin diagram: cycle on m vertices."""
70+
a = np.zeros((m, m))
71+
for i in range(m):
72+
a[i, (i + 1) % m] = a[(i + 1) % m, i] = 1.0
73+
return a
74+
75+
76+
def build_tadpole(cycle_len, tail_len):
77+
"""Cycle with a path tail attached (unicyclic, non-transitive)."""
78+
m = cycle_len + tail_len
79+
a = np.zeros((m, m))
80+
for i in range(cycle_len):
81+
a[i, (i + 1) % cycle_len] = a[(i + 1) % cycle_len, i] = 1.0
82+
prev = 0
83+
for t in range(tail_len):
84+
j = cycle_len + t
85+
a[prev, j] = a[j, prev] = 1.0
86+
prev = j
87+
return a
88+
89+
90+
def random_unicyclic(n, rng):
91+
"""Random connected unicyclic graph on n vertices (tree + one extra edge)."""
92+
a = np.zeros((n, n))
93+
nodes = list(rng.permutation(n))
94+
for i in range(1, n): # random tree (random attachment)
95+
j = nodes[rng.randint(0, i)]
96+
a[nodes[i], j] = a[j, nodes[i]] = 1.0
97+
while True: # add one non-edge -> single cycle
98+
u, v = rng.randint(0, n), rng.randint(0, n)
99+
if u != v and a[u, v] == 0:
100+
a[u, v] = a[v, u] = 1.0
101+
return a
102+
103+
104+
def cycle_basis_single(adjacency):
105+
"""For a unicyclic graph, return the unique cycle as a vertex list."""
106+
n = adjacency.shape[0]
107+
deg = adjacency.sum(axis=1).astype(int)
108+
a = adjacency.copy()
109+
# iteratively strip leaves
110+
changed = True
111+
alive = set(range(n))
112+
while changed:
113+
changed = False
114+
for v in list(alive):
115+
if a[v].sum() == 1:
116+
u = int(np.argmax(a[v]))
117+
a[v, u] = a[u, v] = 0
118+
alive.discard(v)
119+
changed = True
120+
cyc_nodes = sorted(alive)
121+
# order the cycle by walking
122+
start = cyc_nodes[0]
123+
cycle = [start]
124+
prev, cur = None, start
125+
while True:
126+
nbrs = [j for j in np.nonzero(a[cur])[0] if j != prev]
127+
nxt = int(nbrs[0])
128+
if nxt == start:
129+
break
130+
cycle.append(nxt)
131+
prev, cur = cur, nxt
132+
return cycle
133+
134+
135+
# ============================================================
136+
# The complement-eigenvector connection
137+
# ============================================================
138+
139+
def complement_frame(adjacency, vertex):
140+
"""Eigen-decomposition of the complement subgraph G \\ vertex.
141+
142+
Returns (eigvals ascending, eigvecs columns, kept_vertices list)."""
143+
n = adjacency.shape[0]
144+
keep = [i for i in range(n) if i != vertex]
145+
sub = adjacency[np.ix_(keep, keep)]
146+
vals, vecs = np.linalg.eigh(sub)
147+
return vals, vecs, keep
148+
149+
150+
def edge_transport(adjacency, u, v, k, frames=None):
151+
"""Orthogonal transport (Procrustes) from u's complement frame to v's,
152+
over the shared support V \\ {u, v}, using the top-k eigenvectors
153+
(largest eigenvalues). Returns (T [k x k orthogonal], min_eigengap)."""
154+
if frames is None:
155+
frames = {}
156+
for w in (u, v):
157+
if w not in frames:
158+
frames[w] = complement_frame(adjacency, w)
159+
vals_u, vecs_u, keep_u = frames[u]
160+
vals_v, vecs_v, keep_v = frames[v]
161+
common = [w for w in keep_u if w != v] # = V \ {u, v}
162+
rows_u = [keep_u.index(w) for w in common]
163+
rows_v = [keep_v.index(w) for w in common]
164+
Vu = vecs_u[rows_u, :][:, -k:] # top-k by eigenvalue
165+
Vv = vecs_v[rows_v, :][:, -k:]
166+
gap_u = float(vals_u[-k] - vals_u[-k - 1]) if len(vals_u) > k else np.inf
167+
gap_v = float(vals_v[-k] - vals_v[-k - 1]) if len(vals_v) > k else np.inf
168+
M = Vv.T @ Vu
169+
U, _, Wt = np.linalg.svd(M)
170+
T = U @ Wt # orthogonal k x k
171+
return T, min(gap_u, gap_v)
172+
173+
174+
def cycle_holonomy(adjacency, cycle, k):
175+
"""Holonomy of the connection around an ordered vertex cycle.
176+
177+
Returns dict: deficit ||H - I||_F, sorted |rotation angles| (conjugation
178+
invariants), min eigengap encountered (degeneracy guard)."""
179+
frames = {}
180+
H = np.eye(k)
181+
min_gap = np.inf
182+
m = len(cycle)
183+
for i in range(m):
184+
u, v = cycle[i], cycle[(i + 1) % m]
185+
T, gap = edge_transport(adjacency, u, v, k, frames)
186+
min_gap = min(min_gap, gap)
187+
H = T @ H
188+
eig = np.linalg.eigvals(H)
189+
angles = np.sort(np.abs(np.angle(eig)))
190+
deficit = float(np.linalg.norm(H - np.eye(k)))
191+
return {'deficit': deficit,
192+
'angles': [float(a) for a in angles],
193+
'det': float(np.linalg.det(H)),
194+
'min_eigengap': float(min_gap)}
195+
196+
197+
def relabeled(adjacency, perm):
198+
"""Apply vertex permutation: perm[i] = new label of old vertex i."""
199+
n = adjacency.shape[0]
200+
P = np.zeros((n, n))
201+
for i in range(n):
202+
P[perm[i], i] = 1.0
203+
return P @ adjacency @ P.T
204+
205+
206+
# ============================================================
207+
# Scalar potential (the exact part -- for exp_01 T1)
208+
# ============================================================
209+
210+
def spectral_potential(adjacency, vertex):
211+
"""g(v) = sum of complement spectrum -- a vertex potential. Signed edge
212+
differences of g are exact by construction (telescoping)."""
213+
return float(np.sum(complement_spectrum(adjacency, vertex)))

0 commit comments

Comments
 (0)