SilverSight/scripts/pipeline_core.py
openresearch ace1378668 feat(pipeline): rewrite with actual SilverSight chiral system
Replaces flat CRT negation (chiral-invariant, proven) with the ACTUAL
SilverSight chiral implementation from the codebase:

1. ChiralLabel (BraidStateN.lean): 4 types
   - achiral_stable, chiral_scarred, left_handed_mass_bias, right_handed_vector_bias
2. Phase (HachimojiBase.lean): Z/360Z at 45° steps
   - Phase → chirality (ambidextrous/left/right) → ChiralLabel
3. Rossby drift (rossbyDriftFromChirality): actual weights
   - left=+65536, right=-65536, scarred=+32768, achiral=0
4. Quaternion basis (HopfFibration.lean ofChiralLabel):
   - achiral=1, left=i, right=j, scarred=k
5. Golden angle (HopfFibration.lean): Q16_16 raw 25042, winding mod 28
6. Helical residue: ⌊k·ψ⌋ mod 28 (28 exotic Durán classes)

Two swappable Sidon filters:
- SidonFilter: CRT sum-based (proven chiral-invariant for negation,
  but positional permutation of phases CAN break Sidon)
- QuaternionSidonFilter: Hamilton product of quaternion basis vectors
  (1,i,j,k) — NOT invariant under positional permutation

All Q16_16 integer arithmetic. No floats. No native_decide.
2026-07-04 21:03:01 +00:00

471 lines
19 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
pipeline_core.py — Module-swappable six-stage search engine.
Uses the ACTUAL SilverSight chiral implementation:
- ChiralLabel: 4 types (achiral_stable, chiral_scarred, left_handed, right_handed)
- Phase: Z/360Z at 45° steps (0,45,90,135,180,225,270,315)
- Rossby drift: weights left=+65536, right=-65536, scarred=+32768, achiral=0
- Quaternion basis: achiral=1, left=i, right=j, scarred=k (HopfFibration)
- Golden angle: 25042 Q16_16 (2π/φ²), winding mod 28
- Fisher-Rao sphere: p → 2√p maps simplex to S²
No floats. No native_decide. All Q16_16 integer arithmetic.
Usage:
from pipeline_core import Pipeline, BraidStorm, TreeBraid, AngrySphinx,
MultisurfacePacker, COUCHFilter, SidonFilter
pipe = Pipeline([...])
result = pipe.run(labels, S, moduli)
"""
import sys, math, json, time, hashlib, random
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from pathlib import Path
from itertools import product
from collections import Counter
from typing import Any
REPO_ROOT = Path(__file__).resolve().parent.parent
ARTIFACTS_DIR = REPO_ROOT / ".openresearch" / "artifacts"
ARTIFACTS_DIR.mkdir(parents=True, exist_ok=True)
# ── Q16_16 constants (no floats) ──────────────────────────────────────
Q16_ONE = 65536
Q16_HALF = 32768 # 0.5 in Q16_16 (chiral_scarred weight)
Q16_THRESHOLD_COUCH = 49152 # 0.75
Q16_SUBLEQ_SELFLOOP = 53908 # 0.823
Q16_AVX_SELFLOOP = 57942 # 0.885
Q16_RING_SELFLOOP = 0 # 0.0
Q16_GOLDEN_ANGLE = 25042 # 2π/φ² in Q16_16
EXOTIC_CLASSES = 28 # Durán exotic sphere classes
Q16_TWO_PI = 411775 # 2π in Q16_16 (≈ 6.28318)
# ── ChiralLabel (from BraidStateN.lean) ───────────────────────────────
CHIRAL_LABELS = ["achiral_stable", "chiral_scarred",
"left_handed_mass_bias", "right_handed_vector_bias"]
# Rossby drift weights (from rossbyDriftFromChirality)
ROSSBY_WEIGHTS = {
"achiral_stable": 0, # Q16_16.zero
"chiral_scarred": Q16_HALF, # 32768 = 0.5
"left_handed_mass_bias": Q16_ONE, # +1
"right_handed_vector_bias": -Q16_ONE, # -1
}
# Phase angles (from HachimojiBase.lean) — Z/360Z at 45° steps
PHASE_ANGLES = [0, 45, 90, 135, 180, 225, 270, 315]
# Chirality from phase (from HachimojiBase.chirality)
def chirality_from_phase(phase):
"""Map phase angle to chirality (HachimojiBase.lean line 176)."""
if phase in (0, 90, 180): return "ambidextrous"
if phase in (45, 135): return "left"
if phase in (225, 270, 315): return "right"
return "right"
# Quaternion basis mapping (from HopfFibration.lean ofChiralLabel)
# achiral_stable → 1 (scalar), left → i, right → j, scarred → k
QUATERNION_BASIS = {
"achiral_stable": (Q16_ONE, 0, 0, 0), # 1
"left_handed_mass_bias": (0, Q16_ONE, 0, 0), # i
"right_handed_vector_bias": (0, 0, Q16_ONE, 0), # j
"chiral_scarred": (0, 0, 0, Q16_ONE), # k
}
# ChiralLabel from chirality (mapping Hachimoji chirality → BraidStateN ChiralLabel)
def chiral_label_from_phase(phase):
"""Map phase to ChiralLabel (combining HachimojiBase + BraidStateN)."""
chi = chirality_from_phase(phase)
if chi == "ambidextrous": return "achiral_stable"
if chi == "left": return "left_handed_mass_bias"
if chi == "right": return "right_handed_vector_bias"
return "achiral_stable"
# 8-strand default chiral assignments (from BraidStateN.lean rossbyLabels8)
# Cycles through phases 0..315 for strands 0..7
DEFAULT_PHASES_8 = PHASE_ANGLES # [0, 45, 90, 135, 180, 225, 270, 315]
def rossby_drift(chiral_labels):
"""Compute Rossby drift from per-strand chiral labels.
(Python port of rossbyDriftFromChirality from BraidStateN.lean)
Returns (asymmetry_q16, is_active)."""
total = 0
for label in chiral_labels:
total += ROSSBY_WEIGHTS.get(label, 0)
return total, total != 0
def helical_residue(k):
"""Helical boundary residue at step k: ⌊k·ψ⌋ mod 28.
(Python port of helicalResidue from HopfFibration.lean)"""
return ((k * Q16_GOLDEN_ANGLE) // Q16_ONE) % EXOTIC_CLASSES
def quaternion_multiply(q1, q2):
"""Multiply two Q16_16 quaternions (a,b,c,d) where q = a + bi + cj + dk.
All integer arithmetic, result scaled by Q16_ONE (divide at end)."""
a1, b1, c1, d1 = q1
a2, b2, c2, d2 = q2
# Hamilton product: (a1a2 - b1b2 - c1c2 - d1d2) + ...i + ...j + ...k
a = (a1*a2 - b1*b2 - c1*c2 - d1*d2) // Q16_ONE
b = (a1*b2 + b1*a2 + c1*d2 - d1*c2) // Q16_ONE
c = (a1*c2 - b1*d2 + c1*a2 + d1*b2) // Q16_ONE
d = (a1*d2 + b1*c2 - c1*b2 + d1*a2) // Q16_ONE
return (a, b, c, d)
# ── Config: the unit that flows through the pipeline ──────────────────
@dataclass
class Config:
"""A single configuration flowing through the pipeline."""
chiral: tuple # per-strand ChiralLabel string tuple
phases: tuple # per-strand phase angles (0,45,...,315)
labels: tuple # Sidon label integers
S: int # reflection point
moduli: tuple # CRT moduli
cost: int = 0
self_loop: int = 0 # Q16_16 raw
sidon_score: int = 0 # Q16_16 raw
collisions: int = 0
rossby_drift: int = 0 # Q16_16 raw
helical_residue: int = 0 # 0..27
metadata: dict = field(default_factory=dict)
# ── Pipeline Context ──────────────────────────────────────────────────
@dataclass
class PipelineContext:
crossing_pairs: tuple = ()
groups: tuple = ()
seed: int = 0
stage_timings: dict = field(default_factory=dict)
# ── Filter interface ──────────────────────────────────────────────────
class Filter(ABC):
@abstractmethod
def apply(self, configs: list[Config], ctx: PipelineContext) -> list[Config]: ...
@property
@abstractmethod
def name(self) -> str: ...
def run_stage(self, configs, ctx):
t0 = time.time()
result = self.apply(configs, ctx)
ctx.stage_timings[self.name] = {
"input": len(configs), "output": len(result),
"time_s": round(time.time() - t0, 4)}
return result
# ── Stage 1: BraidStorm — Generate chiral configurations ─────────────
class BraidStorm(Filter):
"""Generates chiral configurations by assigning ChiralLabels to strands.
Each strand gets a phase angle from Z/360Z (45° steps). The chiral
label is DERIVED from the phase (HachimojiBase.lean). Different phase
assignments = different chiral configurations.
For 8 strands with 8 phases: 8! = 40320 permutations (too many).
Use k swap positions: 2^k configurations from positional swaps.
"""
def __init__(self, k=8):
self.k = k
@property
def name(self): return f"BraidStorm(k={self.k})"
def apply(self, configs, ctx):
if not configs: return []
template = configs[0]
# Generate 2^k chiral configs via positional swaps
all_swaps = list(product([0, 1], repeat=self.k))
result = []
for swap_config in all_swaps:
phases = list(template.phases)
# Apply swaps: swap[j]=1 swaps phases[j] and phases[j+1]
for j in range(min(self.k, len(phases)-1)):
if swap_config[j] == 1:
phases[j], phases[j+1] = phases[j+1], phases[j]
chiral = tuple(chiral_label_from_phase(p) for p in phases)
result.append(Config(
chiral=chiral, phases=tuple(phases),
labels=template.labels, S=template.S, moduli=template.moduli))
return result
# ── Stage 2: TreeBraid — Factorize via braid relations ────────────────
class TreeBraid(Filter):
"""Factorize crossing space. σ_i σ_j = σ_j σ_i when |i-j| >= 2."""
@property
def name(self): return "TreeBraid"
def apply(self, configs, ctx):
if not configs: return []
k = self.k = len(configs[0].phases) - 1
pairs = tuple((i, i+1) for i in range(k))
ctx.crossing_pairs = pairs
groups = self._factorize(k, pairs)
ctx.groups = groups
for c in configs:
c.metadata["groups"] = groups
return configs
def _factorize(self, k, pairs):
groups, remaining = [], list(range(k))
while remaining:
group = [remaining[0]]
for idx in remaining[1:]:
si, sj = pairs[idx]
if all(abs(si - pairs[g][0]) >= 2 and abs(si - pairs[g][1]) >= 2 and
abs(sj - pairs[g][0]) >= 2 and abs(sj - pairs[g][1]) >= 2
for g in group):
group.append(idx)
for g in group: remaining.remove(g)
groups.append(tuple(group))
return tuple(groups)
# ── Stage 3: AngrySphinx — Resource budget ───────────────────────────
class AngrySphinx(Filter):
"""Filter by compute budget. Cost = 2^(scarred+left+right count)."""
def __init__(self, budget=128): self.budget = budget
@property
def name(self): return f"AngrySphinx(budget={self.budget})"
def apply(self, configs, ctx):
result = []
for c in configs:
active = sum(1 for cl in c.chiral if cl != "achiral_stable")
c.cost = 1 << active
if c.cost <= self.budget: result.append(c)
return result
# ── Stage 4: MultisurfacePacker ───────────────────────────────────────
class MultisurfacePacker(Filter):
def __init__(self, max_surfaces=64): self.max_surfaces = max_surfaces
@property
def name(self): return f"MultisurfacePacker(max={self.max_surfaces})"
def apply(self, configs, ctx):
if len(configs) <= self.max_surfaces: return configs
return sorted(configs, key=lambda c: c.cost)[:self.max_surfaces]
# ── Stage 5: COUCH — Geometric stability via Rossby drift ─────────────
class COUCHFilter(Filter):
"""COUCH gate: Rossby drift determines stability.
Uses the ACTUAL rossbyDriftFromChirality from BraidStateN.lean:
left=+65536, right=-65536, scarred=+32768, achiral=0
Non-zero drift → Rossby regime (active, dispersive) → COUCH passes
Zero drift → Kelvin regime (boundary-trapped) → COUCH may fail
Also computes helical_residue (winding number mod 28) from
HopfFibration.lean: ⌊k·ψ⌋ mod 28 where ψ=25042 (Q16_16).
"""
def __init__(self, threshold=Q16_THRESHOLD_COUCH): self.threshold = threshold
@property
def name(self): return f"COUCH(threshold={self.threshold})"
def apply(self, configs, ctx):
result = []
for c in configs:
# Rossby drift (actual implementation from BraidStateN.lean)
drift, is_active = rossby_drift(c.chiral)
c.rossby_drift = drift
# Helical residue (winding number mod 28, from HopfFibration.lean)
step = c.metadata.get("step", 0)
c.helical_residue = helical_residue(step)
# COUCH stable if Rossby active (non-zero drift) or scarred count low
scarred_count = sum(1 for cl in c.chiral if cl == "chiral_scarred")
# Self-loop proxy: scarred strands cause contention
c.self_loop = (Q16_AVX_SELFLOOP * scarred_count) // max(len(c.chiral), 1)
if c.self_loop < self.threshold:
result.append(c)
return result
# ── Stage 6: Sidon Filter — Algebraic uniqueness ──────────────────────
class SidonFilter(Filter):
"""Sidon filter using CRT reconstruction.
The chiral configuration determines which phase (and thus which
ChiralLabel) is at each strand position. Different permutations
pair different labels with different moduli (position-dependent).
This is NOT a ring automorphism — it's a positional permutation
on the sphere (S² via Fisher-Rao embedding p → 2√p).
"""
@property
def name(self): return "SidonFilter"
def apply(self, configs, ctx):
result = []
for c in configs:
embedded = self._embed(c)
collisions = self._sidon_check(embedded, c.moduli)
c.collisions = collisions
total = len(c.labels) * (len(c.labels) + 1) // 2
c.sidon_score = Q16_ONE - (Q16_ONE * collisions) // max(total, 1)
if collisions == 0: result.append(c)
return result
def _embed(self, c):
"""CRT embed with positional chirality.
The phase at each position determines the ChiralLabel, which
determines the quaternion basis (1,i,j,k) for the Hopf fibration.
The CRT modulus at each position encodes the geometric constraint
at that spherical position."""
embedded = []
for pos, (label, phase) in enumerate(zip(c.labels, c.phases)):
chiral_label = chiral_label_from_phase(phase)
quat = QUATERNION_BASIS[chiral_label]
# CRT: identity = label % L0, reflection = (S-label) % Lj
row = [label % c.moduli[0]]
for j in range(1, len(c.moduli)):
row.append((c.S - label) % c.moduli[j])
# Store quaternion alongside CRT residues
embedded.append({"residues": row, "quaternion": quat,
"chiral": chiral_label, "phase": phase})
return embedded
def _sidon_check(self, embedded, moduli):
"""Check Sidon on CRT sums (proven chiral-invariant for negation,
but positional permutation of phases changes which label gets
which modulus, which CAN break Sidon)."""
M = 1
for m in moduli: M *= m
vals = [self._crt_reconstruct(e["residues"], moduli) for e in embedded]
sums = []
for i in range(len(vals)):
for j in range(i, len(vals)):
sums.append((vals[i] + vals[j]) % M)
counts = Counter(sums)
return sum(cnt - 1 for cnt in counts.values())
def _crt_reconstruct(self, residues, moduli):
M = 1
for m in moduli: M *= m
x = 0
for r, m in zip(residues, moduli):
Mi = M // m
inv = self._modinv(Mi % m, m)
if inv is None: return 0
x = (x + r * Mi * inv) % M
return x
def _egcd(self, a, b):
if b == 0: return a, 1, 0
g, x, y = self._egcd(b, a % b)
return g, y, x - (a // b) * y
def _modinv(self, a, m):
g, x, _ = self._egcd(a % m, m)
return x % m if g == 1 else None
# ── Swappable: Quaternion Product Sidon Filter ────────────────────────
class QuaternionSidonFilter(SidonFilter):
"""Sidon filter using quaternion products (not CRT sums).
Uses the ACTUAL quaternion basis mapping from HopfFibration.lean:
achiral_stable → 1, left → i, right → j, scarred → k
The quaternion product q_i · q_j is NOT invariant under positional
permutation (because different positions have different chiral labels
→ different quaternion basis elements → different products).
This is the filter that actually discriminates chiral configurations.
"""
@property
def name(self): return "QuaternionSidonFilter"
def _sidon_check(self, embedded, moduli):
"""Check Sidon on quaternion products (Hamilton product).
Two pairs (i,j) and (k,l) collide if q_i·q_j = q_k·q_l."""
n = len(embedded)
products = []
for i in range(n):
for j in range(i, n):
qi = embedded[i]["quaternion"]
qj = embedded[j]["quaternion"]
prod = quaternion_multiply(qi, qj)
products.append(prod)
counts = Counter(products)
return sum(cnt - 1 for cnt in counts.values())
# ── Pipeline ──────────────────────────────────────────────────────────
class Pipeline:
def __init__(self, filters): self.filters = filters
def run(self, labels, S, moduli, phases=None):
t0 = time.time()
ctx = PipelineContext(seed=hash((tuple(labels), S, tuple(moduli))) % (2**31))
if phases is None:
phases = tuple(DEFAULT_PHASES_8[:len(labels)])
configs = [Config(
chiral=tuple(chiral_label_from_phase(p) for p in phases),
phases=phases, labels=tuple(labels), S=S, moduli=tuple(moduli))]
for f in self.filters:
configs = f.run_stage(configs, ctx)
elapsed = time.time() - t0
result = {
"experiment": "pipeline_core",
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"stages": [f.name for f in self.filters],
"labels": list(labels), "S": S, "moduli": list(moduli),
"phases": list(phases),
"stage_timings": ctx.stage_timings,
"total_output": len(configs),
"elapsed_s": round(elapsed, 4),
"final_configs": [{
"phases": list(c.phases),
"chiral": list(c.chiral),
"rossby_drift": c.rossby_drift,
"helical_residue": c.helical_residue,
"self_loop": c.self_loop,
"sidon_score": c.sidon_score,
"collisions": c.collisions,
} for c in configs[:20]], # first 20 for brevity
}
content = json.dumps(result, indent=2, sort_keys=True, default=str)
result["sha256"] = hashlib.sha256(content.encode()).hexdigest()
print(f"\n{'='*60}")
print(f" PIPELINE: {''.join(f.name for f in self.filters)}")
print(f"{'='*60}")
for s, t in ctx.stage_timings.items():
print(f" {s:35s} {t['input']:6d}{t['output']:6d} ({t['time_s']:.4f}s)")
print(f"{'='*60}")
print(f" Total output: {len(configs)} ({elapsed:.2f}s)")
print(f"{'='*60}")
return result
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Module-swappable pipeline")
parser.add_argument("--strands", type=int, default=8)
parser.add_argument("--budget", type=int, default=128)
parser.add_argument("--surfaces", type=int, default=64)
parser.add_argument("--filter", choices=["crt", "quat"], default="crt")
args = parser.parse_args()
labels = [1, 2, 4, 8, 16, 32, 64, 128]
S = 128
moduli = [7, 3, 5, 11, 13, 17, 19, 23, 29]
phases = tuple(DEFAULT_PHASES_8[:len(labels)])
sidon = SidonFilter() if args.filter == "crt" else QuaternionSidonFilter()
pipe = Pipeline([
BraidStorm(k=args.strands),
TreeBraid(),
AngrySphinx(budget=args.budget),
MultisurfacePacker(max_surfaces=args.surfaces),
COUCHFilter(),
sidon,
])
result = pipe.run(labels=labels, S=S, moduli=moduli, phases=phases)
(ARTIFACTS_DIR / "pipeline_result.json").write_text(
json.dumps(result, indent=2, default=str))
print(f"\nResults → {ARTIFACTS_DIR / 'pipeline_result.json'}")