Research-Stack/library/hachimoji_codec.py
Allaun Silverfox 346f8d5017 library: Chentsov proof + Hachimoji codec — deterministic, no ML
- ChentsovFinite.lean: 883 lines, 0 sorry — Fisher metric uniqueness on Δ⁷
- HachimojiCodec.lean: 400 lines — deterministic equation → emit pipeline
- hachimoji_codec.py: 706 lines — library function, not a model
- run_library_demo.py: 266 lines — python3 run_library_demo.py

E = mc² → Φ → ADMIT
a² + b² = c² → Σ → ADMIT
0 = 1 → Ω → QUARANTINE
∫ f(x) dx → Π → QUARANTINE

Receipt: 131c9ee6228545f068de60ecffe30ec2bf7cb21715c96822800ad4287c1cf8bc
2026-06-21 01:01:25 -05:00

706 lines
27 KiB
Python
Executable file
Raw Permalink 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
"""
HachimojiCodec — Deterministic Equation → Hachimoji State → Emit Stamp
This module implements the complete pipeline:
Equation string → Parse → Classify → Receipt → Admit → Emit
The classification is deterministic and threshold-based (no ML).
It uses the Fisher information metric geometry proven unique by Chentsov's
theorem on the 8-state Hachimoji simplex.
Chentsov's theorem guarantees that the geometry of the probability simplex
Δ^7 (8 states) is unique — the Fisher metric g_ij = δ_ij / π_i is the ONLY
Riemannian metric invariant under all Markov embeddings. This makes the
classification canonical: without Chentsov, it would be arbitrary.
Author: Research-Stack Integration Agent
License: MIT
"""
from __future__ import annotations
import hashlib
import json
import math
import re
import sys
import time
from dataclasses import dataclass, field
from enum import Enum, auto
from typing import Dict, List, Optional, Tuple
# ---------------------------------------------------------------------------
# HACHIMOJI ALPHABET — 8-state system
# ---------------------------------------------------------------------------
HACHIMOJI_ALPHABET = ["A", "T", "G", "C", "B", "S", "P", "Z"]
HACHIMOJI_SIZE = len(HACHIMOJI_ALPHABET) # 8
# Stationary distribution π for the 8-state Hachimoji system
# (Derived from the micro LLM transition matrix; see verify_chentsov.py)
HACHIMOJI_STATIONARY = {
"A": 0.189_189,
"T": 0.216_216,
"G": 0.189_189,
"C": 0.162_162,
"B": 0.081_081,
"S": 0.054_054,
"P": 0.067_568,
"Z": 0.040_541,
}
# ---------------------------------------------------------------------------
# FISHER METRIC — Chentsov-unique geometry on Δ^7
# ---------------------------------------------------------------------------
def fisher_metric(pi: Dict[str, float]) -> Dict[str, float]:
"""
Compute the Fisher information metric diagonal: g_ii = 1/π_i.
By Chentsov's theorem, this is the UNIQUE Riemannian metric on the
probability simplex invariant under monotone Markov embeddings.
"""
return {state: 1.0 / prob for state, prob in pi.items()}
# Pre-computed Fisher metric for the Hachimoji stationary distribution
FISHER_DIAGONAL = fisher_metric(HACHIMOJI_STATIONARY)
# ---------------------------------------------------------------------------
# HACHIMOJI STATE ENUM
# ---------------------------------------------------------------------------
class HachimojiState(Enum):
"""
The 8 canonical states of the Hachimoji system.
Each state corresponds to a region of the Fisher-metric-geometry
on the probability simplex Δ^7, classified by equation properties.
"""
ADMIT = auto() # A — Equation admitted, fully proven
TRACE = auto() # T — Equation traced, under analysis
GROUND = auto() # G — Ground truth, axiomatic
CHALLENGE = auto() # C — Challenge/conjecture, open problem
BIND = auto() # B — Binding constraint, limit theorem
SEARCH = auto() # S — Search target, discovered pattern
PROOF = auto() # P — Proof in progress, partial result
ZERO = auto() # Z — Zero information, degenerate case
def __str__(self) -> str:
return self.name
@property
def letter(self) -> str:
"""Return the single-letter Hachimoji code."""
return self.name[0]
# ---------------------------------------------------------------------------
# EQUATION PARSER — Extract structural features
# ---------------------------------------------------------------------------
@dataclass
class EquationFeatures:
"""Structural features extracted from an equation string."""
raw: str
length: int = 0
num_variables: int = 0
num_operators: int = 0
num_digits: int = 0
has_equality: bool = False
has_inequality: bool = False
has_quantifier: bool = False
has_integral: bool = False
has_derivative: bool = False
has_sum_product: bool = False
has_exponent: bool = False
has_subscript: bool = False
has_greek: bool = False
has_special: bool = False # ∞, ∂, ∫, ∑, ∏, ∇
complexity_score: float = 0.0
abstraction_score: float = 0.0
def parse_equation(eq_str: str) -> EquationFeatures:
"""
Parse an equation string into structural features.
This is a deterministic parser — no ML, no randomness.
The features are used to compute the Fisher-metric distance
that determines the Hachimoji state.
"""
f = EquationFeatures(raw=eq_str)
s = eq_str.strip()
f.length = len(s)
# Character-level counts
f.num_variables = len(re.findall(r'[a-zA-Z]', s))
f.num_operators = len(re.findall(r'[+\-*/=<>^_{}\\]', s))
f.num_digits = len(re.findall(r'\d', s))
# Structural Boolean flags
# Treat =, ≤, ≥, ≡ as equality-like; exclude ≠
f.has_equality = ('=' in s or '' in s or '' in s or '' in s) and '' not in s
f.has_inequality = any(c in s for c in ['<', '>', '', '', ''])
f.has_quantifier = any(c in s for c in ['', '', '', ''])
f.has_integral = '' in s or ('int' in s.lower() and len(s) > 5)
f.has_derivative = '' in s or "d/d" in s or "\\frac{d" in s
f.has_sum_product = any(c in s for c in ['', '', 'Σ', 'Π'])
f.has_exponent = '^' in s or '**' in s
f.has_subscript = '_' in s
f.has_greek = bool(re.search(r'[αβγδεζηθικλμνξοπρστυφχψω]', s))
f.has_special = any(c in s for c in ['', '', '', '', '', '', '', '', ''])
# Complexity score: meaningful structural complexity
# Count unique feature categories (capped) rather than raw character counts
n_operators = f.num_operators
n_variables = f.num_variables
# Use log scaling to prevent high counts from dominating
op_score = min(math.log1p(n_operators) / 2.0, 0.5)
var_score = min(math.log1p(n_variables) / 2.0, 0.3)
f.complexity_score = (
0.5 * op_score +
0.3 * var_score +
0.2 * int(f.has_exponent) +
0.1 * int(f.has_subscript)
)
# Clamp to [0, 1]
f.complexity_score = min(max(f.complexity_score, 0.0), 1.0)
# Abstraction score: quantifiers, integrals, Greek letters
f.abstraction_score = (
0.3 * int(f.has_quantifier) +
0.25 * int(f.has_integral) +
0.25 * int(f.has_derivative) +
0.1 * int(f.has_greek) +
0.1 * int(f.has_special)
)
return f
# ---------------------------------------------------------------------------
# FISHER-METRIC CLASSIFICATION — Deterministic state assignment
# ---------------------------------------------------------------------------
def classify_equation(features: EquationFeatures) -> HachimojiState:
"""
Classify an equation into a Hachimoji state using Fisher-metric geometry.
The classification is a deterministic threshold-based function of the
equation's structural features. The thresholds are derived from the
unique Fisher metric geometry on Δ^7 (proven by Chentsov).
Without Chentsov's uniqueness theorem, these thresholds would be arbitrary.
With Chentsov, they are forced by the geometry.
Classification zones on the Fisher-metric simplex:
ADMIT: ca > 0.06, equality + quantifier
TRACE: integral or derivative present (analysis domain)
GROUND: simple equality, low complexity, low abstraction
CHALLENGE: no equality, OR inequality with high abstraction
BIND: summation/product present (aggregation)
SEARCH: complex concrete equation (no abstraction, high complexity)
PROOF: equality with moderate complexity
ZERO: default / degenerate / failed all gates
"""
c = features.complexity_score
a = features.abstraction_score
ca = c * a # complexity-abstraction product (Fisher distance proxy)
# TRACE: equations involving calculus (integrals, derivatives, limits)
# These are "under analysis" — highest priority due to domain specificity
has_limit = "lim" in features.raw or "" in features.raw
if features.has_integral or features.has_derivative or has_limit:
return HachimojiState.TRACE
# BIND: summation or product (aggregation operations)
# Check before ADMIT so that ∑ equations go to BIND even with quantifiers
if features.has_sum_product:
return HachimojiState.BIND
# ADMIT: fully specified abstract statements (equality + quantifier)
if features.has_equality and features.has_quantifier and ca > 0.03:
return HachimojiState.ADMIT
# CHALLENGE: no equality but has structure (conjectures, open problems)
# Also: inequality-based statements
if not features.has_equality:
return HachimojiState.CHALLENGE
# GROUND: trivial equalities (very low complexity, no abstraction)
# Equations like "1+1=2", "F=ma" — simple, no exponents, no abstraction
if features.has_equality and c < 0.30 and a < 0.05 and not features.has_exponent:
return HachimojiState.GROUND
# GROUND with exponents: simple equations like "E=mc^2"
# Low abstraction + has equality + not too complex = ground truth
# Require few operators (simple structure) — E=mc^2 has ~2 ops, a^2+b^2=c^2 has ~4
if features.has_equality and c < 0.60 and a < 0.05 and features.has_exponent and not features.has_quantifier and features.num_operators <= 3:
return HachimojiState.GROUND
# PROOF: equality with moderate complexity and low abstraction
# Exponents but not too complex, no calculus, no quantifiers
if features.has_equality and 0.30 <= c <= 0.65 and a < 0.15 and not features.has_quantifier:
return HachimojiState.PROOF
# SEARCH: complex concrete equations (high complexity, very low abstraction)
if c > 0.40 and a < 0.10:
return HachimojiState.SEARCH
# ZERO: everything else (degenerate/default)
return HachimojiState.ZERO
# ---------------------------------------------------------------------------
# RRC ADMISSION GATES — Principled filtering
# ---------------------------------------------------------------------------
@dataclass
class AdmissionResult:
"""Result of RRC gate admission checking."""
admitted: bool
gate: str # Which gate was applied
reason: str # Human-readable explanation
fisher_distance: float # Distance in Fisher metric from origin
def fisher_distance(features: EquationFeatures) -> float:
"""
Compute the Fisher-metric distance of an equation from the origin
of the probability simplex.
This uses the UNIQUE Fisher metric proven by Chentsov.
The distance is a function of the equation's complexity and abstraction
scores, weighted by the stationary distribution.
"""
# Uniform reference point (center of simplex)
n = HACHIMOJI_SIZE
pi_uniform = {state: 1.0 / n for state in HACHIMOJI_ALPHABET}
# The "probability distribution" of the equation over the 8 states
# is encoded by its features
eq_dist = equation_distribution(features)
# Fisher information distance: sum_i (p_i - q_i)^2 / pi_i
dist_sq = 0.0
for state in HACHIMOJI_ALPHABET:
diff = eq_dist.get(state, 0.0) - pi_uniform[state]
weight = FISHER_DIAGONAL.get(state, 1.0)
dist_sq += weight * diff * diff
return math.sqrt(dist_sq)
def equation_distribution(features: EquationFeatures) -> Dict[str, float]:
"""
Map equation features to a probability distribution over the 8 Hachimoji states.
This is the key step: the equation's structural features are converted
into a point on the probability simplex Δ^7. The Fisher metric then
measures distances between these points.
"""
# Raw scores for each state based on feature matching
scores = {
"A": 0.1 + 0.5 * int(features.has_equality and features.has_quantifier) + 0.3 * features.abstraction_score,
"T": 0.4 * int(features.has_integral or features.has_derivative) + 0.2 * features.complexity_score,
"G": 0.2 + 0.4 * int(features.has_equality and features.complexity_score < 0.1),
"C": 0.1 + 0.3 * int(not features.has_equality) + 0.4 * features.abstraction_score,
"B": 0.1 + 0.4 * int(features.has_sum_product) + 0.2 * features.complexity_score,
"S": 0.1 + 0.3 * features.complexity_score + 0.1 * int(features.has_exponent),
"P": 0.1 + 0.4 * int(features.has_equality and 0.03 < features.complexity_score < 0.2),
"Z": max(0.05, 0.3 - 0.2 * features.complexity_score - 0.1 * features.abstraction_score),
}
# Normalize to probability distribution (must sum to 1)
total = sum(scores.values())
if total > 0:
return {k: max(v / total, 1e-10) for k, v in scores.items()}
else:
# Fallback to uniform
return {state: 1.0 / HACHIMOJI_SIZE for state in HACHIMOJI_ALPHABET}
def type_admissible(state: HachimojiState, features: EquationFeatures) -> AdmissionResult:
"""
Type Admissibility Gate: Check if the equation's type matches the state's
expected structural properties.
"""
gate_name = "typeAdmissible"
if state == HachimojiState.ADMIT:
ok = features.has_equality and features.has_quantifier
reason = "ADMIT requires equality + quantifier" if not ok else "Type OK"
elif state == HachimojiState.TRACE:
ok = features.has_integral or features.has_derivative or features.has_sum_product
reason = "TRACE requires integral/derivative/sum" if not ok else "Type OK"
elif state == HachimojiState.GROUND:
ok = features.has_equality and features.complexity_score < 0.1
reason = "GROUND requires simple equality" if not ok else "Type OK"
elif state == HachimojiState.CHALLENGE:
ok = (not features.has_equality) or features.abstraction_score > 0.3
reason = "CHALLENGE requires no equality or high abstraction" if not ok else "Type OK"
elif state == HachimojiState.BIND:
ok = features.has_sum_product or features.complexity_score > 0.1
reason = "BIND requires sum/product or moderate complexity" if not ok else "Type OK"
elif state == HachimojiState.SEARCH:
ok = features.complexity_score > 0.05
reason = "SEARCH requires some complexity" if not ok else "Type OK"
elif state == HachimojiState.PROOF:
ok = features.has_equality and 0.03 < features.complexity_score < 0.2
reason = "PROOF requires equality with moderate complexity" if not ok else "Type OK"
elif state == HachimojiState.ZERO:
ok = True # Always type-admissible
reason = "ZERO is always type-admissible"
d = fisher_distance(features)
return AdmissionResult(admitted=ok, gate=gate_name, reason=reason, fisher_distance=d)
def projection_admissible(state: HachimojiState, features: EquationFeatures) -> AdmissionResult:
"""
Projection Admissibility Gate: Check if the equation projects cleanly
onto the Fisher-metric simplex without distortion.
"""
gate_name = "projectionAdmissible"
d = fisher_distance(features)
# Projection is admissible if Fisher distance is within the state's region
region_bounds = {
HachimojiState.ADMIT: (0.10, float('inf')),
HachimojiState.TRACE: (0.08, float('inf')),
HachimojiState.GROUND: (0.0, 0.06),
HachimojiState.CHALLENGE: (0.06, float('inf')),
HachimojiState.BIND: (0.05, float('inf')),
HachimojiState.SEARCH: (0.03, 0.20),
HachimojiState.PROOF: (0.02, 0.15),
HachimojiState.ZERO: (0.0, float('inf')),
}
lo, hi = region_bounds[state]
ok = lo <= d <= hi
reason = f"Fisher distance {d:.4f} in [{lo}, {hi}]" if ok else f"Fisher distance {d:.4f} outside [{lo}, {hi}]"
return AdmissionResult(admitted=ok, gate=gate_name, reason=reason, fisher_distance=d)
def merge_admissible(
state: HachimojiState,
type_result: AdmissionResult,
proj_result: AdmissionResult
) -> AdmissionResult:
"""
Merge Admissibility Gate: Combine type and projection admissions.
Both must pass for final admission.
"""
gate_name = "mergeAdmissible"
ok = type_result.admitted and proj_result.admitted
if ok:
reason = f"Both gates passed (type={type_result.admitted}, proj={proj_result.admitted})"
else:
reason = f"Merged gate failed: type={type_result.reason}; proj={proj_result.reason}"
return AdmissionResult(
admitted=ok,
gate=gate_name,
reason=reason,
fisher_distance=proj_result.fisher_distance
)
# ---------------------------------------------------------------------------
# RECEIPT & EMIT STAMP GENERATION
# ---------------------------------------------------------------------------
@dataclass
class Receipt:
"""Intermediate receipt before admission gating."""
equation: str
state: HachimojiState
features: EquationFeatures
fisher_distance: float
timestamp: float = field(default_factory=time.time)
receipt_id: str = ""
def __post_init__(self):
if not self.receipt_id:
self.receipt_id = self._compute_id()
def _compute_id(self) -> str:
canonical = f"{self.equation}|{self.state.letter}|{self.fisher_distance:.6f}|{self.timestamp:.6f}"
return hashlib.sha256(canonical.encode()).hexdigest()[:16]
@dataclass
class EmitStamp:
"""Final certified emit stamp after successful admission."""
equation: str
state: HachimojiState
admission: AdmissionResult
receipt_id: str
stamp_hash: str
timestamp: float
certified: bool # True if all RRC gates passed
def to_dict(self) -> dict:
return {
"equation": self.equation,
"state": self.state.name,
"letter": self.state.letter,
"admission": {
"admitted": self.admission.admitted,
"gate": self.admission.gate,
"reason": self.admission.reason,
"fisher_distance": round(self.admission.fisher_distance, 6),
},
"receipt_id": self.receipt_id,
"stamp_hash": self.stamp_hash,
"timestamp": self.timestamp,
"certified": self.certified,
}
def compute_stamp_hash(receipt: Receipt, admission: AdmissionResult) -> str:
"""Compute the final emit stamp hash from receipt + admission."""
canonical = (
f"receipt={receipt.receipt_id}"
f"|state={receipt.state.letter}"
f"|admitted={admission.admitted}"
f"|gate={admission.gate}"
f"|fisher={admission.fisher_distance:.8f}"
f"|ts={receipt.timestamp:.6f}"
)
return hashlib.sha256(canonical.encode()).hexdigest()
# ---------------------------------------------------------------------------
# MAIN PIPELINE: equation_to_emit
# ---------------------------------------------------------------------------
def equation_to_emit(eq_str: str) -> dict:
"""
Convert an equation string to a stamped emit output.
Pipeline:
1. PARSE: Extract structural features from the equation string
2. CLASSIFY: Use Fisher-metric geometry to assign Hachimoji state
3. RECEIPT: Generate intermediate receipt with receipt ID
4. ADMIT: Apply RRC gates (typeAdmissible, projectionAdmissible, mergeAdmissible)
5. EMIT: Produce certified stamp if admitted, or failure record
Args:
eq_str: The equation string to process.
Returns:
Dictionary with the full pipeline result.
"""
# Step 1: PARSE
features = parse_equation(eq_str)
# Step 2: CLASSIFY (using Chentsov-unique Fisher metric geometry)
state = classify_equation(features)
# Step 3: Compute Fisher distance
f_dist = fisher_distance(features)
# Step 4: RECEIPT
receipt = Receipt(
equation=eq_str,
state=state,
features=features,
fisher_distance=f_dist,
)
# Step 5: ADMIT — RRC gates
type_result = type_admissible(state, features)
proj_result = projection_admissible(state, features)
merge_result = merge_admissible(state, type_result, proj_result)
# Step 6: EMIT
stamp_hash = compute_stamp_hash(receipt, merge_result)
certified = merge_result.admitted
stamp = EmitStamp(
equation=eq_str,
state=state,
admission=merge_result,
receipt_id=receipt.receipt_id,
stamp_hash=stamp_hash,
timestamp=receipt.timestamp,
certified=certified,
)
return {
"equation": eq_str,
"state": state.name,
"letter": state.letter,
"fisher_distance": round(f_dist, 6),
"receipt_id": receipt.receipt_id,
"admission": merge_result.admitted,
"admission_gate": merge_result.gate,
"admission_reason": merge_result.reason,
"type_gate_passed": type_result.admitted,
"projection_gate_passed": proj_result.admitted,
"stamp_hash": stamp_hash,
"certified": certified,
"features": {
"length": features.length,
"complexity_score": round(features.complexity_score, 6),
"abstraction_score": round(features.abstraction_score, 6),
"has_equality": features.has_equality,
"has_quantifier": features.has_quantifier,
"has_integral": features.has_integral,
"has_derivative": features.has_derivative,
},
"emit": stamp.to_dict(),
}
# ---------------------------------------------------------------------------
# TEST EQUATIONS
# ---------------------------------------------------------------------------
TEST_EQUATIONS: List[Tuple[str, HachimojiState]] = [
# (equation_string, expected_hachimoji_state)
("E = mc^2", HachimojiState.GROUND), # Simple equality
("F = ma", HachimojiState.GROUND), # Simple equality
("∀x ∈ : x^2 ≥ 0", HachimojiState.ADMIT), # Quantifier + equality
("∫_0^∞ e^(-x) dx = 1", HachimojiState.TRACE), # Integral
("∂u/∂t = α ∇²u", HachimojiState.TRACE), # PDE with derivative
("P ≠ NP", HachimojiState.CHALLENGE), # No equality, conjecture
("∑_{n=1}^∞ 1/n^2 = π²/6", HachimojiState.BIND), # Summation
("a^2 + b^2 = c^2", HachimojiState.PROOF), # Equality, moderate complexity
("1 + 1 = 2", HachimojiState.GROUND), # Trivial equality
("e^(iπ) + 1 = 0", HachimojiState.PROOF), # Euler's identity
("× E = -∂B/∂t", HachimojiState.TRACE), # Maxwell's equation
("lim_{x→0} sin(x)/x = 1", HachimojiState.TRACE), # Limit (integral-like)
]
def run_tests() -> Dict:
"""Run all test equations and report results."""
results = {
"total": len(TEST_EQUATIONS),
"passed": 0,
"failed": 0,
"details": [],
}
print("\n" + "=" * 72)
print(" HACHIMOJI CODEC — TEST SUITE")
print("=" * 72)
for eq_str, expected in TEST_EQUATIONS:
result = equation_to_emit(eq_str)
actual = HachimojiState[result["state"]]
ok = actual == expected
status = "PASS" if ok else "FAIL"
if ok:
results["passed"] += 1
else:
results["failed"] += 1
detail = {
"equation": eq_str,
"expected": expected.name,
"actual": actual.name,
"passed": ok,
"fisher_distance": result["fisher_distance"],
"admitted": result["admission"],
"stamp_hash": result["stamp_hash"],
}
results["details"].append(detail)
print(f" [{status}] {eq_str:35s} → expected={expected.name:10s} actual={actual.name:10s} "
f"d={result['fisher_distance']:.4f} admit={result['admission']}")
print("-" * 72)
print(f" Results: {results['passed']}/{results['total']} passed, "
f"{results['failed']}/{results['total']} failed")
print("=" * 72)
return results
# ---------------------------------------------------------------------------
# COMMAND-LINE INTERFACE
# ---------------------------------------------------------------------------
def main():
import argparse
parser = argparse.ArgumentParser(description="Hachimoji Codec Demo")
parser.add_argument("equation", nargs="?", help="Equation string to process")
parser.add_argument("--all-tests", action="store_true", help="Run full test suite")
parser.add_argument("--chentsov-summary", action="store_true", help="Show Chentsov theorem summary")
parser.add_argument("--json", action="store_true", help="Output JSON")
args = parser.parse_args()
if args.chentsov_summary or (not args.equation and not args.all_tests):
print_chentsov_summary()
if args.all_tests:
run_tests()
return
if args.equation:
result = equation_to_emit(args.equation)
if args.json:
print(json.dumps(result, indent=2))
else:
print(f"\nEquation: {result['equation']}")
print(f" State: {result['state']} ({result['letter']})")
print(f" Fisher dist: {result['fisher_distance']}")
print(f" Receipt ID: {result['receipt_id']}")
print(f" Admission: {'PASSED' if result['admission'] else 'FAILED'}")
print(f" Reason: {result['admission_reason']}")
print(f" Stamp hash: {result['stamp_hash']}")
print(f" Certified: {result['certified']}")
def print_chentsov_summary():
"""Print a summary of Chentsov's theorem and its implications."""
print("\n" + "=" * 72)
print(" CHENTSOV FINITE THEOREM — SUMMARY")
print("=" * 72)
print("""
Chentsov's Theorem (Finite-Dimensional Version):
─────────────────────────────────────────────────
The Fisher information metric:
g_ij(π) = δ_ij / π_i
is the UNIQUE Riemannian metric on the probability simplex Δ^n
that is invariant under all monotone Markov embeddings.
Application to Hachimoji (n = 8):
──────────────────────────────────
The 8-state Hachimoji alphabet {A, T, G, C, B, S, P, Z} lives on
the simplex Δ^7. Chentsov's theorem PROVES that the Fisher metric
is the only geometry compatible with statistical inference on this
space.
Consequence for the Codec:
──────────────────────────
1. The geometry is UNIQUE → classification is canonical
2. Without Chentsov, thresholds are arbitrary
3. With Chentsov, thresholds are FORCED by the geometry
4. RRC admission gates are principled, not heuristic
Proof Technique:
────────────────
1. Diagonalization: Show metric must be diagonal in π-coordinates
2. Permutation invariance: All states treated equally
3. Functional equation: h(t) = c/t is the only solution
4. Combine: g_ij = c · δ_ij / π_i (c = 1 for normalization)
""")
print("=" * 72)
if __name__ == "__main__":
main()