Research-Stack/4-Infrastructure/infra/embedded_surface/omni_lut/possibility_space_probe.py

384 lines
12 KiB
Python

#!/usr/bin/env python3
"""Metaprobe + RGFlow pass over sequence-surface possibility spaces.
The sequence LUT should not be chosen by taste. This probe enumerates compact
candidate surfaces, extracts a small metaprobe signature, then keeps candidates
whose usefulness persists under coarse RG flow.
"""
from __future__ import annotations
import argparse
import json
import math
from dataclasses import asdict, dataclass
from itertools import product
from pathlib import Path
from typing import Iterable
try:
from .sequence_surface_lut import (
OP_COMPLEMENT,
OP_MUTATE,
OP_ROUTE,
OP_TRANSCRIBE,
OP_TRANSLATE_HINT,
ROLE_ARCHIVAL,
ROLE_CATALYTIC,
ROLE_EXPANDED,
ROLE_MESSENGER,
ROLE_SYNTHETIC,
SURFACES,
SequenceSurface,
)
from .gcl_motif_lut import MOTIFS
except ImportError:
from sequence_surface_lut import (
OP_COMPLEMENT,
OP_MUTATE,
OP_ROUTE,
OP_TRANSCRIBE,
OP_TRANSLATE_HINT,
ROLE_ARCHIVAL,
ROLE_CATALYTIC,
ROLE_EXPANDED,
ROLE_MESSENGER,
ROLE_SYNTHETIC,
SURFACES,
SequenceSurface,
)
from gcl_motif_lut import MOTIFS
ROLE_MASKS = {
"archival": ROLE_ARCHIVAL,
"catalytic": ROLE_CATALYTIC,
"messenger": ROLE_MESSENGER,
"synthetic": ROLE_SYNTHETIC,
"expanded": ROLE_EXPANDED,
}
OP_MASKS = {
"complement": OP_COMPLEMENT,
"transcribe": OP_TRANSCRIBE,
"translate_hint": OP_TRANSLATE_HINT,
"mutate": OP_MUTATE,
"route": OP_ROUTE,
}
@dataclass(frozen=True)
class SurfaceCandidate:
name: str
family: str
alphabet_size: int
bits_per_symbol: int
role_flags: int
op_flags: int
complement_closed: bool
closure_kind: str
known_surface: bool
@dataclass(frozen=True)
class ProbeSignature:
compactness: float
closure: float
operation_density: float
role_density: float
degeneracy: float
frame_efficiency: float
combinatorial_capacity: float
@dataclass(frozen=True)
class RGState:
mu_bin: int
rho_bin: int
c_bin: int
m_bin: int
ne_bin: int
sig_bin: int
@dataclass(frozen=True)
class ProbeResult:
candidate: SurfaceCandidate
signature: ProbeSignature
initial_state: RGState
final_state: RGState
lawful_now: bool
lawful_under_flow: bool
rg_depth: int
score: float
verdict: str
def clamp(value: float, lo: float, hi: float) -> float:
return max(lo, min(hi, value))
def bin8(value: float) -> int:
return int(clamp(value, 0.0, 0.999999) * 8.0)
def bit_count(value: int) -> int:
return value.bit_count()
def bits_for_alphabet(alphabet_size: int) -> int:
return max(1, math.ceil(math.log2(alphabet_size)))
def known_candidates() -> Iterable[SurfaceCandidate]:
for surface in SURFACES.values():
yield SurfaceCandidate(
name=surface.name,
family="sequence",
alphabet_size=len(surface.symbols),
bits_per_symbol=surface.bits_per_symbol,
role_flags=surface.role_flags,
op_flags=surface.op_flags,
complement_closed=bool(surface.op_flags & OP_COMPLEMENT),
closure_kind="complement" if surface.op_flags & OP_COMPLEMENT else "none",
known_surface=True,
)
def motif_candidates() -> Iterable[SurfaceCandidate]:
for motif in MOTIFS.values():
yield SurfaceCandidate(
name=motif.name,
family="gcl_motif",
alphabet_size=motif.alphabet_size,
bits_per_symbol=motif.bits_per_symbol,
role_flags=motif.role_flags,
op_flags=motif.op_flags,
complement_closed=False,
closure_kind=motif.closure_kind,
known_surface=True,
)
def synthetic_candidates(max_alphabet: int) -> Iterable[SurfaceCandidate]:
role_options = [
ROLE_ARCHIVAL,
ROLE_CATALYTIC,
ROLE_MESSENGER,
ROLE_SYNTHETIC,
ROLE_ARCHIVAL | ROLE_EXPANDED,
ROLE_SYNTHETIC | ROLE_EXPANDED,
ROLE_CATALYTIC | ROLE_MESSENGER,
]
op_options = [
OP_ROUTE | OP_MUTATE,
OP_ROUTE | OP_COMPLEMENT,
OP_ROUTE | OP_COMPLEMENT | OP_MUTATE,
OP_ROUTE | OP_COMPLEMENT | OP_TRANSCRIBE,
OP_ROUTE | OP_TRANSLATE_HINT | OP_MUTATE,
OP_ROUTE | OP_COMPLEMENT | OP_TRANSCRIBE | OP_TRANSLATE_HINT | OP_MUTATE,
]
for alphabet_size, role_flags, op_flags in product(range(2, max_alphabet + 1), role_options, op_options):
complement_closed = bool(op_flags & OP_COMPLEMENT) and alphabet_size % 2 == 0
yield SurfaceCandidate(
name=f"a{alphabet_size:02d}_r{role_flags:02x}_o{op_flags:02x}",
family="synthetic",
alphabet_size=alphabet_size,
bits_per_symbol=bits_for_alphabet(alphabet_size),
role_flags=role_flags,
op_flags=op_flags,
complement_closed=complement_closed,
closure_kind="complement" if complement_closed else "partial" if op_flags & OP_COMPLEMENT else "none",
known_surface=False,
)
def metaprobe(candidate: SurfaceCandidate, window_symbols: int) -> ProbeSignature:
compactness = 1.0 / candidate.bits_per_symbol
messenger_exec = bool(candidate.role_flags & ROLE_MESSENGER) and bool(
candidate.op_flags & OP_TRANSLATE_HINT
)
if candidate.complement_closed:
closure = 1.0
elif candidate.closure_kind in {
"rgflow",
"codec_roundtrip",
"hash_manifest",
"hash_chain",
"last_good",
"rg_address",
"invariant_witness",
"route_prior_geometry",
}:
closure = 0.9
elif candidate.closure_kind in {"finite_codon", "topology_route"}:
closure = 0.8
elif messenger_exec:
closure = 0.65
elif candidate.op_flags & OP_COMPLEMENT:
closure = 0.35
else:
closure = 0.0
operation_density = bit_count(candidate.op_flags) / len(OP_MASKS)
role_density = bit_count(candidate.role_flags) / len(ROLE_MASKS)
degeneracy = clamp(math.log2(candidate.alphabet_size) / candidate.alphabet_size, 0.0, 1.0)
payload_bits = window_symbols * candidate.bits_per_symbol
framed_bits = payload_bits + 32
ascii_bits = window_symbols * 8
frame_efficiency = 1.0 - (framed_bits / ascii_bits)
combinatorial_capacity = math.log2(candidate.alphabet_size) * window_symbols / framed_bits
return ProbeSignature(
compactness=compactness,
closure=closure,
operation_density=operation_density,
role_density=role_density,
degeneracy=degeneracy,
frame_efficiency=frame_efficiency,
combinatorial_capacity=combinatorial_capacity,
)
def signature_to_rg_state(signature: ProbeSignature) -> RGState:
mutation_freedom = 1.0 - signature.closure
return RGState(
mu_bin=bin8(mutation_freedom),
rho_bin=bin8(signature.combinatorial_capacity),
c_bin=bin8(signature.operation_density),
m_bin=bin8(signature.frame_efficiency),
ne_bin=bin8(signature.role_density),
sig_bin=bin8((signature.closure + signature.degeneracy) / 2.0),
)
def locally_lawful(state: RGState) -> bool:
low_mutation_pressure = state.mu_bin <= 4
enough_capacity = state.rho_bin + state.ne_bin >= 4
useful_complexity = 1 <= state.c_bin <= 6
stable_signature = state.sig_bin >= 2
efficient_frame = state.m_bin >= 2
return low_mutation_pressure and enough_capacity and useful_complexity and stable_signature and efficient_frame
def coarse_step(state: RGState) -> RGState:
return RGState(
mu_bin=max(0, state.mu_bin - 1),
rho_bin=max(0, min(7, state.rho_bin + (1 if state.sig_bin >= 3 else 0))),
c_bin=max(0, state.c_bin - (1 if state.c_bin > 5 else 0)),
m_bin=max(0, min(7, state.m_bin + 1)),
ne_bin=max(0, min(7, state.ne_bin + 1)),
sig_bin=max(0, min(7, state.sig_bin + (1 if state.mu_bin <= 3 else 0))),
)
def rgflow(state: RGState, steps: int) -> tuple[bool, RGState, int]:
current = state
depth = 0
for _ in range(steps):
if not locally_lawful(current):
return False, current, depth
depth += 1
current = coarse_step(current)
return locally_lawful(current), current, depth
def score(signature: ProbeSignature, lawful_under_flow: bool, depth: int) -> float:
base = (
0.24 * signature.frame_efficiency
+ 0.20 * signature.closure
+ 0.18 * signature.combinatorial_capacity
+ 0.16 * signature.operation_density
+ 0.12 * signature.degeneracy
+ 0.10 * signature.role_density
)
return round(base + (0.05 * depth if lawful_under_flow else 0.0), 6)
def evaluate(candidate: SurfaceCandidate, window_symbols: int, steps: int) -> ProbeResult:
signature = metaprobe(candidate, window_symbols)
initial_state = signature_to_rg_state(signature)
lawful_now = locally_lawful(initial_state)
lawful_under_flow, final_state, depth = rgflow(initial_state, steps)
usefulness = score(signature, lawful_under_flow, depth)
if lawful_under_flow and usefulness >= 0.75:
verdict = "lut_candidate"
elif lawful_under_flow:
verdict = "admissible_surface"
else:
verdict = "reject_noise_or_bad_tradeoff"
return ProbeResult(
candidate=candidate,
signature=signature,
initial_state=initial_state,
final_state=final_state,
lawful_now=lawful_now,
lawful_under_flow=lawful_under_flow,
rg_depth=depth,
score=usefulness,
verdict=verdict,
)
def result_to_dict(result: ProbeResult) -> dict[str, object]:
return {
"candidate": asdict(result.candidate),
"signature": asdict(result.signature),
"initial_state": asdict(result.initial_state),
"final_state": asdict(result.final_state),
"lawful_now": result.lawful_now,
"lawful_under_flow": result.lawful_under_flow,
"rg_depth": result.rg_depth,
"score": result.score,
"verdict": result.verdict,
}
def run(max_alphabet: int, window_symbols: int, steps: int, include_synthetic: bool) -> list[ProbeResult]:
candidates = list(known_candidates())
candidates.extend(motif_candidates())
if include_synthetic:
candidates.extend(synthetic_candidates(max_alphabet))
results = [evaluate(candidate, window_symbols, steps) for candidate in candidates]
return sorted(results, key=lambda item: (item.score, item.rg_depth), reverse=True)
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--max-alphabet", type=int, default=16)
parser.add_argument("--window-symbols", type=int, default=256)
parser.add_argument("--steps", type=int, default=4)
parser.add_argument("--known-only", action="store_true")
parser.add_argument("--top", type=int, default=16)
parser.add_argument("--jsonl", action="store_true")
parser.add_argument("--output", type=Path)
args = parser.parse_args()
if args.max_alphabet < 2 or args.max_alphabet > 64:
parser.error("--max-alphabet must be in 2..64")
if args.window_symbols < 1:
parser.error("--window-symbols must be positive")
if args.steps < 1 or args.steps > 16:
parser.error("--steps must be in 1..16")
results = run(args.max_alphabet, args.window_symbols, args.steps, not args.known_only)
selected = results[: args.top]
rows = [result_to_dict(result) for result in selected]
if args.output:
args.output.parent.mkdir(parents=True, exist_ok=True)
with args.output.open("w", encoding="utf-8") as handle:
if args.jsonl:
for row in rows:
handle.write(json.dumps(row, separators=(",", ":")) + "\n")
else:
json.dump(rows, handle, indent=2)
if args.jsonl:
for row in rows:
print(json.dumps(row, separators=(",", ":")))
else:
print(json.dumps(rows, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())