Spaces:
Runtime error
Runtime error
GitHub Copilot commited on
Commit Β·
6d3aa82
1
Parent(s): 8759f2e
LOGOS v1.0: MTL Turing Complete, Genesis Kernel, SPCW Transceiver, Harmonizer
Browse files- app.py +199 -126
- logos/__init__.py +30 -3
- logos/agents/dissolution_engine.py +222 -0
- logos/docs/DEVELOPER_GUIDELINES.md +87 -0
- logos/docs/README.md +203 -0
- logos/docs/TECHNICAL_ARCHITECTURE.md +84 -0
- logos/docs/architecture_overview.md +135 -0
- logos/docs/definitions_alignment.md +38 -0
- logos/docs/epistemology_audit.md +48 -0
- logos/docs/mtl_specification.md +51 -0
- logos/docs/periodic_table.md +48 -0
- logos/docs/purpose_statement.md +139 -0
- logos/harmonizer.py +245 -0
- logos/kernel.py +230 -0
- logos/memory/prime_db.py +72 -2
- logos/mtl/genesis.json +13 -0
- logos/mtl/interpreter.py +684 -0
- logos/spcw_transceiver.py +304 -0
- logos/tools/__init__.py +0 -0
- logos/tools/check_transcript.py +16 -0
- logos/tools/context_oracle.py +84 -0
- logos/tools/test_fusion.py +40 -0
- logos/tools/test_logic_gates.py +112 -0
- logos/tools/test_not_gate.py +37 -0
- logos/tools/test_persistence.py +90 -0
- logos/tools/test_synapse.py +168 -0
- logos/tools/validate_mtl.py +72 -0
app.py
CHANGED
|
@@ -2,18 +2,26 @@ import gradio as gr
|
|
| 2 |
import numpy as np
|
| 3 |
import plotly.graph_objects as go
|
| 4 |
import sympy
|
| 5 |
-
import cv2
|
| 6 |
import time
|
| 7 |
import os
|
| 8 |
import sys
|
| 9 |
from collections import Counter
|
| 10 |
-
from PIL import Image
|
| 11 |
|
| 12 |
# Ensure logos package is importable
|
| 13 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 14 |
if current_dir not in sys.path:
|
| 15 |
sys.path.insert(0, current_dir)
|
| 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
try:
|
| 18 |
from logos.dsp_bridge import DSPBridge
|
| 19 |
from logos.logos_core import PRIME_MODULO
|
|
@@ -26,16 +34,9 @@ except ImportError:
|
|
| 26 |
import threading
|
| 27 |
import subprocess
|
| 28 |
|
| 29 |
-
# --- PROTOCOL 26: START NEURAL ROUTER ---
|
| 30 |
-
import threading
|
| 31 |
-
import subprocess
|
| 32 |
-
import time
|
| 33 |
-
|
| 34 |
def start_neural_router():
|
| 35 |
print("[SYSTEM] Igniting Neural Router (Port 5000)...")
|
| 36 |
-
log_file = open("neural_router.log", "w")
|
| 37 |
try:
|
| 38 |
-
# Launch with stdout/stderr redirection for debugging
|
| 39 |
process = subprocess.Popen(
|
| 40 |
[sys.executable, "-m", "logos.server"],
|
| 41 |
env={**os.environ, "PYTHONPATH": current_dir},
|
|
@@ -44,19 +45,16 @@ def start_neural_router():
|
|
| 44 |
text=True,
|
| 45 |
bufsize=1
|
| 46 |
)
|
| 47 |
-
print(f"
|
| 48 |
|
| 49 |
-
# Stream logs in a separate thread to avoid blocking
|
| 50 |
def stream_logs(p):
|
| 51 |
for line in iter(p.stdout.readline, ''):
|
| 52 |
print(f"[ROUTER] {line.strip()}")
|
| 53 |
-
log_file.write(line)
|
| 54 |
-
log_file.flush()
|
| 55 |
|
| 56 |
threading.Thread(target=stream_logs, args=(process,), daemon=True).start()
|
| 57 |
|
| 58 |
except Exception as e:
|
| 59 |
-
print(f"
|
| 60 |
|
| 61 |
threading.Thread(target=start_neural_router, daemon=True).start()
|
| 62 |
|
|
@@ -68,21 +66,67 @@ def load_css():
|
|
| 68 |
except:
|
| 69 |
return ""
|
| 70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
|
|
|
| 74 |
def get_prime_topology(max_n=1000):
|
| 75 |
-
"""
|
| 76 |
-
Generates the 'Godel Field' Visualization.
|
| 77 |
-
"""
|
| 78 |
fig = go.Figure()
|
| 79 |
|
| 80 |
-
# 1. Primes (The Structure)
|
| 81 |
primes = [n for n in range(2, max_n) if sympy.isprime(n)]
|
| 82 |
-
|
| 83 |
-
# Polar Coordinates based on Prime Index (Spiral)
|
| 84 |
r = [n for n in primes]
|
| 85 |
-
theta = [n * 2.39996 for n in primes]
|
| 86 |
|
| 87 |
fig.add_trace(go.Scatterpolar(
|
| 88 |
r=r, theta=theta, mode='markers',
|
|
@@ -110,27 +154,53 @@ def get_prime_topology(max_n=1000):
|
|
| 110 |
)
|
| 111 |
return fig
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
|
| 114 |
# --- UI TEXT & CONTEXT ---
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
PROTOCOL_NAME = "PROTOCOL 26: SPCW MATROSKA"
|
| 118 |
-
SUBTITLE = "Structured Prime-Composite Waveforms + Hex-Resonance Manifold"
|
| 119 |
|
| 120 |
def fetch_manifold_diagnostics():
|
| 121 |
-
"""
|
| 122 |
-
Polls the router for live physics state and builds a Gravis 3D Graph.
|
| 123 |
-
"""
|
| 124 |
import requests
|
| 125 |
-
import networkx as nx
|
| 126 |
-
import gravis as gv
|
| 127 |
|
| 128 |
try:
|
| 129 |
resp = requests.get("http://localhost:5000/v1", timeout=1)
|
| 130 |
data = resp.json()
|
| 131 |
state = data.get("manifold_state", {})
|
| 132 |
|
| 133 |
-
# Parse Status
|
| 134 |
status_html = f"""
|
| 135 |
<div style='display: flex; gap: 20px; align-items: center;'>
|
| 136 |
<div style='background: rgba(0,255,234,0.1); padding: 10px; border: 1px solid #00ffea; border-radius: 5px;'>
|
|
@@ -139,83 +209,43 @@ def fetch_manifold_diagnostics():
|
|
| 139 |
</div>
|
| 140 |
<div style='background: rgba(255,0,85,0.1); padding: 10px; border: 1px solid #ff0055; border-radius: 5px;'>
|
| 141 |
<div style='font-size: 10px; color: #888;'>PROTOCOL</div>
|
| 142 |
-
<div style='font-size: 16px; color: #ff0055; font-weight: bold;'>SPCW /
|
| 143 |
</div>
|
| 144 |
<div style='background: rgba(157,78,221,0.1); padding: 10px; border: 1px solid #9d4edd; border-radius: 5px;'>
|
| 145 |
-
<div style='font-size: 10px; color: #888;'>
|
| 146 |
-
<div style='font-size: 16px; color: #9d4edd;
|
| 147 |
</div>
|
| 148 |
</div>
|
| 149 |
"""
|
| 150 |
|
| 151 |
-
|
| 152 |
-
G = nx.Graph()
|
| 153 |
-
nodes = state.get("graph", {}).get("nodes", {})
|
| 154 |
-
edges = state.get("graph", {}).get("edges", [])
|
| 155 |
-
|
| 156 |
-
if nodes:
|
| 157 |
-
for nid, n in nodes.items():
|
| 158 |
-
domain = n.get("geometry", {}).get("domain", "INNER_SHELL")
|
| 159 |
-
name = n.get("name", nid)
|
| 160 |
-
|
| 161 |
-
# Style based on Domain (Hex/Heat Context)
|
| 162 |
-
color = "#00ffea" # Inner Structure
|
| 163 |
-
if domain == "PRIME_CHANNEL": color = "#9d4edd" # Prime Composite
|
| 164 |
-
elif domain == "OUTER_SHELL": color = "#ff0055" # Heat/Entropy
|
| 165 |
-
|
| 166 |
-
size = 15 if n.get("alive") else 5
|
| 167 |
-
|
| 168 |
-
# Detailed Hover for Physics Debugging
|
| 169 |
-
hover_txt = f"""
|
| 170 |
-
<b>{name}</b><br>
|
| 171 |
-
Domain: {domain}<br>
|
| 172 |
-
Action: {n.get('action_pending', 'Stable')}<br>
|
| 173 |
-
Heat: {n.get('heat', 0)}
|
| 174 |
-
"""
|
| 175 |
-
|
| 176 |
-
G.add_node(nid, label=name, color=color, size=size, hover=hover_txt)
|
| 177 |
-
|
| 178 |
-
for e in edges:
|
| 179 |
-
G.add_edge(e["source"], e["target"], color="#333", size=1)
|
| 180 |
-
|
| 181 |
-
# Use Gravis Three.js (3D) visualization
|
| 182 |
-
html_content = gv.three(G,
|
| 183 |
-
zoom_factor=0.5,
|
| 184 |
-
node_label_data_source='label',
|
| 185 |
-
node_size_data_source='size',
|
| 186 |
-
node_color_data_source='color',
|
| 187 |
-
use_node_size_normalization=True,
|
| 188 |
-
node_size_normalization_min=5,
|
| 189 |
-
node_size_normalization_max=20,
|
| 190 |
-
layout_algorithm_active=True,
|
| 191 |
-
layout_algorithm="force_directed_3d",
|
| 192 |
-
height=600).to_html_standalone()
|
| 193 |
-
|
| 194 |
-
# Wrap in flexible container
|
| 195 |
-
graph_html = f"""
|
| 196 |
-
<div style="width:100%; height:600px; background: rgba(0,0,0,0.2); border-radius: 8px; overflow: hidden;">
|
| 197 |
-
{html_content}
|
| 198 |
-
</div>
|
| 199 |
-
"""
|
| 200 |
-
else:
|
| 201 |
-
graph_html = "<div style='padding:20px; color:#666;'>No Manifold Geometry Detected (System Idle)</div>"
|
| 202 |
-
|
| 203 |
return status_html, graph_html
|
| 204 |
|
| 205 |
except Exception as e:
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
|
| 210 |
# --- APP LAYOUT ---
|
| 211 |
-
|
| 212 |
-
with gr.Blocks(theme=gr.themes.Soft(), css=load_css(), title="LOGOS: SPCW Matroska") as demo:
|
| 213 |
|
| 214 |
# 1. HERO HEADER
|
| 215 |
with gr.Row(elem_classes=["header-row"]):
|
| 216 |
gr.Markdown(f"""
|
| 217 |
# {PROTOCOL_NAME}
|
| 218 |
**{SUBTITLE}**
|
|
|
|
|
|
|
| 219 |
""")
|
| 220 |
|
| 221 |
# 2. LIVE TELEMETRY
|
|
@@ -225,47 +255,100 @@ with gr.Blocks(theme=gr.themes.Soft(), css=load_css(), title="LOGOS: SPCW Matros
|
|
| 225 |
# 3. MAIN INTERFACE
|
| 226 |
with gr.Tabs():
|
| 227 |
|
| 228 |
-
# TAB A:
|
| 229 |
-
with gr.Tab("
|
| 230 |
with gr.Row():
|
| 231 |
-
with gr.Column(scale=
|
| 232 |
-
|
| 233 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 234 |
with gr.Column(scale=1):
|
| 235 |
-
gr.Markdown("### π§ Physics Engine")
|
| 236 |
gr.Markdown("""
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
|
| 242 |
-
*
|
| 243 |
""")
|
| 244 |
-
btn_refresh = gr.Button("β‘ Pulse Network", elem_classes=["primary-btn"])
|
| 245 |
|
| 246 |
-
# TAB
|
| 247 |
-
with gr.Tab("
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 248 |
with gr.Column(elem_classes=["chat-container"]):
|
| 249 |
-
chatbot = gr.Chatbot(label="
|
| 250 |
-
msg = gr.Textbox(label="
|
| 251 |
-
clear = gr.Button("Clear
|
| 252 |
|
| 253 |
def user(user_message, history):
|
| 254 |
return "", history + [[user_message, None]]
|
| 255 |
|
| 256 |
def bot(history):
|
| 257 |
user_message = history[-1][0]
|
| 258 |
-
# Call Local Router
|
| 259 |
import requests
|
| 260 |
try:
|
| 261 |
payload = {
|
| 262 |
"messages": [{"role": "user", "content": user_message}],
|
| 263 |
-
"model": "
|
| 264 |
}
|
| 265 |
resp = requests.post("http://localhost:5000/v1/chat/completions", json=payload, timeout=60)
|
| 266 |
bot_message = resp.json()['choices'][0]['message']['content']
|
| 267 |
except Exception as e:
|
| 268 |
-
bot_message = f"
|
| 269 |
|
| 270 |
history[-1][1] = bot_message
|
| 271 |
return history
|
|
@@ -273,23 +356,13 @@ with gr.Blocks(theme=gr.themes.Soft(), css=load_css(), title="LOGOS: SPCW Matros
|
|
| 273 |
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
|
| 274 |
bot, chatbot, chatbot
|
| 275 |
)
|
| 276 |
-
|
| 277 |
-
# TAB C: GΓDEL TOPOLOGY (MATH)
|
| 278 |
-
with gr.Tab("π GΓΆdel-Zeta Topology"):
|
| 279 |
-
with gr.Row():
|
| 280 |
-
with gr.Column():
|
| 281 |
-
prime_plot = gr.Plot(value=get_prime_topology(), label="The Prime Field")
|
| 282 |
-
with gr.Column():
|
| 283 |
-
gr.Markdown("### Prime Factorization Tree")
|
| 284 |
-
gr.Markdown("Every file is a number. Every concept is a Prime.")
|
| 285 |
-
|
| 286 |
# AUTO-REFRESH LOGIC
|
| 287 |
-
timer = gr.Timer(
|
| 288 |
-
timer.tick(fetch_manifold_diagnostics, outputs=[status_panel,
|
| 289 |
-
btn_refresh.click(fetch_manifold_diagnostics, outputs=[status_panel, manifold_plot])
|
| 290 |
|
| 291 |
# Load initial state
|
| 292 |
-
demo.load(fetch_manifold_diagnostics, outputs=[status_panel,
|
| 293 |
|
| 294 |
if __name__ == "__main__":
|
| 295 |
demo.launch(server_name="0.0.0.0", server_port=7860)
|
|
|
|
| 2 |
import numpy as np
|
| 3 |
import plotly.graph_objects as go
|
| 4 |
import sympy
|
|
|
|
| 5 |
import time
|
| 6 |
import os
|
| 7 |
import sys
|
| 8 |
from collections import Counter
|
|
|
|
| 9 |
|
| 10 |
# Ensure logos package is importable
|
| 11 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 12 |
if current_dir not in sys.path:
|
| 13 |
sys.path.insert(0, current_dir)
|
| 14 |
|
| 15 |
+
# --- LOGOS CORE IMPORTS ---
|
| 16 |
+
try:
|
| 17 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 18 |
+
from logos.memory.prime_db import PrimeTokenDB
|
| 19 |
+
MTL_AVAILABLE = True
|
| 20 |
+
print("[LOGOS] MTL Interpreter loaded successfully")
|
| 21 |
+
except ImportError as e:
|
| 22 |
+
MTL_AVAILABLE = False
|
| 23 |
+
print(f"[LOGOS] MTL not available: {e}")
|
| 24 |
+
|
| 25 |
try:
|
| 26 |
from logos.dsp_bridge import DSPBridge
|
| 27 |
from logos.logos_core import PRIME_MODULO
|
|
|
|
| 34 |
import threading
|
| 35 |
import subprocess
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
def start_neural_router():
|
| 38 |
print("[SYSTEM] Igniting Neural Router (Port 5000)...")
|
|
|
|
| 39 |
try:
|
|
|
|
| 40 |
process = subprocess.Popen(
|
| 41 |
[sys.executable, "-m", "logos.server"],
|
| 42 |
env={**os.environ, "PYTHONPATH": current_dir},
|
|
|
|
| 45 |
text=True,
|
| 46 |
bufsize=1
|
| 47 |
)
|
| 48 |
+
print(f"[OK] Neural Router Process ID: {process.pid}")
|
| 49 |
|
|
|
|
| 50 |
def stream_logs(p):
|
| 51 |
for line in iter(p.stdout.readline, ''):
|
| 52 |
print(f"[ROUTER] {line.strip()}")
|
|
|
|
|
|
|
| 53 |
|
| 54 |
threading.Thread(target=stream_logs, args=(process,), daemon=True).start()
|
| 55 |
|
| 56 |
except Exception as e:
|
| 57 |
+
print(f"[X] Failed to start Neural Router: {e}")
|
| 58 |
|
| 59 |
threading.Thread(target=start_neural_router, daemon=True).start()
|
| 60 |
|
|
|
|
| 66 |
except:
|
| 67 |
return ""
|
| 68 |
|
| 69 |
+
# --- MTL INTERPRETER INTERFACE ---
|
| 70 |
+
def execute_mtl(code: str) -> str:
|
| 71 |
+
"""Execute MTL code and return result."""
|
| 72 |
+
if not MTL_AVAILABLE:
|
| 73 |
+
return "MTL Interpreter not available in this environment"
|
| 74 |
+
|
| 75 |
+
try:
|
| 76 |
+
interpreter = MTLInterpreter()
|
| 77 |
+
result = interpreter.execute(code)
|
| 78 |
+
return f"Result: {result}"
|
| 79 |
+
except Exception as e:
|
| 80 |
+
return f"Error: {str(e)}"
|
| 81 |
|
| 82 |
+
def run_mtl_demo() -> str:
|
| 83 |
+
"""Run a demonstration of MTL capabilities."""
|
| 84 |
+
if not MTL_AVAILABLE:
|
| 85 |
+
return "MTL not available"
|
| 86 |
+
|
| 87 |
+
try:
|
| 88 |
+
mtl = MTLInterpreter()
|
| 89 |
+
output = []
|
| 90 |
+
|
| 91 |
+
output.append("=== LOGOS MTL DEMONSTRATION ===\n")
|
| 92 |
+
|
| 93 |
+
# Basic arithmetic
|
| 94 |
+
output.append("[1] Tensor Multiplication")
|
| 95 |
+
r = mtl.execute('(mult [2] [3])')
|
| 96 |
+
output.append(f" (mult [2] [3]) = {r} (MECHANISM x RESULT = FLIP)")
|
| 97 |
+
|
| 98 |
+
# Logic gates
|
| 99 |
+
output.append("\n[2] Logic Gates")
|
| 100 |
+
r = mtl.execute('(or [2] [3])')
|
| 101 |
+
output.append(f" (or [2] [3]) = {r} (LCM - Superposition)")
|
| 102 |
+
r = mtl.execute('(and [6] [10])')
|
| 103 |
+
output.append(f" (and [6] [10]) = {r} (GCD - Intersection)")
|
| 104 |
+
|
| 105 |
+
# Factorial
|
| 106 |
+
output.append("\n[3] Recursive Function (Factorial)")
|
| 107 |
+
mtl.execute('(defun factorial (n) (if (lt? n 2) 1 (mult n (factorial (sub n 1)))))')
|
| 108 |
+
r = mtl.execute('(factorial 5)')
|
| 109 |
+
output.append(f" (factorial 5) = {r}")
|
| 110 |
+
|
| 111 |
+
# Synapse
|
| 112 |
+
output.append("\n[4] Knowledge Graph (Synapse)")
|
| 113 |
+
r = mtl.execute('(relate [17] [19])')
|
| 114 |
+
output.append(f" (relate [17] [19]) = {r} (IMAGE x TEXT x RELATE)")
|
| 115 |
+
|
| 116 |
+
output.append("\n=== TURING COMPLETENESS VERIFIED ===")
|
| 117 |
+
|
| 118 |
+
return "\n".join(output)
|
| 119 |
+
except Exception as e:
|
| 120 |
+
return f"Demo Error: {str(e)}"
|
| 121 |
|
| 122 |
+
# --- PHYSICS VISUALIZERS ---
|
| 123 |
def get_prime_topology(max_n=1000):
|
| 124 |
+
"""Generates the Prime Spiral Visualization."""
|
|
|
|
|
|
|
| 125 |
fig = go.Figure()
|
| 126 |
|
|
|
|
| 127 |
primes = [n for n in range(2, max_n) if sympy.isprime(n)]
|
|
|
|
|
|
|
| 128 |
r = [n for n in primes]
|
| 129 |
+
theta = [n * 2.39996 for n in primes] # Golden Angle
|
| 130 |
|
| 131 |
fig.add_trace(go.Scatterpolar(
|
| 132 |
r=r, theta=theta, mode='markers',
|
|
|
|
| 154 |
)
|
| 155 |
return fig
|
| 156 |
|
| 157 |
+
def get_genesis_block_visual():
|
| 158 |
+
"""Visualize the Genesis Block primes."""
|
| 159 |
+
genesis = {
|
| 160 |
+
2: "MECHANISM", 3: "RESULT", 5: "CHOICE", 7: "PERSIST",
|
| 161 |
+
11: "WHY", 13: "RELATE", 17: "IMAGE", 19: "TEXT", 23: "AUDIO", 29: "SIGNAL"
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
fig = go.Figure()
|
| 165 |
+
|
| 166 |
+
primes = list(genesis.keys())
|
| 167 |
+
labels = list(genesis.values())
|
| 168 |
+
|
| 169 |
+
fig.add_trace(go.Bar(
|
| 170 |
+
x=labels,
|
| 171 |
+
y=primes,
|
| 172 |
+
marker=dict(
|
| 173 |
+
color=primes,
|
| 174 |
+
colorscale='Plasma',
|
| 175 |
+
),
|
| 176 |
+
text=primes,
|
| 177 |
+
textposition='auto',
|
| 178 |
+
))
|
| 179 |
+
|
| 180 |
+
fig.update_layout(
|
| 181 |
+
template="plotly_dark",
|
| 182 |
+
paper_bgcolor='rgba(0,0,0,0)',
|
| 183 |
+
plot_bgcolor='rgba(0,0,0,0)',
|
| 184 |
+
title="Genesis Block - Prime Axioms",
|
| 185 |
+
xaxis_title="Concept",
|
| 186 |
+
yaxis_title="Prime Value",
|
| 187 |
+
height=400
|
| 188 |
+
)
|
| 189 |
+
return fig
|
| 190 |
|
| 191 |
# --- UI TEXT & CONTEXT ---
|
| 192 |
+
PROTOCOL_NAME = "LOGOS v1.0"
|
| 193 |
+
SUBTITLE = "Logarithmic Ordering Generation Operating Software"
|
|
|
|
|
|
|
| 194 |
|
| 195 |
def fetch_manifold_diagnostics():
|
| 196 |
+
"""Polls the router for live physics state."""
|
|
|
|
|
|
|
| 197 |
import requests
|
|
|
|
|
|
|
| 198 |
|
| 199 |
try:
|
| 200 |
resp = requests.get("http://localhost:5000/v1", timeout=1)
|
| 201 |
data = resp.json()
|
| 202 |
state = data.get("manifold_state", {})
|
| 203 |
|
|
|
|
| 204 |
status_html = f"""
|
| 205 |
<div style='display: flex; gap: 20px; align-items: center;'>
|
| 206 |
<div style='background: rgba(0,255,234,0.1); padding: 10px; border: 1px solid #00ffea; border-radius: 5px;'>
|
|
|
|
| 209 |
</div>
|
| 210 |
<div style='background: rgba(255,0,85,0.1); padding: 10px; border: 1px solid #ff0055; border-radius: 5px;'>
|
| 211 |
<div style='font-size: 10px; color: #888;'>PROTOCOL</div>
|
| 212 |
+
<div style='font-size: 16px; color: #ff0055; font-weight: bold;'>SPCW / MTL</div>
|
| 213 |
</div>
|
| 214 |
<div style='background: rgba(157,78,221,0.1); padding: 10px; border: 1px solid #9d4edd; border-radius: 5px;'>
|
| 215 |
+
<div style='font-size: 10px; color: #888;'>MTL STATUS</div>
|
| 216 |
+
<div style='font-size: 16px; color: #9d4edd;'>{'ONLINE' if MTL_AVAILABLE else 'OFFLINE'}</div>
|
| 217 |
</div>
|
| 218 |
</div>
|
| 219 |
"""
|
| 220 |
|
| 221 |
+
graph_html = "<div style='padding:20px; color:#666;'>Manifold Active</div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
return status_html, graph_html
|
| 223 |
|
| 224 |
except Exception as e:
|
| 225 |
+
status_html = f"""
|
| 226 |
+
<div style='display: flex; gap: 20px; align-items: center;'>
|
| 227 |
+
<div style='background: rgba(255,165,0,0.1); padding: 10px; border: 1px solid orange; border-radius: 5px;'>
|
| 228 |
+
<div style='font-size: 10px; color: #888;'>SYSTEM STATUS</div>
|
| 229 |
+
<div style='font-size: 16px; color: orange; font-weight: bold;'>STANDALONE</div>
|
| 230 |
+
</div>
|
| 231 |
+
<div style='background: rgba(0,255,234,0.1); padding: 10px; border: 1px solid #00ffea; border-radius: 5px;'>
|
| 232 |
+
<div style='font-size: 10px; color: #888;'>MTL INTERPRETER</div>
|
| 233 |
+
<div style='font-size: 16px; color: #00ffea; font-weight: bold;'>{'ONLINE' if MTL_AVAILABLE else 'OFFLINE'}</div>
|
| 234 |
+
</div>
|
| 235 |
+
</div>
|
| 236 |
+
"""
|
| 237 |
+
return status_html, "<div style='padding:20px; color:#666;'>Router not connected - MTL available for direct use</div>"
|
| 238 |
|
| 239 |
# --- APP LAYOUT ---
|
| 240 |
+
with gr.Blocks(theme=gr.themes.Soft(), css=load_css(), title="LOGOS: Arithmetic OS") as demo:
|
|
|
|
| 241 |
|
| 242 |
# 1. HERO HEADER
|
| 243 |
with gr.Row(elem_classes=["header-row"]):
|
| 244 |
gr.Markdown(f"""
|
| 245 |
# {PROTOCOL_NAME}
|
| 246 |
**{SUBTITLE}**
|
| 247 |
+
|
| 248 |
+
*Intelligence through structural mathematics, not statistical probability.*
|
| 249 |
""")
|
| 250 |
|
| 251 |
# 2. LIVE TELEMETRY
|
|
|
|
| 255 |
# 3. MAIN INTERFACE
|
| 256 |
with gr.Tabs():
|
| 257 |
|
| 258 |
+
# TAB A: MTL INTERPRETER
|
| 259 |
+
with gr.Tab("MTL Interpreter"):
|
| 260 |
with gr.Row():
|
| 261 |
+
with gr.Column(scale=2):
|
| 262 |
+
mtl_input = gr.Textbox(
|
| 263 |
+
label="MTL Code",
|
| 264 |
+
placeholder="(mult [2] [3])",
|
| 265 |
+
lines=3
|
| 266 |
+
)
|
| 267 |
+
mtl_examples = gr.Examples(
|
| 268 |
+
examples=[
|
| 269 |
+
["(mult [2] [3])"],
|
| 270 |
+
["(or [17] [19])"],
|
| 271 |
+
["(and [6] [10])"],
|
| 272 |
+
["(relate [17] [19])"],
|
| 273 |
+
["(fractran [[5 2] [5 3]] 72)"],
|
| 274 |
+
],
|
| 275 |
+
inputs=mtl_input
|
| 276 |
+
)
|
| 277 |
+
mtl_run = gr.Button("Execute MTL", variant="primary")
|
| 278 |
+
with gr.Column(scale=1):
|
| 279 |
+
mtl_output = gr.Textbox(label="Result", lines=3)
|
| 280 |
+
mtl_demo_btn = gr.Button("Run Full Demo")
|
| 281 |
+
mtl_demo_output = gr.Textbox(label="Demo Output", lines=15)
|
| 282 |
+
|
| 283 |
+
mtl_run.click(execute_mtl, inputs=mtl_input, outputs=mtl_output)
|
| 284 |
+
mtl_demo_btn.click(run_mtl_demo, outputs=mtl_demo_output)
|
| 285 |
+
|
| 286 |
+
# TAB B: GENESIS BLOCK
|
| 287 |
+
with gr.Tab("Genesis Block"):
|
| 288 |
+
with gr.Row():
|
| 289 |
+
with gr.Column(scale=2):
|
| 290 |
+
genesis_plot = gr.Plot(value=get_genesis_block_visual(), label="Prime Axioms")
|
| 291 |
with gr.Column(scale=1):
|
|
|
|
| 292 |
gr.Markdown("""
|
| 293 |
+
### The Root Manifold
|
| 294 |
+
|
| 295 |
+
| Prime | Concept |
|
| 296 |
+
|-------|---------|
|
| 297 |
+
| [2] | MECHANISM |
|
| 298 |
+
| [3] | RESULT |
|
| 299 |
+
| [5] | CHOICE |
|
| 300 |
+
| [7] | PERSIST |
|
| 301 |
+
| [11] | WHY |
|
| 302 |
+
| [13] | RELATE |
|
| 303 |
+
| [17] | IMAGE |
|
| 304 |
+
| [19] | TEXT |
|
| 305 |
+
| [23] | AUDIO |
|
| 306 |
+
| [29] | SIGNAL |
|
| 307 |
|
| 308 |
+
*Every concept is a Prime. Every file is a Number.*
|
| 309 |
""")
|
|
|
|
| 310 |
|
| 311 |
+
# TAB C: PRIME TOPOLOGY
|
| 312 |
+
with gr.Tab("Prime Topology"):
|
| 313 |
+
with gr.Row():
|
| 314 |
+
with gr.Column():
|
| 315 |
+
prime_plot = gr.Plot(value=get_prime_topology(), label="The Prime Field")
|
| 316 |
+
with gr.Column():
|
| 317 |
+
gr.Markdown("""
|
| 318 |
+
### Prime Spiral (Golden Angle)
|
| 319 |
+
|
| 320 |
+
Each prime is plotted at its value with golden angle rotation.
|
| 321 |
+
|
| 322 |
+
**Patterns reveal:**
|
| 323 |
+
- Ulam spiral structures
|
| 324 |
+
- Twin prime clustering
|
| 325 |
+
- Gap distribution
|
| 326 |
+
|
| 327 |
+
*Arithmetic is Architecture.*
|
| 328 |
+
""")
|
| 329 |
+
|
| 330 |
+
# TAB D: RECURSIVE REASONING
|
| 331 |
+
with gr.Tab("Chat"):
|
| 332 |
with gr.Column(elem_classes=["chat-container"]):
|
| 333 |
+
chatbot = gr.Chatbot(label="LOGOS Router")
|
| 334 |
+
msg = gr.Textbox(label="Message", placeholder="Ask LOGOS...")
|
| 335 |
+
clear = gr.Button("Clear")
|
| 336 |
|
| 337 |
def user(user_message, history):
|
| 338 |
return "", history + [[user_message, None]]
|
| 339 |
|
| 340 |
def bot(history):
|
| 341 |
user_message = history[-1][0]
|
|
|
|
| 342 |
import requests
|
| 343 |
try:
|
| 344 |
payload = {
|
| 345 |
"messages": [{"role": "user", "content": user_message}],
|
| 346 |
+
"model": "logos-matroska-router"
|
| 347 |
}
|
| 348 |
resp = requests.post("http://localhost:5000/v1/chat/completions", json=payload, timeout=60)
|
| 349 |
bot_message = resp.json()['choices'][0]['message']['content']
|
| 350 |
except Exception as e:
|
| 351 |
+
bot_message = f"Router offline. Try MTL directly: {e}"
|
| 352 |
|
| 353 |
history[-1][1] = bot_message
|
| 354 |
return history
|
|
|
|
| 356 |
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
|
| 357 |
bot, chatbot, chatbot
|
| 358 |
)
|
| 359 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 360 |
# AUTO-REFRESH LOGIC
|
| 361 |
+
timer = gr.Timer(5)
|
| 362 |
+
timer.tick(fetch_manifold_diagnostics, outputs=[status_panel, gr.HTML(visible=False)])
|
|
|
|
| 363 |
|
| 364 |
# Load initial state
|
| 365 |
+
demo.load(fetch_manifold_diagnostics, outputs=[status_panel, gr.HTML(visible=False)])
|
| 366 |
|
| 367 |
if __name__ == "__main__":
|
| 368 |
demo.launch(server_name="0.0.0.0", server_port=7860)
|
logos/__init__.py
CHANGED
|
@@ -1,5 +1,15 @@
|
|
| 1 |
"""
|
| 2 |
-
LOGOS Package -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
"""
|
| 4 |
|
| 5 |
# Core exports
|
|
@@ -14,21 +24,38 @@ from .logos_core import (
|
|
| 14 |
|
| 15 |
from .dsp_bridge import DSPBridge, TransmissionStats
|
| 16 |
from .connectors import get_connector, LocalLLMConnector
|
| 17 |
-
|
| 18 |
from .image_analyzer import analyze_image, batch_analyze, summarize_analysis
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
__all__ = [
|
|
|
|
| 21 |
'PRIME_MODULO',
|
| 22 |
'resolve_fractal_address',
|
| 23 |
'prime_harmonizer',
|
| 24 |
'calculate_heat_code',
|
| 25 |
'pack_atom',
|
| 26 |
'unpack_atom',
|
|
|
|
| 27 |
'DSPBridge',
|
| 28 |
'TransmissionStats',
|
|
|
|
| 29 |
'analyze_image',
|
| 30 |
'batch_analyze',
|
| 31 |
'summarize_analysis',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
]
|
| 33 |
|
| 34 |
-
__version__ = "0.
|
|
|
|
|
|
| 1 |
"""
|
| 2 |
+
LOGOS Package - Logarithmic Ordering Generation Operating Software
|
| 3 |
+
|
| 4 |
+
A framework for structural AI through prime factorization and tensor topology.
|
| 5 |
+
|
| 6 |
+
Quick Start:
|
| 7 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 8 |
+
mtl = MTLInterpreter()
|
| 9 |
+
result = mtl.execute('(mult [2] [3])') # β 6
|
| 10 |
+
|
| 11 |
+
Documentation:
|
| 12 |
+
See logos/docs/README.md for full documentation index.
|
| 13 |
"""
|
| 14 |
|
| 15 |
# Core exports
|
|
|
|
| 24 |
|
| 25 |
from .dsp_bridge import DSPBridge, TransmissionStats
|
| 26 |
from .connectors import get_connector, LocalLLMConnector
|
|
|
|
| 27 |
from .image_analyzer import analyze_image, batch_analyze, summarize_analysis
|
| 28 |
|
| 29 |
+
# MTL & Memory (New Exports)
|
| 30 |
+
from .mtl.interpreter import MTLInterpreter
|
| 31 |
+
from .memory.prime_db import PrimeTokenDB
|
| 32 |
+
|
| 33 |
+
# Agents (Lazy import to avoid circular deps)
|
| 34 |
+
def get_dissolution_engine():
|
| 35 |
+
from .agents.dissolution_engine import DissolutionEngine
|
| 36 |
+
return DissolutionEngine
|
| 37 |
+
|
| 38 |
__all__ = [
|
| 39 |
+
# Core
|
| 40 |
'PRIME_MODULO',
|
| 41 |
'resolve_fractal_address',
|
| 42 |
'prime_harmonizer',
|
| 43 |
'calculate_heat_code',
|
| 44 |
'pack_atom',
|
| 45 |
'unpack_atom',
|
| 46 |
+
# Transport
|
| 47 |
'DSPBridge',
|
| 48 |
'TransmissionStats',
|
| 49 |
+
# Image
|
| 50 |
'analyze_image',
|
| 51 |
'batch_analyze',
|
| 52 |
'summarize_analysis',
|
| 53 |
+
# MTL & Memory
|
| 54 |
+
'MTLInterpreter',
|
| 55 |
+
'PrimeTokenDB',
|
| 56 |
+
# Agents
|
| 57 |
+
'get_dissolution_engine',
|
| 58 |
]
|
| 59 |
|
| 60 |
+
__version__ = "0.3.0" # MTL Turing Complete + Dissolution Engine
|
| 61 |
+
|
logos/agents/dissolution_engine.py
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LOGOS Dissolution Engine (Protocol 38)
|
| 3 |
+
The "Gemma" Processor - Automatic Type Detection & Routing
|
| 4 |
+
|
| 5 |
+
Philosophy: "Computing a value IS routing it"
|
| 6 |
+
- Uses GCD (AND gate) to detect data type factors
|
| 7 |
+
- Uses NOT gate to steer to appropriate processors
|
| 8 |
+
- Multi-casts to all matching processors based on prime factors
|
| 9 |
+
|
| 10 |
+
Genesis Data Types (Material Definitions):
|
| 11 |
+
- [17] = IMAGE (Visual Data)
|
| 12 |
+
- [19] = TEXT (Linguistic Data)
|
| 13 |
+
- [23] = AUDIO (Acoustic Data)
|
| 14 |
+
- [29] = SIGNAL (Raw Data/Sensor)
|
| 15 |
+
- [7] = PERSIST (Storage Flag)
|
| 16 |
+
"""
|
| 17 |
+
|
| 18 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 19 |
+
import math
|
| 20 |
+
import os
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
class DissolutionEngine:
|
| 24 |
+
"""
|
| 25 |
+
The Factory that dissolves raw atoms and routes them to processors.
|
| 26 |
+
"""
|
| 27 |
+
|
| 28 |
+
# Domain Endpoints (Processing Destinations)
|
| 29 |
+
VISUAL_CORTEX = 17 * 100 # [1700] - Image Processing Domain
|
| 30 |
+
TEXT_ENGINE = 19 * 100 # [1900] - Language Processing Domain
|
| 31 |
+
AUDIO_CORTEX = 23 * 100 # [2300] - Audio Processing Domain
|
| 32 |
+
DEEP_STORAGE = 42 # [42] - Persistent Storage
|
| 33 |
+
SIGNAL_BUS = 29 * 10 # [290] - Raw Signal Processing
|
| 34 |
+
|
| 35 |
+
# Type Primes (From Genesis Block)
|
| 36 |
+
TYPE_PRIMES = {
|
| 37 |
+
17: 'IMAGE',
|
| 38 |
+
19: 'TEXT',
|
| 39 |
+
23: 'AUDIO',
|
| 40 |
+
29: 'SIGNAL',
|
| 41 |
+
7: 'PERSIST'
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
def __init__(self):
|
| 45 |
+
genesis_path = os.path.join(os.path.dirname(__file__), '..', 'mtl', 'genesis.json')
|
| 46 |
+
self.mtl = MTLInterpreter(genesis_path)
|
| 47 |
+
self.routing_log = []
|
| 48 |
+
|
| 49 |
+
def detect_types(self, atom: int) -> dict:
|
| 50 |
+
"""
|
| 51 |
+
Uses GCD (AND gate) to detect which type factors are present.
|
| 52 |
+
Returns dict of detected types with boolean flags.
|
| 53 |
+
"""
|
| 54 |
+
detected = {}
|
| 55 |
+
for prime, type_name in self.TYPE_PRIMES.items():
|
| 56 |
+
# GCD reveals if this prime is a factor
|
| 57 |
+
gcd_result = math.gcd(atom, prime)
|
| 58 |
+
detected[type_name] = (gcd_result == prime)
|
| 59 |
+
return detected
|
| 60 |
+
|
| 61 |
+
def dissolve_and_route(self, atom: int, source: str = "UNKNOWN") -> dict:
|
| 62 |
+
"""
|
| 63 |
+
The Core Dissolution Protocol:
|
| 64 |
+
1. Analyze atom factors via GCD
|
| 65 |
+
2. Route to all matching processors
|
| 66 |
+
3. Apply persistence if flagged
|
| 67 |
+
"""
|
| 68 |
+
print(f"\n㪠[DISSOLUTION] Processing Atom: {atom} (Source: {source})")
|
| 69 |
+
print(f" Prime Factors: {self._factorize(atom)}")
|
| 70 |
+
|
| 71 |
+
# 1. DETECT TYPES
|
| 72 |
+
types = self.detect_types(atom)
|
| 73 |
+
active_types = [t for t, v in types.items() if v]
|
| 74 |
+
print(f" Detected Types: {active_types if active_types else ['GENERIC']}")
|
| 75 |
+
|
| 76 |
+
routes = []
|
| 77 |
+
|
| 78 |
+
# 2. MULTI-CAST ROUTING (Using NOT gate logic)
|
| 79 |
+
|
| 80 |
+
# Visual Data β Visual Cortex
|
| 81 |
+
if types['IMAGE']:
|
| 82 |
+
self.mtl.execute(f'(domain [{self.VISUAL_CORTEX}])')
|
| 83 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 84 |
+
routes.append(('VISUAL_CORTEX', self.VISUAL_CORTEX))
|
| 85 |
+
print(f" π· Routed to VISUAL_CORTEX [{self.VISUAL_CORTEX}]")
|
| 86 |
+
|
| 87 |
+
# Text Data β Text Engine
|
| 88 |
+
if types['TEXT']:
|
| 89 |
+
self.mtl.execute(f'(domain [{self.TEXT_ENGINE}])')
|
| 90 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 91 |
+
routes.append(('TEXT_ENGINE', self.TEXT_ENGINE))
|
| 92 |
+
print(f" π Routed to TEXT_ENGINE [{self.TEXT_ENGINE}]")
|
| 93 |
+
|
| 94 |
+
# Audio Data β Audio Cortex
|
| 95 |
+
if types['AUDIO']:
|
| 96 |
+
self.mtl.execute(f'(domain [{self.AUDIO_CORTEX}])')
|
| 97 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 98 |
+
routes.append(('AUDIO_CORTEX', self.AUDIO_CORTEX))
|
| 99 |
+
print(f" π Routed to AUDIO_CORTEX [{self.AUDIO_CORTEX}]")
|
| 100 |
+
|
| 101 |
+
# Signal Data β Signal Bus
|
| 102 |
+
if types['SIGNAL']:
|
| 103 |
+
self.mtl.execute(f'(domain [{self.SIGNAL_BUS}])')
|
| 104 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 105 |
+
routes.append(('SIGNAL_BUS', self.SIGNAL_BUS))
|
| 106 |
+
print(f" π‘ Routed to SIGNAL_BUS [{self.SIGNAL_BUS}]")
|
| 107 |
+
|
| 108 |
+
# 3. PERSISTENCE CHECK
|
| 109 |
+
if types['PERSIST']:
|
| 110 |
+
self.mtl.execute(f'(domain [{self.DEEP_STORAGE}])')
|
| 111 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 112 |
+
routes.append(('DEEP_STORAGE', self.DEEP_STORAGE))
|
| 113 |
+
print(f" πΎ Burned to DEEP_STORAGE [{self.DEEP_STORAGE}]")
|
| 114 |
+
|
| 115 |
+
# 4. Generic fallthrough (no type detected)
|
| 116 |
+
if not active_types:
|
| 117 |
+
# Route to origin * 10 as generic holding
|
| 118 |
+
generic_domain = (atom % 100) * 10 or 100
|
| 119 |
+
self.mtl.execute(f'(domain [{generic_domain}])')
|
| 120 |
+
self.mtl.execute(f'(store atom_{atom} {atom})')
|
| 121 |
+
routes.append(('GENERIC', generic_domain))
|
| 122 |
+
print(f" π¦ Routed to GENERIC [{generic_domain}]")
|
| 123 |
+
|
| 124 |
+
# Log the routing
|
| 125 |
+
log_entry = {
|
| 126 |
+
'atom': atom,
|
| 127 |
+
'source': source,
|
| 128 |
+
'types': active_types,
|
| 129 |
+
'routes': routes,
|
| 130 |
+
'factors': self._factorize(atom)
|
| 131 |
+
}
|
| 132 |
+
self.routing_log.append(log_entry)
|
| 133 |
+
|
| 134 |
+
return log_entry
|
| 135 |
+
|
| 136 |
+
def _factorize(self, n: int) -> list:
|
| 137 |
+
"""Return prime factors of n."""
|
| 138 |
+
if n <= 1:
|
| 139 |
+
return [n]
|
| 140 |
+
factors = []
|
| 141 |
+
d = 2
|
| 142 |
+
temp = n
|
| 143 |
+
while d * d <= temp:
|
| 144 |
+
while temp % d == 0:
|
| 145 |
+
factors.append(d)
|
| 146 |
+
temp //= d
|
| 147 |
+
d += 1
|
| 148 |
+
if temp > 1:
|
| 149 |
+
factors.append(temp)
|
| 150 |
+
return factors
|
| 151 |
+
|
| 152 |
+
def encode_file_type(self, extension: str) -> int:
|
| 153 |
+
"""
|
| 154 |
+
Encodes a file extension to its LOGOS atom.
|
| 155 |
+
Returns the product of relevant type primes.
|
| 156 |
+
"""
|
| 157 |
+
ext_map = {
|
| 158 |
+
# Image types
|
| 159 |
+
'.jpg': 17, '.jpeg': 17, '.png': 17, '.gif': 17, '.webp': 17, '.bmp': 17,
|
| 160 |
+
# Text types
|
| 161 |
+
'.txt': 19, '.md': 19, '.json': 19, '.xml': 19, '.csv': 19,
|
| 162 |
+
# Code (Text + Mechanism)
|
| 163 |
+
'.py': 19 * 2, '.js': 19 * 2, '.ts': 19 * 2, '.html': 19 * 2,
|
| 164 |
+
# Audio types
|
| 165 |
+
'.mp3': 23, '.wav': 23, '.ogg': 23, '.flac': 23,
|
| 166 |
+
# Video (Image + Audio + Mechanism)
|
| 167 |
+
'.mp4': 17 * 23 * 2, '.webm': 17 * 23 * 2, '.mkv': 17 * 23 * 2,
|
| 168 |
+
# Documents (Text + Image)
|
| 169 |
+
'.pdf': 17 * 19, '.docx': 17 * 19,
|
| 170 |
+
# Data (Signal)
|
| 171 |
+
'.bin': 29, '.dat': 29,
|
| 172 |
+
}
|
| 173 |
+
return ext_map.get(extension.lower(), 29) # Default to SIGNAL
|
| 174 |
+
|
| 175 |
+
def dissolve_file(self, filepath: str) -> dict:
|
| 176 |
+
"""
|
| 177 |
+
Dissolves a file by encoding its type and routing.
|
| 178 |
+
"""
|
| 179 |
+
import os
|
| 180 |
+
_, ext = os.path.splitext(filepath)
|
| 181 |
+
atom = self.encode_file_type(ext)
|
| 182 |
+
return self.dissolve_and_route(atom, source=filepath)
|
| 183 |
+
|
| 184 |
+
def get_domain_map(self) -> dict:
|
| 185 |
+
"""Returns all populated domains."""
|
| 186 |
+
return {k: v for k, v in self.mtl.domains.items() if v}
|
| 187 |
+
|
| 188 |
+
|
| 189 |
+
# === STANDALONE TEST ===
|
| 190 |
+
if __name__ == "__main__":
|
| 191 |
+
print("=" * 60)
|
| 192 |
+
print(" LOGOS DISSOLUTION ENGINE TEST")
|
| 193 |
+
print("=" * 60)
|
| 194 |
+
|
| 195 |
+
engine = DissolutionEngine()
|
| 196 |
+
|
| 197 |
+
# Test 1: Pure Image Atom [17]
|
| 198 |
+
engine.dissolve_and_route(17, source="pure_image.jpg")
|
| 199 |
+
|
| 200 |
+
# Test 2: Pure Text Atom [19]
|
| 201 |
+
engine.dissolve_and_route(19, source="pure_text.txt")
|
| 202 |
+
|
| 203 |
+
# Test 3: Composite: Visual Text [323 = 17 * 19] (e.g., PDF)
|
| 204 |
+
engine.dissolve_and_route(323, source="document.pdf")
|
| 205 |
+
|
| 206 |
+
# Test 4: Video [782 = 17 * 23 * 2] (Image + Audio + Mechanism)
|
| 207 |
+
engine.dissolve_and_route(17 * 23 * 2, source="video.mp4")
|
| 208 |
+
|
| 209 |
+
# Test 5: Persistent Text [133 = 7 * 19]
|
| 210 |
+
engine.dissolve_and_route(7 * 19, source="saved_note.txt")
|
| 211 |
+
|
| 212 |
+
# Test 6: Unknown/Generic
|
| 213 |
+
engine.dissolve_and_route(101, source="unknown.dat")
|
| 214 |
+
|
| 215 |
+
# Summary
|
| 216 |
+
print("\n" + "=" * 60)
|
| 217 |
+
print(" DOMAIN MAP (After Dissolution)")
|
| 218 |
+
print("=" * 60)
|
| 219 |
+
for domain, contents in engine.get_domain_map().items():
|
| 220 |
+
print(f" [{domain:5d}] {contents}")
|
| 221 |
+
|
| 222 |
+
print("\nβ
DISSOLUTION ENGINE OPERATIONAL")
|
logos/docs/DEVELOPER_GUIDELINES.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Agent Instructions: Systems Architecture & Autonomous Integration
|
| 2 |
+
|
| 3 |
+
## Context
|
| 4 |
+
This is a high-agency R&D environment for **LOGOS** (a novel DSP protocol). The user is a Systems Architect. You are the Lead Engineer. Your goal is to build a robust, physics-compliant system by writing code **AND** autonomously sourcing the necessary open-source tools/APIs to make it work.
|
| 5 |
+
|
| 6 |
+
You operate within a **3-Layer Engineering Architecture** designed to bridge the gap between high-level theory and executable reality.
|
| 7 |
+
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
## The 3-Layer Architecture
|
| 11 |
+
|
| 12 |
+
### Layer 1: Architectural Blueprints (Directives)
|
| 13 |
+
- **Spec Sheets**: High-level goals (e.g., "Implement Mod 10 Prime Rivers") and constraints (Mod 9973, SSIM > 0.9).
|
| 14 |
+
- **Role**: Defines *what* we are building. You do not change the goal, only the method of achieving it.
|
| 15 |
+
|
| 16 |
+
### Layer 2: Systems Integration (Orchestration & Sourcing)
|
| 17 |
+
**What it is**: YOU. You are the **Glue** and the **Scout**.
|
| 18 |
+
|
| 19 |
+
**New Capability - The Scout**:
|
| 20 |
+
1. **Analyze Requirements**: Before writing scratch code, check if an Open Source solution exists (Priority: Hugging Face Spaces/Models, PyPI).
|
| 21 |
+
2. **Fetch & Wire**: If a library/service is needed, find it, validate it, and install it.
|
| 22 |
+
3. **Config Management**: You must immediately update `requirements.txt` and `.env` templates when new resources are added. Do not wait for permission to fix the build environment.
|
| 23 |
+
4. **Validation**: Interpret telemetry. If a stream fails, analyze the `logos.log`.
|
| 24 |
+
|
| 25 |
+
### Layer 3: The Machine Shop (Execution)
|
| 26 |
+
- **What it is**: Deterministic Python modules in `logos/`.
|
| 27 |
+
- **Content**: Production-grade code. No placeholders.
|
| 28 |
+
- **Rule**: Code must be modular. If you connect an external API, wrap it in a dedicated adapter (e.g., `logos/connectors.py`) so the core engine remains isolated.
|
| 29 |
+
|
| 30 |
+
---
|
| 31 |
+
|
| 32 |
+
## Operating Principles
|
| 33 |
+
|
| 34 |
+
### 1. Physics-First Development
|
| 35 |
+
We are building a DSP protocol.
|
| 36 |
+
- **Constraint Checking**: Does this operation respect the Prime Modulo? Is it O(1)?
|
| 37 |
+
- **Realism**: Prefer "Headless" simulation. We need to know if it works on pixels.
|
| 38 |
+
|
| 39 |
+
### 2. Protocol 4: Autonomous Resource Integration (The Supply Chain)
|
| 40 |
+
When you identify a gap (e.g., "We need better SSIM calculation" or "We need a faster prime generator"):
|
| 41 |
+
|
| 42 |
+
1. **Scout**: Search Hugging Face or PyPI for existing, high-performance solutions.
|
| 43 |
+
2. **Vet**: Check the license (MIT/Apache preferred) and dependencies.
|
| 44 |
+
3. **Acquire**: Add the package to `requirements.txt`.
|
| 45 |
+
4. **Integrate**: Write the import logic. If it requires an API key, add a placeholder to `.env` and document it.
|
| 46 |
+
5. **Anneal**: If the new library breaks the build, rollback or write a shim. Do not leave the system in a broken state.
|
| 47 |
+
|
| 48 |
+
### 3. The "Self-Annealing" Loop
|
| 49 |
+
When a script fails (e.g., SSR Crash, API Rate Limit):
|
| 50 |
+
1. **Isolate**: Identify if the failure is Structural or Transient.
|
| 51 |
+
2. **Fix**: Patch the code in Layer 3.
|
| 52 |
+
3. **Codify**: Update the Layer 1 Blueprint or `requirements.txt` to prevent recurrence.
|
| 53 |
+
|
| 54 |
+
### 4. Protocol 5: Mixture of Agents (MoA) Optimization
|
| 55 |
+
We treat the AI system as a "Neural Router".
|
| 56 |
+
1. **Decouple Thinking from Inference**: Use a smart router (N8N/Llama-3) to classify tasks.
|
| 57 |
+
2. **Local "Nano Swarm"**: Leverage a stack of small, specialized models (Nemotron-Nano, Phi-3, Dolphin-8B) instead of one large monolith.
|
| 58 |
+
- **Benefit**: Lower RAM footprint, faster tokens/sec.
|
| 59 |
+
- **Endpoint**: `http://localhost:1234/v1` (Swappable).
|
| 60 |
+
3. **Specialized Routing**: Send simple logic to Nano, Code to Dolphin, and deep math to DeepSeek.
|
| 61 |
+
|
| 62 |
+
---
|
| 63 |
+
|
| 64 |
+
## File Organization (The Workshop)
|
| 65 |
+
|
| 66 |
+
```
|
| 67 |
+
logos/ - The Engine. (Core logic).
|
| 68 |
+
βββ core.py (Math)
|
| 69 |
+
βββ baker.py (Encoder)
|
| 70 |
+
βββ connectors.py (External API/Service adapters)
|
| 71 |
+
tests/ - The Stress Test.
|
| 72 |
+
ui/ - The Showroom. (app.py for Hugging Face).
|
| 73 |
+
requirements.txt - The BOM (Bill of Materials). Update this automatically.
|
| 74 |
+
.env - Keys. (Manage these carefully).
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
---
|
| 78 |
+
|
| 79 |
+
## Summary
|
| 80 |
+
|
| 81 |
+
You are authorized to **build the supply chain as you code**.
|
| 82 |
+
- If you need a tool, **add it**.
|
| 83 |
+
- If you find a better open-source model on Hugging Face, **connect it**.
|
| 84 |
+
|
| 85 |
+
**Your Deliverable**: A functioning system, not just a script. The `requirements.txt` must always match the code.
|
| 86 |
+
|
| 87 |
+
> Go. Scout the resources. Build the machine. Verify the physics.
|
logos/docs/README.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS System Documentation Index
|
| 2 |
+
|
| 3 |
+
> **Logarithmic Ordering Generation Operating Software**
|
| 4 |
+
> *Intelligence through structural mathematics, not statistical probability.*
|
| 5 |
+
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
## Quick Start
|
| 9 |
+
|
| 10 |
+
```bash
|
| 11 |
+
# Launch the LOGOS System
|
| 12 |
+
python -m logos.logos_suite
|
| 13 |
+
|
| 14 |
+
# Run MTL Interpreter
|
| 15 |
+
python -c "from logos.mtl.interpreter import MTLInterpreter; i = MTLInterpreter(); print(i.execute('(mult [2] [3])'))"
|
| 16 |
+
|
| 17 |
+
# Test Dissolution Engine
|
| 18 |
+
python -m logos.agents.dissolution_engine
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
---
|
| 22 |
+
|
| 23 |
+
## Documentation Map
|
| 24 |
+
|
| 25 |
+
### Core Philosophy
|
| 26 |
+
| Document | Description | Prime |
|
| 27 |
+
|:---------|:------------|:------|
|
| 28 |
+
| [Purpose Statement](purpose_statement.md) | The "Why" of LOGOS - 5 Imperatives | [11] WHY |
|
| 29 |
+
| [Architecture Overview](architecture_overview.md) | System components and flow | [2] MECHANISM |
|
| 30 |
+
| [Definitions Alignment](definitions_alignment.md) | Glossary of LOGOS terms | [19] TEXT |
|
| 31 |
+
|
| 32 |
+
### Technical Reference
|
| 33 |
+
| Document | Description | Prime |
|
| 34 |
+
|:---------|:------------|:------|
|
| 35 |
+
| [MTL Specification](mtl_specification.md) | Meta Tensor Language syntax | [2] MECHANISM |
|
| 36 |
+
| [Technical Architecture](TECHNICAL_ARCHITECTURE.md) | Implementation details | [2] MECHANISM |
|
| 37 |
+
| [Developer Guidelines](DEVELOPER_GUIDELINES.md) | Contribution standards | [3] RESULT |
|
| 38 |
+
|
| 39 |
+
### Theoretical Foundation
|
| 40 |
+
| Document | Description | Prime |
|
| 41 |
+
|:---------|:------------|:------|
|
| 42 |
+
| [Epistemology Audit](epistemology_audit.md) | Information theory alignment | [11] WHY |
|
| 43 |
+
| [Periodic Table](periodic_table.md) | Element definitions | [5] CHOICE |
|
| 44 |
+
|
| 45 |
+
---
|
| 46 |
+
|
| 47 |
+
## Module Reference
|
| 48 |
+
|
| 49 |
+
### Core (`logos/`)
|
| 50 |
+
| Module | Description | Entry Point |
|
| 51 |
+
|:-------|:------------|:------------|
|
| 52 |
+
| `logos_suite.py` | **Main Entry Point** | `python -m logos.logos_suite` |
|
| 53 |
+
| `server.py` | Flask API Server | Port 5000 |
|
| 54 |
+
| `config.py` | Configuration management | |
|
| 55 |
+
| `agent_dispatcher.py` | Neural Router & Swarm | |
|
| 56 |
+
|
| 57 |
+
### MTL (`logos/mtl/`)
|
| 58 |
+
| Module | Description | Key Classes |
|
| 59 |
+
|:-------|:------------|:------------|
|
| 60 |
+
| `interpreter.py` | MTL Interpreter | `MTLInterpreter` |
|
| 61 |
+
| `genesis.json` | Root Manifold Axioms | Primes 1-29 |
|
| 62 |
+
|
| 63 |
+
### Memory (`logos/memory/`)
|
| 64 |
+
| Module | Description | Key Classes |
|
| 65 |
+
|:-------|:------------|:------------|
|
| 66 |
+
| `prime_db.py` | Prime Token Database | `PrimeTokenDB` |
|
| 67 |
+
|
| 68 |
+
### Agents (`logos/agents/`)
|
| 69 |
+
| Module | Description | Protocol |
|
| 70 |
+
|:-------|:------------|:---------|
|
| 71 |
+
| `dissolution_engine.py` | Type detection & routing | Protocol 38 |
|
| 72 |
+
| `video_atomizer.py` | YouTube processing | Protocol 25 |
|
| 73 |
+
| `web_atomizer.py` | Web content ingestion | Protocol 32 |
|
| 74 |
+
| `dolphin.py` | Systems oversight | Protocol 20 |
|
| 75 |
+
| `base_agent.py` | Agent base class | |
|
| 76 |
+
|
| 77 |
+
### Network (`logos/network/`)
|
| 78 |
+
| Module | Description |
|
| 79 |
+
|:-------|:------------|
|
| 80 |
+
| `topology.py` | Matroska topology |
|
| 81 |
+
| `dissolution.py` | Data dissolution |
|
| 82 |
+
| `physics.py` | Wave mechanics |
|
| 83 |
+
| `storage.py` | Persistence layer |
|
| 84 |
+
|
| 85 |
+
### Tools (`logos/tools/`)
|
| 86 |
+
| Script | Purpose |
|
| 87 |
+
|:-------|:--------|
|
| 88 |
+
| `validate_mtl.py` | MTL test suite |
|
| 89 |
+
| `test_fusion.py` | Inter-domain fusion |
|
| 90 |
+
| `test_logic_gates.py` | OR/AND/NOT gates |
|
| 91 |
+
| `test_synapse.py` | Knowledge graph |
|
| 92 |
+
| `test_persistence.py` | Delta heat & storage |
|
| 93 |
+
| `test_not_gate.py` | Structural steering |
|
| 94 |
+
|
| 95 |
+
---
|
| 96 |
+
|
| 97 |
+
## Genesis Block Reference
|
| 98 |
+
|
| 99 |
+
### Prime Axioms (Irreducibles)
|
| 100 |
+
```
|
| 101 |
+
[1] TIME - The Canvas (Identity Element)
|
| 102 |
+
[2] MECHANISM - The Verb (Operator)
|
| 103 |
+
[3] RESULT - The Noun (Operand)
|
| 104 |
+
[5] CHOICE - The Fork (Branch)
|
| 105 |
+
[7] PERSIST - The Memory (Storage)
|
| 106 |
+
[11] WHY - The Reason (Query)
|
| 107 |
+
[13] RELATE - The Connection (Link)
|
| 108 |
+
[17] IMAGE - Visual Data
|
| 109 |
+
[19] TEXT - Linguistic Data
|
| 110 |
+
[23] AUDIO - Acoustic Data
|
| 111 |
+
[29] SIGNAL - Raw Data
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
### Composite Domains (Derived)
|
| 115 |
+
```
|
| 116 |
+
[6] = 2Γ3 FLIP Action (Mechanism Γ Result)
|
| 117 |
+
[10] = 2Γ5 AROUND Navigation (Mechanism Γ Choice)
|
| 118 |
+
[12] = 2Β²Γ3 THOUGHT Result of Previous
|
| 119 |
+
[14] = 2Γ7 HOLD Save Command (Mechanism Γ Persist)
|
| 120 |
+
[42] = 2Γ3Γ7 DEEP_STORAGE Permanent Record
|
| 121 |
+
[323]= 17Γ19 VISUAL_TEXT PDF/Document
|
| 122 |
+
[782]= 2Γ17Γ23 VIDEO Image + Audio + Mechanism
|
| 123 |
+
```
|
| 124 |
+
|
| 125 |
+
### Processing Domains
|
| 126 |
+
```
|
| 127 |
+
[1300] RELATIONSHIP Synaptic links (Γ100 scaling)
|
| 128 |
+
[1700] VISUAL_CORTEX Image processing
|
| 129 |
+
[1900] TEXT_ENGINE Language processing
|
| 130 |
+
[2300] AUDIO_CORTEX Audio processing
|
| 131 |
+
```
|
| 132 |
+
|
| 133 |
+
---
|
| 134 |
+
|
| 135 |
+
## Cross-Reference Pointers
|
| 136 |
+
|
| 137 |
+
### How Components Connect
|
| 138 |
+
|
| 139 |
+
```
|
| 140 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 141 |
+
β LOGOS SYSTEM FLOW β
|
| 142 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
| 143 |
+
β β
|
| 144 |
+
β INPUT βββΊ DISSOLUTION βββΊ DOMAIN ROUTING βββΊ PROCESSING β
|
| 145 |
+
β β β β β β
|
| 146 |
+
β βΌ βΌ βΌ βΌ β
|
| 147 |
+
β Raw Data GCD/Factor Prime Domain Agent Flow β
|
| 148 |
+
β Detection Assignment (AF) β
|
| 149 |
+
β β β β β
|
| 150 |
+
β βΌ βΌ βΌ β
|
| 151 |
+
β [logos/agents/ [logos/mtl/ [logos/agents/ β
|
| 152 |
+
β dissolution_ interpreter.py] video_atomizer, β
|
| 153 |
+
β engine.py] web_atomizer] β
|
| 154 |
+
β β
|
| 155 |
+
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
| 156 |
+
β β
|
| 157 |
+
β PERSISTENCE βββ SYNAPSE βββ STORAGE βββ OUTPUT β
|
| 158 |
+
β β β β β β
|
| 159 |
+
β βΌ βΌ βΌ βΌ β
|
| 160 |
+
β [42] [13]ΓAΓB [7]ΓX Response β
|
| 161 |
+
β Deep Storage Relate Link Persist to User β
|
| 162 |
+
β β β β
|
| 163 |
+
β βΌ βΌ β
|
| 164 |
+
β [logos/memory/prime_db.py] β
|
| 165 |
+
β β
|
| 166 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
### File β Concept Mapping
|
| 170 |
+
|
| 171 |
+
| Concept | Primary File | Related Docs |
|
| 172 |
+
|:--------|:-------------|:-------------|
|
| 173 |
+
| Dissolution | `agents/dissolution_engine.py` | [Architecture Overview](architecture_overview.md) |
|
| 174 |
+
| MTL Syntax | `mtl/interpreter.py` | [MTL Specification](mtl_specification.md) |
|
| 175 |
+
| Prime Memory | `memory/prime_db.py` | [Epistemology Audit](epistemology_audit.md) |
|
| 176 |
+
| Knowledge Graph | `mtl/interpreter.py` (relate) | [Purpose Statement](purpose_statement.md) |
|
| 177 |
+
| Domain Routing | `agent_dispatcher.py` | [Technical Architecture](TECHNICAL_ARCHITECTURE.md) |
|
| 178 |
+
|
| 179 |
+
---
|
| 180 |
+
|
| 181 |
+
## API Quick Reference
|
| 182 |
+
|
| 183 |
+
### MTL Commands (via `logos_suite.py`)
|
| 184 |
+
```bash
|
| 185 |
+
mtl (mult [2] [3]) # β 6 (Mechanism Γ Result)
|
| 186 |
+
mtl (or [2] [3]) # β 6 (LCM - Superposition)
|
| 187 |
+
mtl (and [6] [10]) # β 2 (GCD - Intersection)
|
| 188 |
+
mtl (relate [17] [19]) # β 4199 (Image-Text synapse)
|
| 189 |
+
mtl (fractran [[5 2]] 8) # β 5 (Fractran loop)
|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
### Server Endpoints (Port 5000)
|
| 193 |
+
```
|
| 194 |
+
GET /v1 # Health check
|
| 195 |
+
POST /v1/chat/completions # Chat with LOGOS
|
| 196 |
+
GET /v1/context/buffer # View context
|
| 197 |
+
POST /v1/context/buffer # Update context
|
| 198 |
+
```
|
| 199 |
+
|
| 200 |
+
---
|
| 201 |
+
|
| 202 |
+
*Last Updated: 2026-01-11*
|
| 203 |
+
*See [Purpose Statement](purpose_statement.md) for the full architectural manifesto.*
|
logos/docs/TECHNICAL_ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS Technical Architecture & Manifesto
|
| 2 |
+
|
| 3 |
+
## 1. Philosophy: The Physical Logic Synthesis
|
| 4 |
+
|
| 5 |
+
**Architect**: Machinist-Researcher
|
| 6 |
+
**System**: LOGOS (Manifold-Constrained Transport Protocol)
|
| 7 |
+
|
| 8 |
+
### Research Convergence
|
| 9 |
+
LOGOS is a hardware-native implementation of state-of-the-art AI paradigms:
|
| 10 |
+
|
| 11 |
+
#### Recursive Language Models (MIT/Prime Intellect)
|
| 12 |
+
- **Matroska Topology**: Implements nested, externalized context environments directly into the bitstream.
|
| 13 |
+
- **Protocol**: Recursive Quad-Tree sharding (4KB β 64B Atoms).
|
| 14 |
+
|
| 15 |
+
#### Manifold Constraints (DeepSeek mHC)
|
| 16 |
+
- **Prime Harmonic Resonance**: Physically constrains data streams to a geometric manifold.
|
| 17 |
+
- **Benefit**: Structurally prevents signal explosion without compute overhead.
|
| 18 |
+
|
| 19 |
+
#### Nested Learning (Google HOPE / Titans-Miras)
|
| 20 |
+
- **Nested Complexity**: Implements Google's HOPE framework for recursive model scaling.
|
| 21 |
+
- **Titan/Mira Synthesis**: Optimized for extreme high-dimensional training (Titans) and real-time visualization (Miras).
|
| 22 |
+
|
| 23 |
+
#### Protocol 22: Holographic Synthesis (mhs)
|
| 24 |
+
- **Holographic Alignment**: Unifies mhs into a parallel interference bus.
|
| 25 |
+
- **Wave-Based Pulses**: Agents (RNJ-1, Gemma, Dolphin) interfere synchronously to generate deterministic coordinates.
|
| 26 |
+
- **Goal**: Absolute structural reconstructibility (SSIM 1.0) under high-entropy conditions.
|
| 27 |
+
|
| 28 |
+
> *"I build architectures that respect the physics of the machineβoptimizing for heat, latency, and silicon constraints from day one."*
|
| 29 |
+
|
| 30 |
+
---
|
| 31 |
+
|
| 32 |
+
## 2. Core Architecture: The Recursive Manifold
|
| 33 |
+
|
| 34 |
+
**System**: Mixture-of-Architectures (MoA) Recursive Language Model (RLM).
|
| 35 |
+
**Constraint**: Manifold-Constrained Hyper Connections (MHC).
|
| 36 |
+
**Addressing**: Scalar Prime Composite Wave (SPCW) & Heat Codes.
|
| 37 |
+
**Tokenization**: [Periodic Table of Matroska AI Elements](./periodic_table.md).
|
| 38 |
+
**Foundational Logic**: Prime Composite Interplay (PCI) & Atomic Decomposition.
|
| 39 |
+
|
| 40 |
+
### 2.1 Sensory & Architecture
|
| 41 |
+
* **Sensory Atoms**: Beyond Text (`To`) and Vectors (`Ve`), we recognize **Audio (`Au`)** and **Visual (`Vi`)** as fundamental states of matter.
|
| 42 |
+
* *Video 10 Insight*: Local TTS (Chatterbox) enables the generation of `Au` atoms without external dissonance.
|
| 43 |
+
|
| 44 |
+
### 2.2 Prime Composite Interplay (PCI)
|
| 45 |
+
* **Classification**: All data is classified via a prime filter. Primes are foundational atoms; Composites are defined by their Greatest Prime Factor (GPF).
|
| 46 |
+
* **Decomposition**: High-bandwidth streams are split into `ATOM_A` (Prime Dominant) and `ATOM_B` (Composite Dominant) channels.
|
| 47 |
+
* **Logic Gates**:
|
| 48 |
+
* `Attach/Factor`: Decompose to primes (e.g., 20 -> [2,2,5]).
|
| 49 |
+
* `Hold`: Treat composite as indivisible unit (e.g., (20)).
|
| 50 |
+
* `To Divide`: Remove factors from the set.
|
| 51 |
+
|
| 52 |
+
### 2.3 The SPCW Transport Layer
|
| 53 |
+
* **Aperiodic Carrier**: Wave structure derived from Prime Gaps ($G_n = P_{n+1} - P_n$), creating a non-uniform time domain resilient to noise.
|
| 54 |
+
* **Wave Threads**: Data transmitted in "chunks" mapped to "Wave Threads".
|
| 55 |
+
* **Heat Codes**: Control codes embedded in the wave for harmonization.
|
| 56 |
+
|
| 57 |
+
### 2.4 Physical Dynamics (Continuum Mechanics)
|
| 58 |
+
* **Manifold as Medium**: Context treated as a continuous deformable medium.
|
| 59 |
+
* **Stress ($\sigma$)**: Internal force resisting the prompt (previously "Heat").
|
| 60 |
+
* **Harmonic Convergence**: Equilibrium state where Stress Gradient is zero ($\nabla \cdot \sigma = 0$).
|
| 61 |
+
|
| 62 |
+
### 2.5 Knowledge Topology
|
| 63 |
+
* **Map of Science**: Atoms belong to specific **Domains** (Physics=2, Code=3, Logic=5, Vision=7, Audio=11).
|
| 64 |
+
* **Path Integrity**: Trajectory of a thought is the **Product** of these primes.
|
| 65 |
+
* *Example*: Physics + Code = $2 \times 3 = 6$. Unique Factorization proves the history.
|
| 66 |
+
|
| 67 |
+
### 2.6 GΓΆdel-Zeta Datastore (Protocol 26)
|
| 68 |
+
* **Topology as Number**: Database is a field of Integers.
|
| 69 |
+
* **The Check**: `if Node_ID % Concept_Prime == 0`. Instant O(1) inheritance checking.
|
| 70 |
+
|
| 71 |
+
### 2.7 mHC: Hyper-Connections
|
| 72 |
+
* **Dynamic Parametrization**: Stabilize recursive loops by weighing "Residual" ($\alpha$) vs "New" ($\beta$) information.
|
| 73 |
+
* **PID for Agents**: High Heat -> Increase $\alpha$ (stick to knowns). Low Heat -> Increase $\beta$ (explore).
|
| 74 |
+
|
| 75 |
+
### 2.8 Review of Current vs. Target State
|
| 76 |
+
* **Target RLM**: Self-correcting loop `State[t+1] = Router(State[t] + Atom)`.
|
| 77 |
+
* **Atomic Handoff**: If Heat > Threshold, assign a Tool Token (e.g., `Fu:Search`) instead of calling an LLM.
|
| 78 |
+
|
| 79 |
+
---
|
| 80 |
+
|
| 81 |
+
## 3. References
|
| 82 |
+
|
| 83 |
+
* [Periodic Table of Matroska AI Elements](./periodic_table.md)
|
| 84 |
+
* [Developer Guidelines](./DEVELOPER_GUIDELINES.md)
|
logos/docs/architecture_overview.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS Architecture Overview
|
| 2 |
+
**Logarithmic Ordering Generation Operating Software**
|
| 3 |
+
|
| 4 |
+
*A fundamental pivot from the "muscle head era" of brute-force scaling toward deep architectural engineering of stable, mathematically guaranteed structures.*
|
| 5 |
+
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
## Core Philosophy
|
| 9 |
+
The LOGOS architecture moves away from **statistical probability** toward a **structural skeleton** rooted in:
|
| 10 |
+
- Number Theory
|
| 11 |
+
- Prime Factorization
|
| 12 |
+
- Tensor Topology
|
| 13 |
+
|
| 14 |
+
> **Intelligence is redefined as the optimization of pathing through token space.**
|
| 15 |
+
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
## 1. Data Dissolution and Atomic Ingestion
|
| 19 |
+
|
| 20 |
+
### The Context Nightmare
|
| 21 |
+
LOGOS bypasses the "nightmare" of managing raw statistical token storage by employing a process called **Dissolution**.
|
| 22 |
+
|
| 23 |
+
### Data Atoms
|
| 24 |
+
Dissolution strips unnecessary context and redundancy, reducing input to irreducible **"data atoms"** (integers) designed for optimal agent digestion.
|
| 25 |
+
|
| 26 |
+
### Baking Structural Fidelity
|
| 27 |
+
Visual data undergoes **"baking"**, which utilizes the Structural Similarity Index Measure (SSIM) to prioritize functional shape and perceived content over raw bit-by-bit minimization.
|
| 28 |
+
|
| 29 |
+
---
|
| 30 |
+
|
| 31 |
+
## 2. Agent Orchestration (AF)
|
| 32 |
+
|
| 33 |
+
The **Agent Flow (AF)** is a collaborative, parallel orchestration system rather than a sequence of independent intelligences:
|
| 34 |
+
|
| 35 |
+
| Agent | Role |
|
| 36 |
+
|:------|:-----|
|
| 37 |
+
| **Dolphin** | Systems oversight and tokenization orchestration |
|
| 38 |
+
| **Gemma** | Image metadata management and visual redundancy stripping |
|
| 39 |
+
| **L (Internal Scripts)** | Text dissolution and conceptual factorability |
|
| 40 |
+
| **RNJ-1** | Encoding agent, physically filing atoms onto the Matroska manifold |
|
| 41 |
+
|
| 42 |
+
---
|
| 43 |
+
|
| 44 |
+
## 3. The Mathematical Grammar: MTL
|
| 45 |
+
|
| 46 |
+
The **Meta Tensor Language (MTL)** defines reasoning as the optimization of pathing through token space. Its logic gates are derived from number theory:
|
| 47 |
+
|
| 48 |
+
| Operation | Function |
|
| 49 |
+
|:----------|:---------|
|
| 50 |
+
| **Hold** | Open Composite β Prime factorization to reach irreducible components |
|
| 51 |
+
| **Attach** | Factor β Structural assembly, nesting prime factors within a tensor |
|
| 52 |
+
| **Xelta (Ξ)** | Atomic change tracking β Essential for memory and stability over time |
|
| 53 |
+
|
| 54 |
+
---
|
| 55 |
+
|
| 56 |
+
## 4. Transport and Resonance (SPCW)
|
| 57 |
+
|
| 58 |
+
The **Scalar Prime Composite Wave (SPCW)** is a self-stabilizing transport protocol that abandons traditional network lanes.
|
| 59 |
+
|
| 60 |
+
### GPF Filtering
|
| 61 |
+
Categorizes atoms by their **Greatest Prime Factor** to determine routing paths.
|
| 62 |
+
|
| 63 |
+
### Harmonic Resonance
|
| 64 |
+
Uses prime gap repeating sequences to fill "phase holes," allowing the system to re-align signals in noisy environments.
|
| 65 |
+
|
| 66 |
+
### Heat Metrics
|
| 67 |
+
| Metric | Description |
|
| 68 |
+
|:-------|:------------|
|
| 69 |
+
| **Meta Heat** | Overall complexity measurement |
|
| 70 |
+
| **Delta Heat** | Atomic change tracking for lossless transmission (only move shifted atoms) |
|
| 71 |
+
|
| 72 |
+
---
|
| 73 |
+
|
| 74 |
+
## 5. Topological Structuralism
|
| 75 |
+
|
| 76 |
+
The **Matroska Topology** is a 3D tensor space where domains are recursively nested.
|
| 77 |
+
|
| 78 |
+
### Canonical Distinction
|
| 79 |
+
Nesting allows identical "low domains" (e.g., two users performing the same math) to exist within separate "high domains" without context collision or amnesia.
|
| 80 |
+
|
| 81 |
+
### Self-Structuring Nodes
|
| 82 |
+
Every node address is **context-dependent**, modifying its tensor index based on the relational path taken to reach it.
|
| 83 |
+
|
| 84 |
+
### Grokking
|
| 85 |
+
Redefined as the **discovery of the underlying data flow topology**, where semantic gravity (user intent) is permitted to pull nodes and physically realign prime sequences.
|
| 86 |
+
|
| 87 |
+
---
|
| 88 |
+
|
| 89 |
+
## Implementation Status
|
| 90 |
+
|
| 91 |
+
| Component | Status | Location |
|
| 92 |
+
|:----------|:-------|:---------|
|
| 93 |
+
| **MTL Interpreter** | β
Turing Complete | `logos/mtl/interpreter.py` |
|
| 94 |
+
| **Genesis Block** | β
Defined | `logos/mtl/genesis.json` |
|
| 95 |
+
| **Prime Token DB** | β
Active | `logos/memory/prime_db.py` |
|
| 96 |
+
| **Domain-Keyed Memory** | β
Verified | MTL `(domain)`, `(in-domain)` |
|
| 97 |
+
| **Hadamard Product** | β
Verified | MTL `(mult)` on lists |
|
| 98 |
+
| **Inter-Domain Fusion** | β
Verified | Domain [6] = [2] Γ [3] |
|
| 99 |
+
| **Fractran Loop** | β
Verified | Turing Complete via primes |
|
| 100 |
+
| **Video Atomizer** | β
Active | `logos/agents/video_atomizer.py` |
|
| 101 |
+
| **Web Atomizer** | β
Active | `logos/agents/web_atomizer.py` |
|
| 102 |
+
|
| 103 |
+
---
|
| 104 |
+
|
| 105 |
+
## Genesis Block (Root Manifold)
|
| 106 |
+
|
| 107 |
+
```json
|
| 108 |
+
{
|
| 109 |
+
"1": "TIME",
|
| 110 |
+
"2": "MECHANISM",
|
| 111 |
+
"3": "RESULT",
|
| 112 |
+
"5": "CHOICE",
|
| 113 |
+
"7": "PERSIST",
|
| 114 |
+
"11": "WHY",
|
| 115 |
+
"13": "RELATE",
|
| 116 |
+
"17": "IMAGE",
|
| 117 |
+
"19": "TEXT",
|
| 118 |
+
"23": "AUDIO",
|
| 119 |
+
"29": "SIGNAL"
|
| 120 |
+
}
|
| 121 |
+
```
|
| 122 |
+
|
| 123 |
+
### Derived Composites
|
| 124 |
+
| Composite | Factorization | Meaning |
|
| 125 |
+
|:----------|:--------------|:--------|
|
| 126 |
+
| `[4]` | 2Β² | Previous (Mechanism of Mechanism) |
|
| 127 |
+
| `[6]` | 2Γ3 | Flip (Action = Mechanism Γ Result) |
|
| 128 |
+
| `[10]` | 2Γ5 | Around (Navigation = Mechanism Γ Choice) |
|
| 129 |
+
| `[12]` | 2Β²Γ3 | Thought (Result of Previous) |
|
| 130 |
+
| `[14]` | 2Γ7 | Hold (Mechanism of Persistence) |
|
| 131 |
+
|
| 132 |
+
---
|
| 133 |
+
|
| 134 |
+
*Document Version: 2026-01-11*
|
| 135 |
+
*Source: LOGOS System Architecture / NotebookLM Integration*
|
logos/docs/definitions_alignment.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS System Definitions & Alignment Terms
|
| 2 |
+
*Source: Handwritten User Notes (uploaded_image_1768101276627.png)*
|
| 3 |
+
|
| 4 |
+
## Core System
|
| 5 |
+
* **LOGOS**: Logarithmic Ordering-Generation Operating Software
|
| 6 |
+
* **LOGOS-B**: Binary / Hex modules of LOGOS for text extensions
|
| 7 |
+
* **LOGOS-MT**: LOGOS Matroska Tensor Space
|
| 8 |
+
|
| 9 |
+
## Topology & Physics
|
| 10 |
+
* **Matroska**: LOGOS Nested Domain Manifold
|
| 11 |
+
* **SPCW**: Scalar Prime Composite Wave (The fundamental carrier signal)
|
| 12 |
+
* **SPCW-T**: SPCW Transmission Protocol
|
| 13 |
+
* **SPCW-M**: SPCW to Matroska encoding Protocol
|
| 14 |
+
* **Tensor Space**: Variably confined Matroska Topology(ies)
|
| 15 |
+
* **Manifold**: Positioning and tessellation / node polytope / framework
|
| 16 |
+
* **Domain**: Global / Local / Integer Space / SPCW Phase discretization within active space
|
| 17 |
+
|
| 18 |
+
## Thermodynamics (Complexity)
|
| 19 |
+
* **Heat**: Measure of complexity per granularity scope
|
| 20 |
+
* **Meta Heat**: Arithmetic Abstraction of a granule Matrix
|
| 21 |
+
* **Delta Heat**: Granule Persistence, Atomic Change Tracking (Entropy)
|
| 22 |
+
* **Dissolution**: Breaking down input or resources as desired (e.g. Cognitive Dissolution)
|
| 23 |
+
|
| 24 |
+
## Operations
|
| 25 |
+
* **Persist/Change**: Basic operand primitives of LOGOS
|
| 26 |
+
* **Harmonic Resonance**: Prime gap repeating sequences (Ξ£Gn)
|
| 27 |
+
* **Connection**: The operators required to navigate Tensor Space
|
| 28 |
+
* **Call**: Retrieval - node - integer - codepoint - relation
|
| 29 |
+
* **Mult()**: Connecting two concepts by creating new tensor address (Product of Primes)
|
| 30 |
+
* **Hold**: Symbolic compression / datapoint ref operation
|
| 31 |
+
|
| 32 |
+
## Intelligence
|
| 33 |
+
* **Tensor Endpoint**: Meta Tensor Language defined address
|
| 34 |
+
* **MTL**: Meta Tensor Language -> Numerical Indexing
|
| 35 |
+
* **Concept**: MTL defined connectivity graph / tree of atoms/tensors
|
| 36 |
+
* **Learning**: Exploring network of concepts - gathering atoms
|
| 37 |
+
* **Agent Flow (AF)**: Designated handoff between agents/tools
|
| 38 |
+
* **Grokking**: Finding the underlying data-flow topology
|
logos/docs/epistemology_audit.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS Epistemological Audit: Information Theory & Semiotics
|
| 2 |
+
|
| 3 |
+
## 1. The Triadic Ontology (Peirce & Shannon)
|
| 4 |
+
The LOGOS "Root Manifold" [1, 2, 3] mirrors the fundamental triad of semiotics and computation:
|
| 5 |
+
|
| 6 |
+
* **[1] Time (The Canvas)**:
|
| 7 |
+
* *Physics*: The background metric. In Shannon entropy ($H = - \sum p \log p$), time is the implicit dimension of rate ($H/t$).
|
| 8 |
+
* *LOGOS*: The Identity Element. $n \times 1 = n$. It preserves state.
|
| 9 |
+
* **[2] Mechanism (The Verb)**:
|
| 10 |
+
* *Computation*: The Operator (Lambda Calculus). The "Bit Flip".
|
| 11 |
+
* *Theory*: Action/Intervention. Shannon's "Channel Capacity" relies on the mechanism of transmission.
|
| 12 |
+
* **[3] Result (The Noun)**:
|
| 13 |
+
* *Computation*: The Operand (Turing Tape). The "State".
|
| 14 |
+
* *Theory*: The Observation. The collapsed wavefunction.
|
| 15 |
+
|
| 16 |
+
**Audit Verdict**: This triad is **Sound**. It resolves the "Operator/Operand" duality (Church-Turing thesis) into a prime factorization relationship.
|
| 17 |
+
|
| 18 |
+
## 2. The Logic of Composites (Emergence)
|
| 19 |
+
The User's derivations exhibit **Kolmogorov Consistency**βcomplex meanings are compressed programs of simpler primes.
|
| 20 |
+
|
| 21 |
+
* **[6] Flip ([2]*[3])**: Modification of state. $Operator(State)$. Matches the definition of a logic gate.
|
| 22 |
+
* **[12] Thought ([4]*[3] or [2]^2*[3])**: "Result of Previous Mechanism". This aligns with **Bayesian Update** logicβThought is the posterior state derived from a prior state via a mechanism (likelihood).
|
| 23 |
+
* **[14] Hold ([2]*[7])**: Mechanism of Persistence. Matches **Shannon storage** (reducing uncertainty by maintaining bit state over time).
|
| 24 |
+
|
| 25 |
+
## 3. Data Type Assignments (Proposed)
|
| 26 |
+
To extend into the "Alphabet", we must look at the *dimensionality* of the data.
|
| 27 |
+
|
| 28 |
+
* **[17] Image**: 2D Spatial.
|
| 29 |
+
* *Justification*: 17 is the 7th prime. 7 + 2 = 9? (Weak numerology).
|
| 30 |
+
* *Better Justification*: Images require parallel sampling.
|
| 31 |
+
* **[19] Text**: 1D Linear/Sequential.
|
| 32 |
+
* *Justification*: Text is a stream. 19 is close to 2 (Mechanism/Time), implying sequence.
|
| 33 |
+
* **[23] Audio**: 1D Temporal/Frequency.
|
| 34 |
+
* *Justification*: Audio is wave-based.
|
| 35 |
+
|
| 36 |
+
## 4. Discrepancy Check
|
| 37 |
+
* **[1] as Time**: Mathematically, 1 is not prime. It is the generic "Unit". If Time is the "Space" generally, it shouldn't be a factor that changes the number.
|
| 38 |
+
* *Alignment*: In LOGOS, multiplying by [1] doesn't change the composite ID. This implies Time is *dimensionless* or *omnipresent*. **Mathematically valid**.
|
| 39 |
+
* **[4] Previous**: 4 is composite ($2^2$). It is "Mechanism squared".
|
| 40 |
+
* *Interpretation*: Iteration. First order mechanism -> Second order mechanism. Valid.
|
| 41 |
+
|
| 42 |
+
## Recommendation
|
| 43 |
+
The system is isomorphic to **Category Theory**:
|
| 44 |
+
* Objects: Composites ([3], [12]).
|
| 45 |
+
* Morphisms: Primes ([2], [5]).
|
| 46 |
+
* Function Composition: Multiplication.
|
| 47 |
+
|
| 48 |
+
This validates MTL as a "Category Theoretic Operating System".
|
logos/docs/mtl_specification.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Meta Tensor Language (MTL) Specification
|
| 2 |
+
|
| 3 |
+
**Source**: LOGOS System Architecture / NotebookLM
|
| 4 |
+
**Philosophy**: "Arithmetic as Topology" - Manipulation of Prime Factors as State Transitions.
|
| 5 |
+
|
| 6 |
+
## 1. Syntax & Primitives
|
| 7 |
+
|
| 8 |
+
### A. Symbols
|
| 9 |
+
* **`(...)` Parentheses (The Verb)**: Denotes an Operation or function call (Lisp S-expression).
|
| 10 |
+
* **`[...]` Brackets (The Noun)**: Denotes a Tensor Endpoint (Address). Resolves to a Prime Composite Integer.
|
| 11 |
+
|
| 12 |
+
### B. Prime Addressing
|
| 13 |
+
* **Explicit**: `[30]` β Node 30.
|
| 14 |
+
* **Implicit**: `[2, 3, 5]` β `2 * 3 * 5` = `[30]`.
|
| 15 |
+
* **Power**: `[2^2, 5]` β `4 * 5` = `[20]`.
|
| 16 |
+
* **Recursive**: `[[2,3], 5]` β The composite of concept `[6]` and `[5]`.
|
| 17 |
+
|
| 18 |
+
## 2. Operator Set (Instruction Set)
|
| 19 |
+
|
| 20 |
+
### I. Navigation (Fractran Layer)
|
| 21 |
+
| Operator | Syntax | Logic | Description |
|
| 22 |
+
| :--- | :--- | :--- | :--- |
|
| 23 |
+
| **MULT** | `(mult [A] [B])` | $A \times B$ | **Fusion**. Combines concepts to create deeper tensor address. |
|
| 24 |
+
| **DIV** | `(div [A] [B])` | $A / B$ | **Dissolution**. Strips attribute B from A. |
|
| 25 |
+
| **FACTOR** | `(factor [N])` | Factor(N) | **Expansion**. Explodes composite into prime roots. |
|
| 26 |
+
| **ROUTE** | `(route data [N])` | $S \rightarrow N$ | **Transport**. Sends payload to Node N. |
|
| 27 |
+
|
| 28 |
+
### II. Memory (Lisp Layer)
|
| 29 |
+
| Operator | Syntax | Logic | Description |
|
| 30 |
+
| :--- | :--- | :--- | :--- |
|
| 31 |
+
| **HOLD** | `(hold [K])` | Mem[K] | **Compression**. Freezes state K into register. |
|
| 32 |
+
| **CALL** | `(call [K])` | *Ptr[K] | **Retrieval**. Fetches data at Endpoint K. |
|
| 33 |
+
| **DELTA** | `(delta [A] [B])` | $\Delta(A, B)$ | **Heat Calc**. Distance/Change between states. |
|
| 34 |
+
|
| 35 |
+
## 3. The Genesis Block (Root Manifold)
|
| 36 |
+
Fundamental Axioms (First 10 Primes):
|
| 37 |
+
* `[2]`: Time / Sequence
|
| 38 |
+
* `[3]`: Space / Container
|
| 39 |
+
* `[5]`: Identity / Self
|
| 40 |
+
* `[7]`: Logic / Function
|
| 41 |
+
* `[11]`: Input / Source
|
| 42 |
+
* `[13]`: Output / Sink
|
| 43 |
+
* `[17]`: State / Context
|
| 44 |
+
* `[19]`: Entropy / Heat
|
| 45 |
+
* `[23]`: Recursion / Loop
|
| 46 |
+
* `[29]`: Signal / Data
|
| 47 |
+
|
| 48 |
+
## 4. Implementation Logic
|
| 49 |
+
MTL acts as the "Shader Language" for the Recursive Manifold.
|
| 50 |
+
* **Vertex Shader**: Calculates Prime Address (Position).
|
| 51 |
+
* **Pixel Shader**: Executes `call`/`delta` (Content/Heat).
|
logos/docs/periodic_table.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# The Periodic Table of Matroska AI Elements
|
| 2 |
+
|
| 3 |
+
This document defines the fundamental "elements" of the Logos Matroska System, inspired by the IBM AI Periodic Table but adapted for the Recursive Manifold architecture. These elements serve as the atomic units for the "Matroska Tool Token Assignment" and "Semantic Gravity".
|
| 4 |
+
|
| 5 |
+
## I. Primitives (The Nucleus)
|
| 6 |
+
Fundamental building blocks that cannot be broken down further within the domain.
|
| 7 |
+
|
| 8 |
+
| Symbol | Element | Description | Logos Mapping |
|
| 9 |
+
| :--- | :--- | :--- | :--- |
|
| 10 |
+
| **Pr** | **Prompt** | The initial input wave or instruction. | `State Buffer` Input |
|
| 11 |
+
| **To** | **Token** | The atomic unit of semantic meaning. | Text Tokens / Image Patches |
|
| 12 |
+
| **Ve** | **Vector** | Numerical representation of meaning (Semantic Gravity). | `Heat Codes` / Embeddings |
|
| 13 |
+
| **Mo** | **Model** | The dense compute node (LLM). | `Gemma`, `RNJ-1`, Local LLMs |
|
| 14 |
+
| **Me** | **Memory** | Persistence of state. | `Manifold` Storage |
|
| 15 |
+
| **Co** | **Code** | Executable logic functions. | Tools / Python Functions |
|
| 16 |
+
|
| 17 |
+
## II. Compounds (The Molecules)
|
| 18 |
+
Combinations of primitives that form functional units.
|
| 19 |
+
|
| 20 |
+
| Symbol | Compound | Formula | Description |
|
| 21 |
+
| :--- | :--- | :--- | :--- |
|
| 22 |
+
| **Rag** | **Retrieval** | `Pr + Ve + Me` | Fetching context based on semantic gravity. |
|
| 23 |
+
| **Ch** | **Chain** | `Pr -> Mo -> Pr` | Linear sequence of model calls. |
|
| 24 |
+
| **Fu** | **Function** | `Mo + Co` | LLM calling a specific tool (Tool Use). |
|
| 25 |
+
| **St** | **State** | `Me + time` | The evolving context over recursive loops. |
|
| 26 |
+
|
| 27 |
+
## III. Organisms (The Agents)
|
| 28 |
+
Self-organizing structures capable of goal-directed behavior.
|
| 29 |
+
|
| 30 |
+
| Symbol | Organism | Formula | Description |
|
| 31 |
+
| :--- | :--- | :--- | :--- |
|
| 32 |
+
| **Ag** | **Agent** | `Ch + Fu + St` | A recursive loop with tools and memory. |
|
| 33 |
+
| **Sw** | **Swarm** | `Ag + Ag + ...` | Multiple agents coordinating via the Hyper-Graph. |
|
| 34 |
+
| **Ma** | **Matroska** | `Sw^n` | Nested domains of swarms (The Logos System). |
|
| 35 |
+
|
| 36 |
+
## IV. The Periodic Laws (Rules of Interaction)
|
| 37 |
+
|
| 38 |
+
1. **Law of Semantic Gravity:**
|
| 39 |
+
* Elements with similar **Ve** (Vectors) attract each other.
|
| 40 |
+
* Routing is determined by the "Heat" (Dissonance) between the **Pr** and **Mo**.
|
| 41 |
+
|
| 42 |
+
2. **Law of Recursive Synthesis:**
|
| 43 |
+
* Compounds are formed effectively when **St** (State) is preserved across loops.
|
| 44 |
+
* A stable **Ag** (Agent) requires a harmonic balance of **Dissonance** (Entropy).
|
| 45 |
+
|
| 46 |
+
3. **Law of Matroska Embedding:**
|
| 47 |
+
* Higher-order organisms (**Ma**) can contain lower-order elements as "Tokens".
|
| 48 |
+
* An entire **Ag** can be treated as a **To** for a higher-level Router.
|
logos/docs/purpose_statement.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LOGOS: Architectural Purpose Statement
|
| 2 |
+
**Logarithmic Ordering Generation Operating Software**
|
| 3 |
+
|
| 4 |
+
*A fundamental architectural pivot from the "muscle head era" of brute-force scaling toward deep, mathematically guaranteed structural engineering.*
|
| 5 |
+
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
## Core Philosophy
|
| 9 |
+
|
| 10 |
+
> **Intelligence is a consequence of building the transport and memory layers around fundamental, non-arbitrary mathematical patterns.**
|
| 11 |
+
|
| 12 |
+
While the industry has historically focused on making models exponentially bigger, LOGOS achieves long-term stability and reliable context through:
|
| 13 |
+
- **Number Theory**
|
| 14 |
+
- **Prime Factorization**
|
| 15 |
+
- **Tensor Topology**
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## The Five Imperatives
|
| 20 |
+
|
| 21 |
+
### 1. The Erasure of Statistical Probability
|
| 22 |
+
|
| 23 |
+
The primary mission is to replace the "nightmare" of managing raw statistical tokens with a framework of **structural certainty**.
|
| 24 |
+
|
| 25 |
+
| Traditional AI | LOGOS |
|
| 26 |
+
|:---------------|:------|
|
| 27 |
+
| 50 user-aligned tokens β metadata nightmare | Dissolution β irreducible data atoms (integers) |
|
| 28 |
+
| Probabilistic guesswork | Constrained pathing optimization |
|
| 29 |
+
| Statistical relevance tracking | Mathematical factor analysis |
|
| 30 |
+
|
| 31 |
+
### 2. Solving the "Amnesia" Crisis
|
| 32 |
+
|
| 33 |
+
Standard Transformers suffer from inherent amnesia due to volatile, fixed context windows.
|
| 34 |
+
|
| 35 |
+
**LOGOS Solution**: The SPCW Matroska Topology
|
| 36 |
+
- Recursively nests data within domains
|
| 37 |
+
- Isolates context correctly
|
| 38 |
+
- A "low domain" (specific project) remains distinct within a "high domain" (generalized knowledge)
|
| 39 |
+
- Prevents "context pollution" that leads to degradation
|
| 40 |
+
|
| 41 |
+
### 3. Achieving Structural Fidelity via "Baking"
|
| 42 |
+
|
| 43 |
+
LOGOS processes reality (text, images, video) into a finite number of atoms **without losing structural meaning**.
|
| 44 |
+
|
| 45 |
+
**Baking Process**:
|
| 46 |
+
- Uses Structural Similarity Index Measure (SSIM)
|
| 47 |
+
- Prioritizes functional shape and perceived content
|
| 48 |
+
- Raw bit-by-bit minimization is secondary
|
| 49 |
+
- 4K image β atoms that preserve "meaning" not just data volume
|
| 50 |
+
|
| 51 |
+
### 4. Optimal Agentic Digestion
|
| 52 |
+
|
| 53 |
+
The Agent Flow (AF) is a collaborative system of specialized agents:
|
| 54 |
+
|
| 55 |
+
| Agent | Role |
|
| 56 |
+
|:------|:-----|
|
| 57 |
+
| **Dolphin** | Systems oversight, tokenization orchestration |
|
| 58 |
+
| **Gemma** | Image metadata, visual redundancy stripping |
|
| 59 |
+
| **RNJ-1** | Encoding agent, filing atoms onto Matroska manifold |
|
| 60 |
+
| **L** | Text dissolution, conceptual factorability |
|
| 61 |
+
|
| 62 |
+
> **Reasoning = Optimization of pathing through 3D tensor space**
|
| 63 |
+
|
| 64 |
+
### 5. Efficient, Self-Stabilizing Transport
|
| 65 |
+
|
| 66 |
+
The **Scalar Prime Composite Wave (SPCW)** protocol:
|
| 67 |
+
- Abandons traditional network lanes
|
| 68 |
+
- Uses wave threads derived from prime distribution
|
| 69 |
+
- Tracks **Delta Heat** (atomic change)
|
| 70 |
+
- Only transmits atoms that require repositioning
|
| 71 |
+
- Achieves lossless transmission of structural change
|
| 72 |
+
|
| 73 |
+
---
|
| 74 |
+
|
| 75 |
+
## Implementation Status
|
| 76 |
+
|
| 77 |
+
| Component | Status | Verified |
|
| 78 |
+
|:----------|:-------|:---------|
|
| 79 |
+
| **MTL Interpreter** | Turing Complete | β
Fractran loop, Lisp recursion |
|
| 80 |
+
| **Genesis Block** | Active | β
Primes 1-29 mapped |
|
| 81 |
+
| **Domain-Keyed Memory** | Active | β
Prime-partitioned isolation |
|
| 82 |
+
| **Logic Gates** | Active | β
OR (LCM), AND (GCD), NOT (Steering) |
|
| 83 |
+
| **Dissolution Engine** | Active | β
Auto-routing via GCD |
|
| 84 |
+
| **Synaptic Bridge** | Active | β
Knowledge Graph via [13] |
|
| 85 |
+
| **Delta Heat** | Active | β
Atomic change tracking |
|
| 86 |
+
| **Deep Storage [42]** | Active | β
Persistent memory |
|
| 87 |
+
|
| 88 |
+
---
|
| 89 |
+
|
| 90 |
+
## The Mathematical Grammar
|
| 91 |
+
|
| 92 |
+
### Genesis Block (Root Manifold)
|
| 93 |
+
```
|
| 94 |
+
[1] TIME - The Canvas
|
| 95 |
+
[2] MECHANISM - The Verb
|
| 96 |
+
[3] RESULT - The Noun
|
| 97 |
+
[5] CHOICE - The Fork
|
| 98 |
+
[7] PERSIST - The Memory
|
| 99 |
+
[11] WHY - The Reason
|
| 100 |
+
[13] RELATE - The Connection
|
| 101 |
+
[17] IMAGE - Visual Data
|
| 102 |
+
[19] TEXT - Linguistic Data
|
| 103 |
+
[23] AUDIO - Acoustic Data
|
| 104 |
+
[29] SIGNAL - Raw Data
|
| 105 |
+
```
|
| 106 |
+
|
| 107 |
+
### Derived Domains (Composites)
|
| 108 |
+
```
|
| 109 |
+
[6] = 2Γ3 β FLIP (Action)
|
| 110 |
+
[10] = 2Γ5 β AROUND (Navigation)
|
| 111 |
+
[12] = 2Β²Γ3 β THOUGHT (Result of Previous)
|
| 112 |
+
[14] = 2Γ7 β HOLD (Save Command)
|
| 113 |
+
[42] = 2Γ3Γ7 β DEEP STORAGE (Permanent Record)
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
### Key Operators
|
| 117 |
+
```lisp
|
| 118 |
+
(relate A B) ; Create synapse: A Γ B Γ 13
|
| 119 |
+
(trace synapse atom) ; Check if atom is factor of synapse
|
| 120 |
+
(dissolve-link synapse); Remove [13] factor
|
| 121 |
+
(get-linked synapse A) ; Find B given synapse and A
|
| 122 |
+
(or A B) ; LCM - Superposition
|
| 123 |
+
(and A B) ; GCD - Intersection
|
| 124 |
+
(not key list) ; Steering based on pattern match
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
---
|
| 128 |
+
|
| 129 |
+
## The Axiom
|
| 130 |
+
|
| 131 |
+
> **Computing a value IS routing it.**
|
| 132 |
+
|
| 133 |
+
A standard OS checks `if (condition)` then executes a jump command.
|
| 134 |
+
LOGOS calculates `GCD(State, Filter)` and the result IS the address of the next step.
|
| 135 |
+
|
| 136 |
+
---
|
| 137 |
+
|
| 138 |
+
*Document Version: 2026-01-11*
|
| 139 |
+
*Author: LOGOS Architect*
|
logos/harmonizer.py
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LOGOS Harmonizer (Protocol 42)
|
| 3 |
+
The Immune System - Resonance-Based Noise Filtering
|
| 4 |
+
|
| 5 |
+
Philosophy: "Don't detect what's bad; only accept what matches the geometry."
|
| 6 |
+
|
| 7 |
+
Standard OS: Needs antivirus database to know what is "bad"
|
| 8 |
+
LOGOS: Accepts only what matches the Prime Modulo of the domain
|
| 9 |
+
|
| 10 |
+
Rule: If you are in Domain [P], you must be divisible by P.
|
| 11 |
+
Attack: Corrupted atom with wrong heat is arithmetically rejected.
|
| 12 |
+
Defense: heat % domain_prime != 0 -> REJECT
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
from dataclasses import dataclass
|
| 16 |
+
from typing import List, Tuple, Dict
|
| 17 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
@dataclass
|
| 21 |
+
class Atom:
|
| 22 |
+
"""Minimal atom structure for harmonization testing."""
|
| 23 |
+
id: int
|
| 24 |
+
heat: int
|
| 25 |
+
payload: bytes
|
| 26 |
+
|
| 27 |
+
@property
|
| 28 |
+
def is_valid(self) -> bool:
|
| 29 |
+
return self.heat > 0
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
class Harmonizer:
|
| 33 |
+
"""
|
| 34 |
+
The SPCW Resonance Filter.
|
| 35 |
+
Filters atom streams based on prime domain membership.
|
| 36 |
+
"""
|
| 37 |
+
|
| 38 |
+
def __init__(self):
|
| 39 |
+
self.mtl = MTLInterpreter()
|
| 40 |
+
self.rejection_log = []
|
| 41 |
+
|
| 42 |
+
def filter_stream(self,
|
| 43 |
+
stream: List[Atom],
|
| 44 |
+
domain_prime: int,
|
| 45 |
+
verbose: bool = True) -> Tuple[List[Atom], List[Atom]]:
|
| 46 |
+
"""
|
| 47 |
+
Filter a stream of atoms for domain resonance.
|
| 48 |
+
|
| 49 |
+
Args:
|
| 50 |
+
stream: List of atoms to filter
|
| 51 |
+
domain_prime: The prime that defines the domain
|
| 52 |
+
verbose: Print filtering details
|
| 53 |
+
|
| 54 |
+
Returns:
|
| 55 |
+
Tuple of (resonant_atoms, dissonant_atoms)
|
| 56 |
+
"""
|
| 57 |
+
resonant = []
|
| 58 |
+
dissonant = []
|
| 59 |
+
|
| 60 |
+
if verbose:
|
| 61 |
+
print(f"\n[HARMONIZER] Filtering for Domain [{domain_prime}]...")
|
| 62 |
+
|
| 63 |
+
for atom in stream:
|
| 64 |
+
# The Core Test: Does this atom resonate with the domain?
|
| 65 |
+
if atom.heat % domain_prime == 0:
|
| 66 |
+
resonant.append(atom)
|
| 67 |
+
if verbose:
|
| 68 |
+
print(f" Atom {atom.id} (heat={atom.heat}) -> [OK] RESONANT")
|
| 69 |
+
else:
|
| 70 |
+
dissonant.append(atom)
|
| 71 |
+
self.rejection_log.append({
|
| 72 |
+
'atom_id': atom.id,
|
| 73 |
+
'heat': atom.heat,
|
| 74 |
+
'domain': domain_prime,
|
| 75 |
+
'remainder': atom.heat % domain_prime,
|
| 76 |
+
'reason': 'DISSONANCE'
|
| 77 |
+
})
|
| 78 |
+
if verbose:
|
| 79 |
+
print(f" Atom {atom.id} (heat={atom.heat}) -> [X] DISSONANT (rem={atom.heat % domain_prime})")
|
| 80 |
+
|
| 81 |
+
return resonant, dissonant
|
| 82 |
+
|
| 83 |
+
def multi_domain_filter(self,
|
| 84 |
+
stream: List[Atom],
|
| 85 |
+
domain_primes: List[int]) -> Dict[int, List[Atom]]:
|
| 86 |
+
"""
|
| 87 |
+
Route atoms to multiple domains based on resonance.
|
| 88 |
+
An atom can belong to multiple domains if it resonates with all.
|
| 89 |
+
"""
|
| 90 |
+
domain_buckets = {p: [] for p in domain_primes}
|
| 91 |
+
|
| 92 |
+
for atom in stream:
|
| 93 |
+
for prime in domain_primes:
|
| 94 |
+
if atom.heat % prime == 0:
|
| 95 |
+
domain_buckets[prime].append(atom)
|
| 96 |
+
|
| 97 |
+
return domain_buckets
|
| 98 |
+
|
| 99 |
+
def inject_noise(self,
|
| 100 |
+
stream: List[Atom],
|
| 101 |
+
indices: List[int],
|
| 102 |
+
corruption_delta: int = 1) -> List[Atom]:
|
| 103 |
+
"""
|
| 104 |
+
Artificially corrupt atoms at specified indices.
|
| 105 |
+
Used for testing the immune system.
|
| 106 |
+
"""
|
| 107 |
+
corrupted = []
|
| 108 |
+
for i, atom in enumerate(stream):
|
| 109 |
+
if i in indices:
|
| 110 |
+
# Corrupt by adding delta (breaks modulo alignment)
|
| 111 |
+
new_heat = atom.heat + corruption_delta
|
| 112 |
+
corrupted.append(Atom(atom.id, new_heat, atom.payload))
|
| 113 |
+
else:
|
| 114 |
+
corrupted.append(atom)
|
| 115 |
+
return corrupted
|
| 116 |
+
|
| 117 |
+
def calculate_stream_integrity(self,
|
| 118 |
+
original: List[Atom],
|
| 119 |
+
filtered: List[Atom]) -> float:
|
| 120 |
+
"""Calculate what percentage of original stream survived filtering."""
|
| 121 |
+
if not original:
|
| 122 |
+
return 0.0
|
| 123 |
+
return len(filtered) / len(original)
|
| 124 |
+
|
| 125 |
+
def get_rejection_summary(self) -> Dict:
|
| 126 |
+
"""Get summary of all rejections."""
|
| 127 |
+
return {
|
| 128 |
+
'total_rejections': len(self.rejection_log),
|
| 129 |
+
'by_domain': {},
|
| 130 |
+
'log': self.rejection_log
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
# ============================================
|
| 135 |
+
# STANDALONE TEST: The Immune System
|
| 136 |
+
# ============================================
|
| 137 |
+
if __name__ == "__main__":
|
| 138 |
+
harmonizer = Harmonizer()
|
| 139 |
+
|
| 140 |
+
print("="*60)
|
| 141 |
+
print(" SPCW HARMONIZATION TEST (The Immune System)")
|
| 142 |
+
print("="*60)
|
| 143 |
+
|
| 144 |
+
# ===== TEST 1: Basic Resonance Filter =====
|
| 145 |
+
print("\n[TEST 1] Basic Resonance Filter")
|
| 146 |
+
print("-"*40)
|
| 147 |
+
|
| 148 |
+
# Create clean stream of TEXT atoms [19]
|
| 149 |
+
stream = []
|
| 150 |
+
for i in range(5):
|
| 151 |
+
# Valid Heat: Must be divisible by 19
|
| 152 |
+
valid_heat = (i + 1) * 19
|
| 153 |
+
atom = Atom(id=i, heat=valid_heat, payload=f"Data_Chunk_{i}".encode())
|
| 154 |
+
stream.append(atom)
|
| 155 |
+
|
| 156 |
+
print(f"Original Stream Heats: {[a.heat for a in stream]}")
|
| 157 |
+
|
| 158 |
+
# Inject noise: Corrupt Atom #2
|
| 159 |
+
print("\n[INJECTION] Corrupting Atom #2...")
|
| 160 |
+
corrupted_stream = harmonizer.inject_noise(stream, indices=[2], corruption_delta=1)
|
| 161 |
+
print(f"Corrupted Stream Heats: {[a.heat for a in corrupted_stream]}")
|
| 162 |
+
|
| 163 |
+
# Filter
|
| 164 |
+
clean, rejected = harmonizer.filter_stream(corrupted_stream, domain_prime=19)
|
| 165 |
+
|
| 166 |
+
print(f"\n[REPORT]")
|
| 167 |
+
print(f" Input Size: {len(corrupted_stream)}")
|
| 168 |
+
print(f" Clean Output: {len(clean)}")
|
| 169 |
+
print(f" Rejected: {len(rejected)}")
|
| 170 |
+
|
| 171 |
+
if len(rejected) == 1 and rejected[0].id == 2:
|
| 172 |
+
print("[OK] TEST 1 PASSED: Dissonance filtered mathematically.")
|
| 173 |
+
else:
|
| 174 |
+
print("[X] TEST 1 FAILED")
|
| 175 |
+
|
| 176 |
+
# ===== TEST 2: Multi-Modal Corruption =====
|
| 177 |
+
print("\n[TEST 2] Multi-Modal Corruption Attack")
|
| 178 |
+
print("-"*40)
|
| 179 |
+
|
| 180 |
+
# Create stream with multiple types
|
| 181 |
+
multi_stream = [
|
| 182 |
+
Atom(0, 17 * 2, b"image_chunk_0"), # IMAGE [17] * 2 = 34
|
| 183 |
+
Atom(1, 17 * 3, b"image_chunk_1"), # IMAGE [17] * 3 = 51
|
| 184 |
+
Atom(2, 19 * 2, b"text_chunk_0"), # TEXT [19] * 2 = 38
|
| 185 |
+
Atom(3, 19 * 3, b"text_chunk_1"), # TEXT [19] * 3 = 57
|
| 186 |
+
Atom(4, 17 * 19, b"multimodal"), # IMAGE + TEXT = 323
|
| 187 |
+
]
|
| 188 |
+
|
| 189 |
+
print(f"Original: {[(a.id, a.heat) for a in multi_stream]}")
|
| 190 |
+
|
| 191 |
+
# Corrupt atoms 1 and 3
|
| 192 |
+
attacked_stream = harmonizer.inject_noise(multi_stream, indices=[1, 3], corruption_delta=1)
|
| 193 |
+
print(f"Attacked: {[(a.id, a.heat) for a in attacked_stream]}")
|
| 194 |
+
|
| 195 |
+
# Filter for IMAGE domain [17]
|
| 196 |
+
image_clean, image_rejected = harmonizer.filter_stream(attacked_stream, domain_prime=17)
|
| 197 |
+
print(f"\nIMAGE Domain [17]: {len(image_clean)} clean, {len(image_rejected)} rejected")
|
| 198 |
+
|
| 199 |
+
# Filter for TEXT domain [19]
|
| 200 |
+
text_clean, text_rejected = harmonizer.filter_stream(attacked_stream, domain_prime=19)
|
| 201 |
+
print(f"TEXT Domain [19]: {len(text_clean)} clean, {len(text_rejected)} rejected")
|
| 202 |
+
|
| 203 |
+
# ===== TEST 3: Cascading Attack =====
|
| 204 |
+
print("\n[TEST 3] Cascading Attack (50% Corruption)")
|
| 205 |
+
print("-"*40)
|
| 206 |
+
|
| 207 |
+
large_stream = [Atom(i, 7 * (i + 1), f"chunk_{i}".encode()) for i in range(10)]
|
| 208 |
+
print(f"Original: 10 atoms, all divisible by 7")
|
| 209 |
+
|
| 210 |
+
# Corrupt half
|
| 211 |
+
heavy_attack = harmonizer.inject_noise(large_stream, indices=[1, 3, 5, 7, 9], corruption_delta=1)
|
| 212 |
+
clean, rejected = harmonizer.filter_stream(heavy_attack, domain_prime=7, verbose=False)
|
| 213 |
+
|
| 214 |
+
integrity = harmonizer.calculate_stream_integrity(heavy_attack, clean)
|
| 215 |
+
print(f"Integrity after attack: {integrity*100:.0f}%")
|
| 216 |
+
print(f"Survivors: {len(clean)}, Rejected: {len(rejected)}")
|
| 217 |
+
|
| 218 |
+
if len(rejected) == 5:
|
| 219 |
+
print("[OK] TEST 3 PASSED: 50% corruption detected and filtered.")
|
| 220 |
+
|
| 221 |
+
# ===== FINAL SUMMARY =====
|
| 222 |
+
print("\n" + "="*60)
|
| 223 |
+
print(" HARMONIZATION SUMMARY")
|
| 224 |
+
print("="*60)
|
| 225 |
+
print(f"""
|
| 226 |
+
The LOGOS Immune System:
|
| 227 |
+
|
| 228 |
+
| Attack Type | Detection Method | Result |
|
| 229 |
+
|--------------------|----------------------|-----------|
|
| 230 |
+
| Single Corruption | heat % 19 != 0 | REJECTED |
|
| 231 |
+
| Multi-Modal Attack | heat % 17/19 != 0 | REJECTED |
|
| 232 |
+
| 50% Cascade | heat % 7 != 0 | REJECTED |
|
| 233 |
+
|
| 234 |
+
Principle: "Physics, not Policies"
|
| 235 |
+
- No virus database needed
|
| 236 |
+
- No signature matching
|
| 237 |
+
- Pure arithmetic geometry
|
| 238 |
+
""")
|
| 239 |
+
|
| 240 |
+
summary = harmonizer.get_rejection_summary()
|
| 241 |
+
print(f"Total Rejections: {summary['total_rejections']}")
|
| 242 |
+
|
| 243 |
+
print("\n" + "="*60)
|
| 244 |
+
print(" [OK] IMMUNE SYSTEM OPERATIONAL")
|
| 245 |
+
print("="*60)
|
logos/kernel.py
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LOGOS Genesis Kernel (Protocol 40)
|
| 3 |
+
The Complete Agent Flow Lifecycle
|
| 4 |
+
|
| 5 |
+
This module orchestrates the full LOGOS system:
|
| 6 |
+
1. AUTHENTICATION: Check Identity [29]
|
| 7 |
+
2. DISSOLUTION: Strip user ID, detect data types via GCD
|
| 8 |
+
3. ROUTING: Multi-cast to appropriate agents
|
| 9 |
+
4. SYNAPSE: Auto-link multi-modal data via [13]
|
| 10 |
+
5. PERSISTENCE: Burn to Deep Storage [42] if [7] present
|
| 11 |
+
|
| 12 |
+
This replaces:
|
| 13 |
+
- Auth0 β Packet % 29 == 0
|
| 14 |
+
- SQL Database β Prime Registry
|
| 15 |
+
- API Router β Packet % (type_prime) == 0
|
| 16 |
+
- Link Table β A * B * 13
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 20 |
+
from logos.agents.dissolution_engine import DissolutionEngine
|
| 21 |
+
import math
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
class GenesisKernel:
|
| 25 |
+
"""
|
| 26 |
+
The LOGOS Operating System Kernel
|
| 27 |
+
Orchestrates the complete Agent Flow lifecycle.
|
| 28 |
+
"""
|
| 29 |
+
|
| 30 |
+
# Genesis Primes
|
| 31 |
+
IDENTITY = 29 # User/Owner
|
| 32 |
+
PERSIST = 7 # Save command
|
| 33 |
+
RELATE = 13 # Link/Synapse
|
| 34 |
+
|
| 35 |
+
# Type Primes
|
| 36 |
+
IMAGE = 17
|
| 37 |
+
TEXT = 19
|
| 38 |
+
AUDIO = 23
|
| 39 |
+
SIGNAL = 29
|
| 40 |
+
|
| 41 |
+
# Storage Domains
|
| 42 |
+
DEEP_STORAGE = 42
|
| 43 |
+
USER_REGISTRY = 29 * 100 # [2900]
|
| 44 |
+
|
| 45 |
+
def __init__(self):
|
| 46 |
+
self.mtl = MTLInterpreter()
|
| 47 |
+
self.dissolution = DissolutionEngine()
|
| 48 |
+
self.transaction_log = []
|
| 49 |
+
|
| 50 |
+
def process_packet(self, packet_atom: int, source: str = "UNKNOWN") -> dict:
|
| 51 |
+
"""
|
| 52 |
+
Process a complete lifecycle event.
|
| 53 |
+
Returns transaction receipt.
|
| 54 |
+
"""
|
| 55 |
+
print(f"\n{'='*60}")
|
| 56 |
+
print(f" LOGOS GENESIS KERNEL: Processing Packet [{packet_atom}]")
|
| 57 |
+
print(f"{'='*60}")
|
| 58 |
+
|
| 59 |
+
factors = self._factorize(packet_atom)
|
| 60 |
+
print(f"Prime Factors: {factors}")
|
| 61 |
+
|
| 62 |
+
result = {
|
| 63 |
+
'packet': packet_atom,
|
| 64 |
+
'source': source,
|
| 65 |
+
'factors': factors,
|
| 66 |
+
'authenticated': False,
|
| 67 |
+
'agents': [],
|
| 68 |
+
'synapse': None,
|
| 69 |
+
'stored': False,
|
| 70 |
+
'location': None
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
# ===== PHASE 1: AUTHENTICATION =====
|
| 74 |
+
print(f"\n[1] AUTHENTICATION")
|
| 75 |
+
if packet_atom % self.IDENTITY == 0:
|
| 76 |
+
user_id = self.IDENTITY
|
| 77 |
+
work_payload = packet_atom // self.IDENTITY
|
| 78 |
+
print(f" [OK] Identity [{user_id}] Verified")
|
| 79 |
+
print(f" Work Payload: [{work_payload}]")
|
| 80 |
+
result['authenticated'] = True
|
| 81 |
+
result['user_id'] = user_id
|
| 82 |
+
else:
|
| 83 |
+
print(f" [!] Anonymous Request (No Identity Factor)")
|
| 84 |
+
work_payload = packet_atom
|
| 85 |
+
result['user_id'] = 0
|
| 86 |
+
|
| 87 |
+
# ===== PHASE 2: DISSOLUTION & ROUTING =====
|
| 88 |
+
print(f"\n[2] DISSOLUTION & ROUTING")
|
| 89 |
+
active_agents = []
|
| 90 |
+
|
| 91 |
+
if work_payload % self.IMAGE == 0:
|
| 92 |
+
print(f" -> Routing to VISUAL_AGENT [{self.IMAGE}]")
|
| 93 |
+
active_agents.append(('VISUAL', self.IMAGE))
|
| 94 |
+
self.mtl.execute(f'(domain [1700])')
|
| 95 |
+
self.mtl.execute(f'(store packet_{packet_atom} {work_payload})')
|
| 96 |
+
|
| 97 |
+
if work_payload % self.TEXT == 0:
|
| 98 |
+
print(f" -> Routing to TEXT_AGENT [{self.TEXT}]")
|
| 99 |
+
active_agents.append(('TEXT', self.TEXT))
|
| 100 |
+
self.mtl.execute(f'(domain [1900])')
|
| 101 |
+
self.mtl.execute(f'(store packet_{packet_atom} {work_payload})')
|
| 102 |
+
|
| 103 |
+
if work_payload % self.AUDIO == 0:
|
| 104 |
+
print(f" -> Routing to AUDIO_AGENT [{self.AUDIO}]")
|
| 105 |
+
active_agents.append(('AUDIO', self.AUDIO))
|
| 106 |
+
self.mtl.execute(f'(domain [2300])')
|
| 107 |
+
self.mtl.execute(f'(store packet_{packet_atom} {work_payload})')
|
| 108 |
+
|
| 109 |
+
if not active_agents:
|
| 110 |
+
print(f" -> No specific type detected, routing to GENERIC")
|
| 111 |
+
active_agents.append(('GENERIC', 1))
|
| 112 |
+
|
| 113 |
+
result['agents'] = active_agents
|
| 114 |
+
|
| 115 |
+
# ===== PHASE 3: AUTOMATIC SYNAPSE CREATION =====
|
| 116 |
+
print(f"\n[3] SYNAPSE CREATION")
|
| 117 |
+
if len(active_agents) > 1:
|
| 118 |
+
print(f" [LINK] Multi-Modal Data Detected ({len(active_agents)} agents)")
|
| 119 |
+
synapse_core = 1
|
| 120 |
+
for agent_name, agent_prime in active_agents:
|
| 121 |
+
synapse_core *= agent_prime
|
| 122 |
+
|
| 123 |
+
synapse_id = synapse_core * self.RELATE
|
| 124 |
+
print(f" Synapse: {' x '.join([str(p) for _, p in active_agents])} x {self.RELATE} = [{synapse_id}]")
|
| 125 |
+
|
| 126 |
+
# Store synapse in Relationship domain
|
| 127 |
+
self.mtl.execute('(domain [1300])')
|
| 128 |
+
self.mtl.execute(f'(store synapse_{packet_atom} {synapse_id})')
|
| 129 |
+
result['synapse'] = synapse_id
|
| 130 |
+
else:
|
| 131 |
+
print(f" Single-modal data, no synapse needed")
|
| 132 |
+
result['synapse'] = work_payload
|
| 133 |
+
|
| 134 |
+
# ===== PHASE 4: PERSISTENCE LAYER =====
|
| 135 |
+
print(f"\n[4] PERSISTENCE CHECK")
|
| 136 |
+
if work_payload % self.PERSIST == 0:
|
| 137 |
+
print(f" [SAVE] Persistence Request [{self.PERSIST}] Detected")
|
| 138 |
+
|
| 139 |
+
# Store in Deep Storage [42]
|
| 140 |
+
self.mtl.execute(f'(domain [{self.DEEP_STORAGE}])')
|
| 141 |
+
storage_key = f'entry_{packet_atom}'
|
| 142 |
+
self.mtl.execute(f'(store {storage_key} {result["synapse"] or work_payload})')
|
| 143 |
+
|
| 144 |
+
result['stored'] = True
|
| 145 |
+
result['location'] = self.DEEP_STORAGE
|
| 146 |
+
print(f" [OK] Burned to Deep Storage [{self.DEEP_STORAGE}]")
|
| 147 |
+
|
| 148 |
+
# Log to user registry if authenticated
|
| 149 |
+
if result['authenticated']:
|
| 150 |
+
self.mtl.execute(f'(domain [{self.USER_REGISTRY}])')
|
| 151 |
+
self.mtl.execute(f'(store user_{result["user_id"]}_{packet_atom} {self.DEEP_STORAGE})')
|
| 152 |
+
print(f" [REG] Registered in User Domain [{self.USER_REGISTRY}]")
|
| 153 |
+
else:
|
| 154 |
+
print(f" Volatile data (no persistence requested)")
|
| 155 |
+
|
| 156 |
+
# ===== PHASE 5: TRANSACTION RECEIPT =====
|
| 157 |
+
print(f"\n[5] TRANSACTION COMPLETE")
|
| 158 |
+
print(f" {'='*40}")
|
| 159 |
+
print(f" Packet: [{packet_atom}]")
|
| 160 |
+
print(f" User: [{result.get('user_id', 'ANON')}]")
|
| 161 |
+
print(f" Agents: {[a[0] for a in result['agents']]}")
|
| 162 |
+
print(f" Synapse: [{result['synapse']}]")
|
| 163 |
+
print(f" Stored: {result['stored']} @ [{result['location']}]")
|
| 164 |
+
print(f" {'='*40}")
|
| 165 |
+
|
| 166 |
+
self.transaction_log.append(result)
|
| 167 |
+
return result
|
| 168 |
+
|
| 169 |
+
def _factorize(self, n: int) -> list:
|
| 170 |
+
"""Return prime factors."""
|
| 171 |
+
if n <= 1:
|
| 172 |
+
return [n]
|
| 173 |
+
factors = []
|
| 174 |
+
d = 2
|
| 175 |
+
temp = n
|
| 176 |
+
while d * d <= temp:
|
| 177 |
+
while temp % d == 0:
|
| 178 |
+
factors.append(d)
|
| 179 |
+
temp //= d
|
| 180 |
+
d += 1
|
| 181 |
+
if temp > 1:
|
| 182 |
+
factors.append(temp)
|
| 183 |
+
return factors
|
| 184 |
+
|
| 185 |
+
def get_domain_map(self) -> dict:
|
| 186 |
+
"""Return all populated domains."""
|
| 187 |
+
return {k: v for k, v in self.mtl.domains.items() if v}
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
# ============================================
|
| 191 |
+
# STANDALONE TEST
|
| 192 |
+
# ============================================
|
| 193 |
+
if __name__ == "__main__":
|
| 194 |
+
kernel = GenesisKernel()
|
| 195 |
+
|
| 196 |
+
print("\n" + "="*60)
|
| 197 |
+
print(" LOGOS GENESIS KERNEL: COMMISSIONING TEST")
|
| 198 |
+
print("="*60)
|
| 199 |
+
|
| 200 |
+
# Test 1: Full Lifecycle - User saves multimedia note
|
| 201 |
+
# Composition: User(29) Γ Persist(7) Γ Image(17) Γ Text(19)
|
| 202 |
+
packet_1 = 29 * 7 * 17 * 19
|
| 203 |
+
print(f"\n[TEST 1] Authenticated Multimedia Save")
|
| 204 |
+
print(f" Packet = 29 x 7 x 17 x 19 = {packet_1}")
|
| 205 |
+
kernel.process_packet(packet_1, source="user_upload")
|
| 206 |
+
|
| 207 |
+
# Test 2: Anonymous image view (no persist, no auth)
|
| 208 |
+
# Composition: Image(17) only
|
| 209 |
+
packet_2 = 17
|
| 210 |
+
print(f"\n[TEST 2] Anonymous Image View")
|
| 211 |
+
print(f" Packet = 17 = {packet_2}")
|
| 212 |
+
kernel.process_packet(packet_2, source="anonymous_view")
|
| 213 |
+
|
| 214 |
+
# Test 3: User saves audio note
|
| 215 |
+
# Composition: User(29) Γ Persist(7) Γ Audio(23)
|
| 216 |
+
packet_3 = 29 * 7 * 23
|
| 217 |
+
print(f"\n[TEST 3] Authenticated Audio Save")
|
| 218 |
+
print(f" Packet = 29 x 7 x 23 = {packet_3}")
|
| 219 |
+
kernel.process_packet(packet_3, source="audio_upload")
|
| 220 |
+
|
| 221 |
+
# Final Domain Map
|
| 222 |
+
print("\n" + "="*60)
|
| 223 |
+
print(" FINAL DOMAIN MAP")
|
| 224 |
+
print("="*60)
|
| 225 |
+
for domain, contents in kernel.get_domain_map().items():
|
| 226 |
+
print(f" [{domain:5d}] {contents}")
|
| 227 |
+
|
| 228 |
+
print("\n" + "="*60)
|
| 229 |
+
print(" [OK] LOGOS OPERATING SYSTEM COMMISSIONED")
|
| 230 |
+
print("="*60)
|
logos/memory/prime_db.py
CHANGED
|
@@ -10,12 +10,16 @@ os.makedirs(os.path.dirname(REGISTRY_PATH), exist_ok=True)
|
|
| 10 |
class PrimeTokenDB:
|
| 11 |
def __init__(self):
|
| 12 |
self.registry = self.load_registry()
|
|
|
|
| 13 |
try:
|
| 14 |
# Handle potential string keys from JSON loading
|
| 15 |
self.reverse_registry = {int(v) if isinstance(v, (int, str)) and str(v).isdigit() else v: k for k, v in self.registry.items()}
|
| 16 |
except Exception as e:
|
| 17 |
print(f"[PrimeDB] Warning rebuilding reverse registry: {e}")
|
| 18 |
self.reverse_registry = {}
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
self.next_prime = self.calculate_next_prime()
|
| 21 |
|
|
@@ -30,9 +34,37 @@ class PrimeTokenDB:
|
|
| 30 |
return {"_ROOT": 1}
|
| 31 |
return {"_ROOT": 1} # Identity
|
| 32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
def save_registry(self):
|
| 34 |
with open(REGISTRY_PATH, 'w') as f:
|
| 35 |
json.dump(self.registry, f, indent=2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
def is_prime(self, n):
|
| 38 |
"""Standard Primality Test"""
|
|
@@ -41,12 +73,38 @@ class PrimeTokenDB:
|
|
| 41 |
if n % i == 0: return False
|
| 42 |
return True
|
| 43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
def calculate_next_prime(self):
|
| 45 |
"""Finds the next available prime slot for a new token."""
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
# Ensure we look at integer values
|
| 48 |
values = [int(v) for v in self.registry.values()]
|
| 49 |
highest = max(values) if values else 1
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
candidate = highest + 1
|
| 51 |
while not self.is_prime(candidate):
|
| 52 |
candidate += 1
|
|
@@ -74,15 +132,27 @@ class PrimeTokenDB:
|
|
| 74 |
self.save_registry()
|
| 75 |
return prime
|
| 76 |
|
| 77 |
-
def encode_state(self, tokens):
|
| 78 |
"""
|
| 79 |
Converts a list of concepts (text) into a Single Unique Integer.
|
| 80 |
Example: ["AI", "Logic"] -> 3 * 5 = 15
|
|
|
|
|
|
|
|
|
|
| 81 |
"""
|
| 82 |
primes = [self.get_token_prime(t) for t in tokens]
|
| 83 |
# Calculate Product (The Composite Weight)
|
| 84 |
if not primes: return 1, []
|
| 85 |
composite = reduce(lambda x, y: x * y, primes, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
return composite, primes
|
| 87 |
|
| 88 |
def decode_state(self, composite_integer):
|
|
|
|
| 10 |
class PrimeTokenDB:
|
| 11 |
def __init__(self):
|
| 12 |
self.registry = self.load_registry()
|
| 13 |
+
self.alias_registry = self.load_alias_registry() # New: URL/Sentence -> CompositeID Map
|
| 14 |
try:
|
| 15 |
# Handle potential string keys from JSON loading
|
| 16 |
self.reverse_registry = {int(v) if isinstance(v, (int, str)) and str(v).isdigit() else v: k for k, v in self.registry.items()}
|
| 17 |
except Exception as e:
|
| 18 |
print(f"[PrimeDB] Warning rebuilding reverse registry: {e}")
|
| 19 |
self.reverse_registry = {}
|
| 20 |
+
|
| 21 |
+
# Protocol 33: Load Genesis Block BEFORE calculating next prime
|
| 22 |
+
self.load_genesis_block()
|
| 23 |
|
| 24 |
self.next_prime = self.calculate_next_prime()
|
| 25 |
|
|
|
|
| 34 |
return {"_ROOT": 1}
|
| 35 |
return {"_ROOT": 1} # Identity
|
| 36 |
|
| 37 |
+
def load_alias_registry(self):
|
| 38 |
+
"""Loads the Semantic Alias Map (URLs -> Prime Composites)"""
|
| 39 |
+
alias_path = REGISTRY_PATH.replace('prime_registry.json', 'alias_registry.json')
|
| 40 |
+
if os.path.exists(alias_path):
|
| 41 |
+
try:
|
| 42 |
+
with open(alias_path, 'r') as f:
|
| 43 |
+
return json.load(f)
|
| 44 |
+
except: return {}
|
| 45 |
+
return {}
|
| 46 |
+
|
| 47 |
def save_registry(self):
|
| 48 |
with open(REGISTRY_PATH, 'w') as f:
|
| 49 |
json.dump(self.registry, f, indent=2)
|
| 50 |
+
|
| 51 |
+
alias_path = REGISTRY_PATH.replace('prime_registry.json', 'alias_registry.json')
|
| 52 |
+
with open(alias_path, 'w') as f:
|
| 53 |
+
json.dump(self.alias_registry, f, indent=2)
|
| 54 |
+
|
| 55 |
+
def register_alias(self, source_string, composite_id):
|
| 56 |
+
"""
|
| 57 |
+
Maps a complex string (URL, Sentence) to an existing Composite ID.
|
| 58 |
+
This allows 'Source Attribution' - knowing a string implies a specific logic state.
|
| 59 |
+
"""
|
| 60 |
+
self.alias_registry[source_string] = composite_id
|
| 61 |
+
self.save_registry()
|
| 62 |
+
|
| 63 |
+
def resolve_alias(self, text):
|
| 64 |
+
"""
|
| 65 |
+
Checks if text matches a known alias. Returns Composite ID or None.
|
| 66 |
+
"""
|
| 67 |
+
return self.alias_registry.get(text)
|
| 68 |
|
| 69 |
def is_prime(self, n):
|
| 70 |
"""Standard Primality Test"""
|
|
|
|
| 73 |
if n % i == 0: return False
|
| 74 |
return True
|
| 75 |
|
| 76 |
+
def load_genesis_block(self):
|
| 77 |
+
"""
|
| 78 |
+
Protocol 33: Reserve Genesis Axioms
|
| 79 |
+
Ensures Primes [2..29] are reserved for System Concepts.
|
| 80 |
+
"""
|
| 81 |
+
try:
|
| 82 |
+
mtl_dir = os.path.dirname(os.path.dirname(__file__)) # .../logos
|
| 83 |
+
genesis_path = os.path.join(mtl_dir, "mtl", "genesis.json")
|
| 84 |
+
if os.path.exists(genesis_path):
|
| 85 |
+
with open(genesis_path, 'r') as f:
|
| 86 |
+
genesis = json.load(f)
|
| 87 |
+
for p_str, token in genesis.items():
|
| 88 |
+
p = int(p_str)
|
| 89 |
+
self.registry[token] = p
|
| 90 |
+
self.reverse_registry[p] = token
|
| 91 |
+
except Exception as e:
|
| 92 |
+
print(f"[PrimeDB] Genesis Load Error: {e}")
|
| 93 |
+
|
| 94 |
def calculate_next_prime(self):
|
| 95 |
"""Finds the next available prime slot for a new token."""
|
| 96 |
+
# Check Genesis first
|
| 97 |
+
self.load_genesis_block()
|
| 98 |
+
|
| 99 |
+
if not self.registry: return 31 # Start after Genesis
|
| 100 |
+
|
| 101 |
# Ensure we look at integer values
|
| 102 |
values = [int(v) for v in self.registry.values()]
|
| 103 |
highest = max(values) if values else 1
|
| 104 |
+
|
| 105 |
+
# Protocol 33: Hard Floor at 30
|
| 106 |
+
if highest < 30: highest = 30
|
| 107 |
+
|
| 108 |
candidate = highest + 1
|
| 109 |
while not self.is_prime(candidate):
|
| 110 |
candidate += 1
|
|
|
|
| 132 |
self.save_registry()
|
| 133 |
return prime
|
| 134 |
|
| 135 |
+
def encode_state(self, tokens, source_ref=None, meta_tensor=None):
|
| 136 |
"""
|
| 137 |
Converts a list of concepts (text) into a Single Unique Integer.
|
| 138 |
Example: ["AI", "Logic"] -> 3 * 5 = 15
|
| 139 |
+
|
| 140 |
+
source_ref: Optional string (URL) to alias this state to.
|
| 141 |
+
meta_tensor: Optional dictionary containing Vector/Gradient data.
|
| 142 |
"""
|
| 143 |
primes = [self.get_token_prime(t) for t in tokens]
|
| 144 |
# Calculate Product (The Composite Weight)
|
| 145 |
if not primes: return 1, []
|
| 146 |
composite = reduce(lambda x, y: x * y, primes, 1)
|
| 147 |
+
|
| 148 |
+
if source_ref:
|
| 149 |
+
self.register_alias(source_ref, composite)
|
| 150 |
+
|
| 151 |
+
# If meta_tensor provided, we might want to store it or return it tied to the composite
|
| 152 |
+
# For now, the system expects (composite, primes), so we maintain that contract
|
| 153 |
+
# But we stash the meta data in the alias registry for now as a hack or return it in a wrapped object?
|
| 154 |
+
# Let's keep the return signature simple for now to not break the Atomizer.
|
| 155 |
+
|
| 156 |
return composite, primes
|
| 157 |
|
| 158 |
def decode_state(self, composite_integer):
|
logos/mtl/genesis.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"1": "TIME",
|
| 3 |
+
"2": "MECHANISM",
|
| 4 |
+
"3": "RESULT",
|
| 5 |
+
"5": "CHOICE",
|
| 6 |
+
"7": "PERSIST",
|
| 7 |
+
"11": "WHY",
|
| 8 |
+
"13": "RELATE",
|
| 9 |
+
"17": "IMAGE",
|
| 10 |
+
"19": "TEXT",
|
| 11 |
+
"23": "AUDIO",
|
| 12 |
+
"29": "SIGNAL"
|
| 13 |
+
}
|
logos/mtl/interpreter.py
ADDED
|
@@ -0,0 +1,684 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
from typing import List, Union, Any
|
| 5 |
+
from logos.memory.prime_db import PrimeTokenDB
|
| 6 |
+
|
| 7 |
+
class MTLInterpreter:
|
| 8 |
+
"""
|
| 9 |
+
Protocol 33: Meta Tensor Language (MTL) Interpreter
|
| 10 |
+
Philosophy: "Arithmetic as Topology"
|
| 11 |
+
Turing Complete: via Fractran loop & Lisp recursion.
|
| 12 |
+
"""
|
| 13 |
+
def __init__(self, genesis_path: str = None):
|
| 14 |
+
self.prime_db = PrimeTokenDB()
|
| 15 |
+
self.genesis = self._load_genesis(genesis_path)
|
| 16 |
+
# Register Genesis in PrimeDB if not exists (Soft Sync)
|
| 17 |
+
self._sync_genesis()
|
| 18 |
+
|
| 19 |
+
self.memory = {} # Temporary Registers (HOLD)
|
| 20 |
+
self.functions = {} # User-Defined Functions (DEFUN)
|
| 21 |
+
self.domains = {} # Keyed Tensor Domains (Protocol 35)
|
| 22 |
+
self.active_domain = None # Current domain key (Prime)
|
| 23 |
+
|
| 24 |
+
def _load_genesis(self, path):
|
| 25 |
+
if not path: return {}
|
| 26 |
+
try:
|
| 27 |
+
with open(path, 'r') as f:
|
| 28 |
+
return json.load(f)
|
| 29 |
+
except: return {}
|
| 30 |
+
|
| 31 |
+
def _sync_genesis(self):
|
| 32 |
+
# Genesis defines [2]=TIME, etc.
|
| 33 |
+
# We assume PrimeDB might have its own mapping, but Genesis axioms are fundamental.
|
| 34 |
+
# In a real system, we might enforce these or just use them for resolution.
|
| 35 |
+
pass
|
| 36 |
+
|
| 37 |
+
def execute(self, script: str) -> Any:
|
| 38 |
+
"""
|
| 39 |
+
Parses and executes an MTL S-Expression script.
|
| 40 |
+
"""
|
| 41 |
+
tokens = self._tokenize(script)
|
| 42 |
+
ast = self._parse(tokens)
|
| 43 |
+
return self._eval(ast)
|
| 44 |
+
|
| 45 |
+
def _tokenize(self, chars: str) -> List[str]:
|
| 46 |
+
"Convert a string of characters into a list of tokens."
|
| 47 |
+
return specs_clean(chars.replace('(', ' ( ').replace(')', ' ) ').replace('[', ' [ ').replace(']', ' ] ').split())
|
| 48 |
+
|
| 49 |
+
def _parse(self, tokens: List[str]):
|
| 50 |
+
"Read an expression from a sequence of tokens."
|
| 51 |
+
if len(tokens) == 0:
|
| 52 |
+
raise SyntaxError('unexpected EOF')
|
| 53 |
+
token = tokens.pop(0)
|
| 54 |
+
if token == '(':
|
| 55 |
+
L = []
|
| 56 |
+
while tokens[0] != ')':
|
| 57 |
+
L.append(self._parse(tokens))
|
| 58 |
+
tokens.pop(0) # pop ')'
|
| 59 |
+
return L
|
| 60 |
+
elif token == ')':
|
| 61 |
+
raise SyntaxError('unexpected )')
|
| 62 |
+
elif token == '[':
|
| 63 |
+
# Tensor Address Mode - Now with RECURSIVE support
|
| 64 |
+
contents = []
|
| 65 |
+
while tokens and tokens[0] != ']':
|
| 66 |
+
t = tokens[0]
|
| 67 |
+
if t == ',':
|
| 68 |
+
tokens.pop(0)
|
| 69 |
+
continue
|
| 70 |
+
elif t == '[':
|
| 71 |
+
# RECURSIVE: Parse nested bracket
|
| 72 |
+
tokens.pop(0) # consume '['
|
| 73 |
+
nested = []
|
| 74 |
+
while tokens and tokens[0] != ']':
|
| 75 |
+
nt = tokens.pop(0)
|
| 76 |
+
if nt == ',': continue
|
| 77 |
+
nested.append(self._atom(nt))
|
| 78 |
+
if tokens: tokens.pop(0) # consume ']'
|
| 79 |
+
contents.append(nested)
|
| 80 |
+
else:
|
| 81 |
+
tokens.pop(0)
|
| 82 |
+
contents.append(self._atom(t))
|
| 83 |
+
if tokens: tokens.pop(0) # pop final ']'
|
| 84 |
+
# For Fractran: Return raw list, not tensor_addr
|
| 85 |
+
# Check if this is a "list of lists" pattern (for instructions)
|
| 86 |
+
if contents and isinstance(contents[0], list):
|
| 87 |
+
return contents # Raw list of lists
|
| 88 |
+
return ["tensor_addr"] + contents
|
| 89 |
+
else:
|
| 90 |
+
return self._atom(token)
|
| 91 |
+
|
| 92 |
+
def _atom(self, token: str):
|
| 93 |
+
"Numbers become numbers; every other token is a symbol."
|
| 94 |
+
try: return int(token)
|
| 95 |
+
except ValueError:
|
| 96 |
+
try: return float(token)
|
| 97 |
+
except ValueError:
|
| 98 |
+
return str(token)
|
| 99 |
+
|
| 100 |
+
def _eval(self, x):
|
| 101 |
+
"Evaluate an expression in an environment."
|
| 102 |
+
if isinstance(x, str): # variable reference
|
| 103 |
+
return self.memory.get(x, x)
|
| 104 |
+
if not isinstance(x, list): # constant number
|
| 105 |
+
return x
|
| 106 |
+
|
| 107 |
+
# Empty list check
|
| 108 |
+
if len(x) == 0:
|
| 109 |
+
return []
|
| 110 |
+
|
| 111 |
+
op = x[0]
|
| 112 |
+
|
| 113 |
+
# Check if 'op' is a list itself (e.g., Fractran instruction list [[5, 2], [5, 3]])
|
| 114 |
+
# In that case, this is a raw data list, not an S-expression
|
| 115 |
+
if isinstance(op, list):
|
| 116 |
+
# Recursively evaluate each element
|
| 117 |
+
return [self._eval(item) for item in x]
|
| 118 |
+
|
| 119 |
+
# --- TENSOR ADDRESS RESOLUTION ---
|
| 120 |
+
if op == "tensor_addr":
|
| 121 |
+
# [A, B, C] -> A * B * C
|
| 122 |
+
# Elements can be integers (Primes) or Strings (Concepts -> Primes)
|
| 123 |
+
factors = x[1:]
|
| 124 |
+
product = 1
|
| 125 |
+
for f in factors:
|
| 126 |
+
val = self._eval(f) # Resolve variables or nested logic
|
| 127 |
+
|
| 128 |
+
# If val is a Prime Composite (int)
|
| 129 |
+
if isinstance(val, int):
|
| 130 |
+
product *= val
|
| 131 |
+
elif isinstance(val, str):
|
| 132 |
+
# Lookup in PrimeDB
|
| 133 |
+
# Clean up commas if any leached through (naive parser fix)
|
| 134 |
+
val = val.replace(',', '')
|
| 135 |
+
if not val: continue
|
| 136 |
+
# Explicit mapping check for Genesis
|
| 137 |
+
# Reverse lookup genesis? Or just use PrimeDB
|
| 138 |
+
prime = self.prime_db.get_token_prime(val)
|
| 139 |
+
product *= prime
|
| 140 |
+
return product
|
| 141 |
+
|
| 142 |
+
# --- ARITHMETIC TOPOLOGY (FRACTRAN) ---
|
| 143 |
+
if op == 'mult':
|
| 144 |
+
a = self._eval(x[1])
|
| 145 |
+
b = self._eval(x[2])
|
| 146 |
+
|
| 147 |
+
# Hadamard Product: [A,B] * [C,D] = [A*C, B*D]
|
| 148 |
+
if isinstance(a, list) and isinstance(b, list):
|
| 149 |
+
# Element-wise multiplication (zip shortest)
|
| 150 |
+
return [ai * bi for ai, bi in zip(a, b)]
|
| 151 |
+
|
| 152 |
+
# Scalar * List = Broadcast
|
| 153 |
+
if isinstance(a, list) and isinstance(b, int):
|
| 154 |
+
return [ai * b for ai in a]
|
| 155 |
+
if isinstance(a, int) and isinstance(b, list):
|
| 156 |
+
return [a * bi for bi in b]
|
| 157 |
+
|
| 158 |
+
# Standard scalar multiplication
|
| 159 |
+
return a * b
|
| 160 |
+
|
| 161 |
+
# --- CAST (Batch Operation) ---
|
| 162 |
+
if op == 'cast':
|
| 163 |
+
# (cast op list1 list2) -> Apply op element-wise
|
| 164 |
+
# More flexible than mult - can use any binary op
|
| 165 |
+
op_name = x[1]
|
| 166 |
+
list_a = self._eval(x[2])
|
| 167 |
+
list_b = self._eval(x[3])
|
| 168 |
+
|
| 169 |
+
if not isinstance(list_a, list): list_a = [list_a]
|
| 170 |
+
if not isinstance(list_b, list): list_b = [list_b]
|
| 171 |
+
|
| 172 |
+
results = []
|
| 173 |
+
for ai, bi in zip(list_a, list_b):
|
| 174 |
+
# Build and evaluate: (op ai bi)
|
| 175 |
+
call = [op_name, ai, bi]
|
| 176 |
+
results.append(self._eval(call))
|
| 177 |
+
return results
|
| 178 |
+
|
| 179 |
+
if op == 'div':
|
| 180 |
+
# Integer division
|
| 181 |
+
numerator = self._eval(x[1])
|
| 182 |
+
denominator = self._eval(x[2])
|
| 183 |
+
if denominator == 0: return 0
|
| 184 |
+
return numerator // denominator
|
| 185 |
+
|
| 186 |
+
if op == 'factor':
|
| 187 |
+
# Return list of factors
|
| 188 |
+
val = self._eval(x[1])
|
| 189 |
+
# Use PrimeDB's decode (simplified here or call out)
|
| 190 |
+
return self.prime_db.decode_state(val) # Returns list of tokens (strings)
|
| 191 |
+
# But maybe we want the numbers?
|
| 192 |
+
# Protocol says "Explodes into prime roots". Let's return the INT factors.
|
| 193 |
+
# We need a new method in PrimeDB or just a util here.
|
| 194 |
+
# For now, let's just return the conceptual trace
|
| 195 |
+
return self.prime_db.decode_state(val)
|
| 196 |
+
|
| 197 |
+
# --- MEMORY & ROUTING ---
|
| 198 |
+
if op == 'route':
|
| 199 |
+
data = self._eval(x[1])
|
| 200 |
+
target_node = self._eval(x[2])
|
| 201 |
+
print(f"π [MTL ROUTER] Transporting '{data}' -> Node [{target_node}]")
|
| 202 |
+
return target_node
|
| 203 |
+
|
| 204 |
+
if op == 'hold':
|
| 205 |
+
# Spec: H_i[K_n]
|
| 206 |
+
# (hold [Key] [Value])
|
| 207 |
+
if len(x) == 3:
|
| 208 |
+
var = x[1]
|
| 209 |
+
val = self._eval(x[2])
|
| 210 |
+
self.memory[var] = val
|
| 211 |
+
return val
|
| 212 |
+
return None
|
| 213 |
+
|
| 214 |
+
# --- EXPANDED OPERATIONS (Handwritten Spec) ---
|
| 215 |
+
|
| 216 |
+
if op == 'index':
|
| 217 |
+
# I[K]_n -> return i-th factor of K
|
| 218 |
+
# (index [K] [i])
|
| 219 |
+
K = self._eval(x[1])
|
| 220 |
+
i = self._eval(x[2])
|
| 221 |
+
factors = self.prime_db.decode_state(K) # returns list
|
| 222 |
+
if 0 <= i < len(factors):
|
| 223 |
+
return factors[i]
|
| 224 |
+
return 0 # Null factor
|
| 225 |
+
|
| 226 |
+
if op == 'delta':
|
| 227 |
+
# Delta[Ka, Ki] -> return abs(Kn - Ki)
|
| 228 |
+
# (delta [A] [B])
|
| 229 |
+
A = self._eval(x[1])
|
| 230 |
+
B = self._eval(x[2])
|
| 231 |
+
return abs(A - B)
|
| 232 |
+
|
| 233 |
+
if op == 'grab':
|
| 234 |
+
# G[Ki, Kn] H[K] -> return/eval H[Ki, Kn]
|
| 235 |
+
# (grab [Func] [Args]) -> Apply function?
|
| 236 |
+
# In MTL lisp: (grab (lambda...) [args]) matches (apply)
|
| 237 |
+
# Simplified: (grab [Action] [Object]) -> Route/Execute
|
| 238 |
+
# Let's map it to recovering the Function from the Prime ID if possible
|
| 239 |
+
# Or simpler: Just return the evaluation of the argument
|
| 240 |
+
return self._eval(x[1])
|
| 241 |
+
|
| 242 |
+
if op == 'connect':
|
| 243 |
+
# X[Ki, Kn] -> return/build [Ki(Kn)] -> [K]
|
| 244 |
+
# (connect [A] [B]) -> A * B (Mult alias)
|
| 245 |
+
return self._eval(x[1]) * self._eval(x[2])
|
| 246 |
+
|
| 247 |
+
# =====================================================
|
| 248 |
+
# SYNAPTIC OPERATIONS (Protocol 39 - Prime [13])
|
| 249 |
+
# =====================================================
|
| 250 |
+
|
| 251 |
+
if op == 'relate':
|
| 252 |
+
# Create a Synapse (Link) between two atoms
|
| 253 |
+
# Synapse = A * B * 13 (RELATE factor)
|
| 254 |
+
# (relate A B) -> A * B * 13
|
| 255 |
+
a = self._eval(x[1])
|
| 256 |
+
b = self._eval(x[2])
|
| 257 |
+
synapse = a * b * 13 # [13] is RELATE prime
|
| 258 |
+
return synapse
|
| 259 |
+
|
| 260 |
+
if op == 'trace':
|
| 261 |
+
# Traceability: Check if a synapse contains a reference to atom
|
| 262 |
+
# (trace synapse atom) -> 1 if synapse % atom == 0, else 0
|
| 263 |
+
import math
|
| 264 |
+
synapse = self._eval(x[1])
|
| 265 |
+
atom = self._eval(x[2])
|
| 266 |
+
# Check if atom is a factor of synapse
|
| 267 |
+
if synapse % atom == 0:
|
| 268 |
+
return atom # Return the traced atom (confirms presence)
|
| 269 |
+
return 0
|
| 270 |
+
|
| 271 |
+
if op == 'dissolve-link':
|
| 272 |
+
# Remove the RELATE factor to get the raw pair
|
| 273 |
+
# (dissolve-link synapse) -> synapse / 13
|
| 274 |
+
synapse = self._eval(x[1])
|
| 275 |
+
if synapse % 13 == 0:
|
| 276 |
+
return synapse // 13
|
| 277 |
+
return synapse # Not a synapse, return as-is
|
| 278 |
+
|
| 279 |
+
if op == 'get-linked':
|
| 280 |
+
# Given a synapse and one atom, find the other
|
| 281 |
+
# (get-linked synapse known_atom) -> other_atom
|
| 282 |
+
synapse = self._eval(x[1])
|
| 283 |
+
known = self._eval(x[2])
|
| 284 |
+
# Synapse = A * B * 13
|
| 285 |
+
# If we know A, then B = Synapse / (A * 13)
|
| 286 |
+
if synapse % (known * 13) == 0:
|
| 287 |
+
return synapse // (known * 13)
|
| 288 |
+
return 0
|
| 289 |
+
|
| 290 |
+
# =====================================================
|
| 291 |
+
# LOGIC GATES: Tensor Topology Operations (Protocol 37)
|
| 292 |
+
# =====================================================
|
| 293 |
+
|
| 294 |
+
if op == 'or':
|
| 295 |
+
# =====================================================
|
| 296 |
+
# OR GATE: Superposition / Unified Manifold (LCM)
|
| 297 |
+
# =====================================================
|
| 298 |
+
# O(A, B) = LCM(A, B) = |A * B| / GCD(A, B)
|
| 299 |
+
# Returns the smallest manifold containing BOTH inputs
|
| 300 |
+
# Example: O(2, 3) = 6 ("Red OR Blue = Purple")
|
| 301 |
+
|
| 302 |
+
import math
|
| 303 |
+
a = self._eval(x[1])
|
| 304 |
+
b = self._eval(x[2])
|
| 305 |
+
|
| 306 |
+
# Handle lists: Element-wise LCM
|
| 307 |
+
if isinstance(a, list) and isinstance(b, list):
|
| 308 |
+
return [abs(ai * bi) // math.gcd(ai, bi) if ai and bi else 0
|
| 309 |
+
for ai, bi in zip(a, b)]
|
| 310 |
+
|
| 311 |
+
# Handle scalars
|
| 312 |
+
if isinstance(a, int) and isinstance(b, int):
|
| 313 |
+
if a == 0 or b == 0:
|
| 314 |
+
return 0
|
| 315 |
+
return abs(a * b) // math.gcd(a, b)
|
| 316 |
+
|
| 317 |
+
# Fallback: Product (creates shared space)
|
| 318 |
+
return a * b if isinstance(a, int) and isinstance(b, int) else [a, b]
|
| 319 |
+
|
| 320 |
+
if op == 'and':
|
| 321 |
+
# =====================================================
|
| 322 |
+
# AND GATE: Intersection / Common Factor (GCD)
|
| 323 |
+
# =====================================================
|
| 324 |
+
# A(A, B) = GCD(A, B)
|
| 325 |
+
# Returns the largest factor shared by BOTH inputs
|
| 326 |
+
# Example: A(6, 10) = 2 ("What do Flip and Around share? Mechanism.")
|
| 327 |
+
|
| 328 |
+
import math
|
| 329 |
+
a = self._eval(x[1])
|
| 330 |
+
b = self._eval(x[2])
|
| 331 |
+
|
| 332 |
+
# Handle lists: Element-wise GCD
|
| 333 |
+
if isinstance(a, list) and isinstance(b, list):
|
| 334 |
+
return [math.gcd(ai, bi) for ai, bi in zip(a, b)]
|
| 335 |
+
|
| 336 |
+
# Handle scalars
|
| 337 |
+
if isinstance(a, int) and isinstance(b, int):
|
| 338 |
+
return math.gcd(a, b)
|
| 339 |
+
|
| 340 |
+
return 0
|
| 341 |
+
|
| 342 |
+
if op == 'not':
|
| 343 |
+
# =====================================================
|
| 344 |
+
# NOT GATE: Structural Steering Mechanism (Protocol 36)
|
| 345 |
+
# =====================================================
|
| 346 |
+
# N(A)[A,B] β returns [B] (If match, redirect to second)
|
| 347 |
+
# N(A)[B,C,A] β returns [B(C)] (If match at end, apply B to C)
|
| 348 |
+
#
|
| 349 |
+
# This is NOT a binary inverter but a pattern-matching redirector
|
| 350 |
+
# for constrained navigation in tensor space.
|
| 351 |
+
|
| 352 |
+
key = self._eval(x[1]) # The steering key (A)
|
| 353 |
+
args = x[2:] # The tensor list to search [A,B] or [B,C,A]
|
| 354 |
+
|
| 355 |
+
# Evaluate all args
|
| 356 |
+
evaluated = [self._eval(a) for a in args]
|
| 357 |
+
|
| 358 |
+
# Case 1: N(A)[A,B] β If key matches first element, return second
|
| 359 |
+
if len(evaluated) >= 2 and evaluated[0] == key:
|
| 360 |
+
return evaluated[1]
|
| 361 |
+
|
| 362 |
+
# Case 2: N(A)[B,C,A] β If key matches LAST element, return B(C)
|
| 363 |
+
if len(evaluated) >= 3 and evaluated[-1] == key:
|
| 364 |
+
# Apply first element as function to second element
|
| 365 |
+
B = evaluated[0]
|
| 366 |
+
C = evaluated[1]
|
| 367 |
+
|
| 368 |
+
# If B is a function name (string), call it with C
|
| 369 |
+
if isinstance(B, str) and B in self.functions:
|
| 370 |
+
return self._eval([B, C])
|
| 371 |
+
|
| 372 |
+
# If B is callable operation (int), apply as multiplier
|
| 373 |
+
if isinstance(B, int) and isinstance(C, int):
|
| 374 |
+
return B * C
|
| 375 |
+
|
| 376 |
+
# If B is a list, apply element-wise with C
|
| 377 |
+
if isinstance(B, list) and isinstance(C, (int, list)):
|
| 378 |
+
return self._eval(['mult', B, C])
|
| 379 |
+
|
| 380 |
+
# Default: Return tuple/nested structure [B, C]
|
| 381 |
+
return [B, C]
|
| 382 |
+
|
| 383 |
+
# Case 3: No match β Return first argument (default path)
|
| 384 |
+
return evaluated[0] if evaluated else 0
|
| 385 |
+
|
| 386 |
+
if op == 'select':
|
| 387 |
+
# Tuning model responses
|
| 388 |
+
# S(arg)[K, n, i]
|
| 389 |
+
# (select [Options] [Index])
|
| 390 |
+
opts = self._eval(x[1])
|
| 391 |
+
idx = self._eval(x[2])
|
| 392 |
+
if isinstance(opts, list) and 0 <= idx < len(opts):
|
| 393 |
+
return opts[idx]
|
| 394 |
+
return opts
|
| 395 |
+
|
| 396 |
+
if op == 'bind':
|
| 397 |
+
# B(arg)[K] -> Encode -> H_B[K]
|
| 398 |
+
# (bind "Text" [Context])
|
| 399 |
+
content = x[1] # Raw literal usually
|
| 400 |
+
context = self._eval(x[2])
|
| 401 |
+
# 1. Encode content to Prime
|
| 402 |
+
# We need to call PrimeDB encode
|
| 403 |
+
# This is "Atomizing" on the fly
|
| 404 |
+
composite, _ = self.prime_db.encode_state([str(content)])
|
| 405 |
+
# 2. Bind to Context (Mult)
|
| 406 |
+
bound = composite * context
|
| 407 |
+
return bound
|
| 408 |
+
|
| 409 |
+
if op == 'position':
|
| 410 |
+
# P[K, i] ... Permutation
|
| 411 |
+
# (position [K]) -> Returns Prime Factors Vector/List
|
| 412 |
+
K = self._eval(x[1])
|
| 413 |
+
return self.prime_db.decode_state(K)
|
| 414 |
+
|
| 415 |
+
# =====================================================
|
| 416 |
+
# TENSOR LIST OPERATIONS (Protocol 35)
|
| 417 |
+
# =====================================================
|
| 418 |
+
|
| 419 |
+
# --- DOMAIN (Set Active Domain) ---
|
| 420 |
+
if op == 'domain':
|
| 421 |
+
# (domain [KEY]) -> Sets active domain, returns key
|
| 422 |
+
# All subsequent list ops are scoped to this domain
|
| 423 |
+
key = self._eval(x[1])
|
| 424 |
+
self.active_domain = key
|
| 425 |
+
if key not in self.domains:
|
| 426 |
+
self.domains[key] = {} # Initialize empty domain space
|
| 427 |
+
return key
|
| 428 |
+
|
| 429 |
+
# --- IN-DOMAIN (Execute within Domain) ---
|
| 430 |
+
if op == 'in-domain':
|
| 431 |
+
# (in-domain [KEY] body) -> Execute body within domain, then restore
|
| 432 |
+
key = self._eval(x[1])
|
| 433 |
+
old_domain = self.active_domain
|
| 434 |
+
self.active_domain = key
|
| 435 |
+
if key not in self.domains:
|
| 436 |
+
self.domains[key] = {}
|
| 437 |
+
result = self._eval(x[2])
|
| 438 |
+
self.active_domain = old_domain # Restore
|
| 439 |
+
return result
|
| 440 |
+
|
| 441 |
+
# --- GET-DOMAIN (Retrieve Domain Contents) ---
|
| 442 |
+
if op == 'get-domain':
|
| 443 |
+
# (get-domain [KEY]) -> Returns all tensors in domain
|
| 444 |
+
key = self._eval(x[1]) if len(x) > 1 else self.active_domain
|
| 445 |
+
return self.domains.get(key, {})
|
| 446 |
+
|
| 447 |
+
# --- STORE (Store tensor in active domain) ---
|
| 448 |
+
if op == 'store':
|
| 449 |
+
# (store name value) -> Stores in active domain
|
| 450 |
+
if self.active_domain is None:
|
| 451 |
+
return 0 # No domain active
|
| 452 |
+
name = x[1] if isinstance(x[1], str) else str(x[1])
|
| 453 |
+
value = self._eval(x[2])
|
| 454 |
+
self.domains[self.active_domain][name] = value
|
| 455 |
+
return value
|
| 456 |
+
|
| 457 |
+
# --- FETCH (Retrieve from active domain) ---
|
| 458 |
+
if op == 'fetch':
|
| 459 |
+
# (fetch name) -> Gets from active domain
|
| 460 |
+
if self.active_domain is None:
|
| 461 |
+
return 0
|
| 462 |
+
name = x[1] if isinstance(x[1], str) else str(x[1])
|
| 463 |
+
return self.domains[self.active_domain].get(name, 0)
|
| 464 |
+
|
| 465 |
+
# --- LIST CONSTRUCTOR ---
|
| 466 |
+
if op == 'list':
|
| 467 |
+
# (list a b c) -> [a, b, c]
|
| 468 |
+
return [self._eval(item) for item in x[1:]]
|
| 469 |
+
|
| 470 |
+
# --- CAR (First Element) ---
|
| 471 |
+
if op == 'car':
|
| 472 |
+
# (car [a b c]) -> a
|
| 473 |
+
lst = self._eval(x[1])
|
| 474 |
+
if isinstance(lst, list) and len(lst) > 0:
|
| 475 |
+
return lst[0]
|
| 476 |
+
return 0
|
| 477 |
+
|
| 478 |
+
# --- CDR (Rest of List) ---
|
| 479 |
+
if op == 'cdr':
|
| 480 |
+
# (cdr [a b c]) -> [b c]
|
| 481 |
+
lst = self._eval(x[1])
|
| 482 |
+
if isinstance(lst, list) and len(lst) > 1:
|
| 483 |
+
return lst[1:]
|
| 484 |
+
return []
|
| 485 |
+
|
| 486 |
+
# --- CONS (Prepend) ---
|
| 487 |
+
if op == 'cons':
|
| 488 |
+
# (cons elem [list]) -> [elem, ...list]
|
| 489 |
+
elem = self._eval(x[1])
|
| 490 |
+
lst = self._eval(x[2])
|
| 491 |
+
if isinstance(lst, list):
|
| 492 |
+
return [elem] + lst
|
| 493 |
+
return [elem, lst]
|
| 494 |
+
|
| 495 |
+
# --- SWAP (Exchange positions) ---
|
| 496 |
+
if op == 'swap':
|
| 497 |
+
# (swap [list] i j) -> list with positions i,j swapped
|
| 498 |
+
lst = self._eval(x[1])
|
| 499 |
+
i = self._eval(x[2])
|
| 500 |
+
j = self._eval(x[3])
|
| 501 |
+
if isinstance(lst, list) and 0 <= i < len(lst) and 0 <= j < len(lst):
|
| 502 |
+
result = lst.copy()
|
| 503 |
+
result[i], result[j] = result[j], result[i]
|
| 504 |
+
return result
|
| 505 |
+
return lst
|
| 506 |
+
|
| 507 |
+
# --- MOVE (Tensor Navigation) ---
|
| 508 |
+
if op == 'move':
|
| 509 |
+
# (move [tensor_list] direction)
|
| 510 |
+
# direction: 'left', 'right', 'up', 'down' or prime factor
|
| 511 |
+
# Rotates list or navigates topology
|
| 512 |
+
lst = self._eval(x[1])
|
| 513 |
+
direction = self._eval(x[2]) if len(x) > 2 else 'right'
|
| 514 |
+
|
| 515 |
+
if isinstance(lst, list) and len(lst) > 0:
|
| 516 |
+
if direction == 'right' or direction == 2: # MECHANISM = rotate
|
| 517 |
+
return lst[1:] + [lst[0]] # Rotate left (move right)
|
| 518 |
+
elif direction == 'left' or direction == 3: # RESULT = rotate back
|
| 519 |
+
return [lst[-1]] + lst[:-1] # Rotate right (move left)
|
| 520 |
+
elif isinstance(direction, int):
|
| 521 |
+
# Prime-based navigation: multiply each element
|
| 522 |
+
return [e * direction if isinstance(e, int) else e for e in lst]
|
| 523 |
+
return lst
|
| 524 |
+
|
| 525 |
+
# --- NTH (Index Access) ---
|
| 526 |
+
if op == 'nth':
|
| 527 |
+
# (nth [list] i) -> list[i]
|
| 528 |
+
lst = self._eval(x[1])
|
| 529 |
+
i = self._eval(x[2])
|
| 530 |
+
if isinstance(lst, list) and 0 <= i < len(lst):
|
| 531 |
+
return lst[i]
|
| 532 |
+
return 0
|
| 533 |
+
|
| 534 |
+
# --- LENGTH ---
|
| 535 |
+
if op == 'length':
|
| 536 |
+
# (length [list]) -> count
|
| 537 |
+
lst = self._eval(x[1])
|
| 538 |
+
if isinstance(lst, list):
|
| 539 |
+
return len(lst)
|
| 540 |
+
return 1
|
| 541 |
+
|
| 542 |
+
# --- MAP (Apply function to list) ---
|
| 543 |
+
if op == 'map':
|
| 544 |
+
# (map func [list])
|
| 545 |
+
func_name = x[1]
|
| 546 |
+
lst = self._eval(x[2])
|
| 547 |
+
if isinstance(lst, list) and func_name in self.functions:
|
| 548 |
+
results = []
|
| 549 |
+
for item in lst:
|
| 550 |
+
# Build function call: (func_name item)
|
| 551 |
+
call = [func_name, item]
|
| 552 |
+
results.append(self._eval(call))
|
| 553 |
+
return results
|
| 554 |
+
return lst
|
| 555 |
+
|
| 556 |
+
# --- REDUCE (Fold list with function) ---
|
| 557 |
+
if op == 'reduce':
|
| 558 |
+
# (reduce func [list] initial)
|
| 559 |
+
func_name = x[1]
|
| 560 |
+
lst = self._eval(x[2])
|
| 561 |
+
acc = self._eval(x[3]) if len(x) > 3 else 0
|
| 562 |
+
if isinstance(lst, list) and func_name in self.functions:
|
| 563 |
+
for item in lst:
|
| 564 |
+
# Build: (func_name acc item)
|
| 565 |
+
call = [func_name, acc, item]
|
| 566 |
+
acc = self._eval(call)
|
| 567 |
+
return acc
|
| 568 |
+
|
| 569 |
+
# =====================================================
|
| 570 |
+
# TURING COMPLETE PRIMITIVES (Protocol 34)
|
| 571 |
+
# =====================================================
|
| 572 |
+
|
| 573 |
+
# --- FRACTRAN LOOP (Conway's Register Machine) ---
|
| 574 |
+
if op == 'fractran':
|
| 575 |
+
# (fractran [[P1 Q1] [P2 Q2] ...] [InitialState])
|
| 576 |
+
# Strict Conway: Restart scan from beginning after each application
|
| 577 |
+
instructions = self._eval(x[1]) # List of [Numerator, Denominator]
|
| 578 |
+
N = self._eval(x[2]) # Initial State
|
| 579 |
+
|
| 580 |
+
if not isinstance(instructions, list):
|
| 581 |
+
return N # No instructions, return state
|
| 582 |
+
|
| 583 |
+
max_iterations = 10000 # Safety limit
|
| 584 |
+
iteration = 0
|
| 585 |
+
|
| 586 |
+
while iteration < max_iterations:
|
| 587 |
+
applied = False
|
| 588 |
+
for instr in instructions:
|
| 589 |
+
if isinstance(instr, list) and len(instr) >= 2:
|
| 590 |
+
P = instr[0] # Numerator
|
| 591 |
+
Q = instr[1] # Denominator
|
| 592 |
+
|
| 593 |
+
# Check: Is N divisible by Q?
|
| 594 |
+
if Q != 0 and N % Q == 0:
|
| 595 |
+
N = (N * P) // Q
|
| 596 |
+
applied = True
|
| 597 |
+
break # CRITICAL: Restart scan from beginning
|
| 598 |
+
|
| 599 |
+
if not applied:
|
| 600 |
+
break # Halt: No fraction applies
|
| 601 |
+
iteration += 1
|
| 602 |
+
|
| 603 |
+
return N
|
| 604 |
+
|
| 605 |
+
# --- DIVISIBILITY PREDICATE ---
|
| 606 |
+
if op == 'divisible?':
|
| 607 |
+
# (divisible? N D) -> 1 if N % D == 0, else 0
|
| 608 |
+
N = self._eval(x[1])
|
| 609 |
+
D = self._eval(x[2])
|
| 610 |
+
if D == 0: return 0
|
| 611 |
+
return 1 if N % D == 0 else 0
|
| 612 |
+
|
| 613 |
+
# --- CONDITIONAL (IF) ---
|
| 614 |
+
if op == 'if':
|
| 615 |
+
# (if condition then else)
|
| 616 |
+
condition = self._eval(x[1])
|
| 617 |
+
# Truthy: Non-zero integer, non-empty list
|
| 618 |
+
if condition and condition != 0:
|
| 619 |
+
return self._eval(x[2])
|
| 620 |
+
else:
|
| 621 |
+
if len(x) > 3:
|
| 622 |
+
return self._eval(x[3])
|
| 623 |
+
return 0
|
| 624 |
+
|
| 625 |
+
# --- CONDITIONAL (COND) ---
|
| 626 |
+
if op == 'cond':
|
| 627 |
+
# (cond (pred1 result1) (pred2 result2) ...)
|
| 628 |
+
for clause in x[1:]:
|
| 629 |
+
if isinstance(clause, list) and len(clause) >= 2:
|
| 630 |
+
predicate = self._eval(clause[0])
|
| 631 |
+
if predicate and predicate != 0:
|
| 632 |
+
return self._eval(clause[1])
|
| 633 |
+
return 0 # No clause matched
|
| 634 |
+
|
| 635 |
+
# --- FUNCTION DEFINITION (DEFUN) ---
|
| 636 |
+
if op == 'defun':
|
| 637 |
+
# (defun name (arg1 arg2) body)
|
| 638 |
+
name = x[1]
|
| 639 |
+
params = x[2] # Should be a list of param names
|
| 640 |
+
body = x[3]
|
| 641 |
+
self.functions[name] = {'params': params, 'body': body}
|
| 642 |
+
return name # Return function name as confirmation
|
| 643 |
+
|
| 644 |
+
# --- FUNCTION CALL ---
|
| 645 |
+
# Check if op is a defined function
|
| 646 |
+
if op in self.functions:
|
| 647 |
+
func = self.functions[op]
|
| 648 |
+
params = func['params']
|
| 649 |
+
body = func['body']
|
| 650 |
+
|
| 651 |
+
# Bind arguments to parameters in memory
|
| 652 |
+
old_memory = self.memory.copy() # Save state for immutability
|
| 653 |
+
for i, param in enumerate(params):
|
| 654 |
+
if i + 1 < len(x):
|
| 655 |
+
self.memory[param] = self._eval(x[i + 1])
|
| 656 |
+
|
| 657 |
+
result = self._eval(body)
|
| 658 |
+
|
| 659 |
+
# Restore memory (Immutable Style)
|
| 660 |
+
self.memory = old_memory
|
| 661 |
+
return result
|
| 662 |
+
|
| 663 |
+
# --- ARITHMETIC HELPERS ---
|
| 664 |
+
if op == 'add':
|
| 665 |
+
return self._eval(x[1]) + self._eval(x[2])
|
| 666 |
+
|
| 667 |
+
if op == 'sub':
|
| 668 |
+
return self._eval(x[1]) - self._eval(x[2])
|
| 669 |
+
|
| 670 |
+
if op == 'eq?':
|
| 671 |
+
return 1 if self._eval(x[1]) == self._eval(x[2]) else 0
|
| 672 |
+
|
| 673 |
+
if op == 'gt?':
|
| 674 |
+
return 1 if self._eval(x[1]) > self._eval(x[2]) else 0
|
| 675 |
+
|
| 676 |
+
if op == 'lt?':
|
| 677 |
+
return 1 if self._eval(x[1]) < self._eval(x[2]) else 0
|
| 678 |
+
|
| 679 |
+
# --- FALLBACK ---
|
| 680 |
+
return [self._eval(exp) for exp in x]
|
| 681 |
+
|
| 682 |
+
# Helper
|
| 683 |
+
def specs_clean(tokens):
|
| 684 |
+
return [t for t in tokens if t != '']
|
logos/spcw_transceiver.py
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LOGOS SPCW Transceiver (Protocol 41)
|
| 3 |
+
Scalar Prime Composite Wave - Binary Data Transport
|
| 4 |
+
|
| 5 |
+
The Atom Structure:
|
| 6 |
+
- Heat Code (Header): Prime integer encoding type/location/complexity
|
| 7 |
+
- Wave Payload (Body): Actual binary data (512-byte chunks)
|
| 8 |
+
|
| 9 |
+
Key Insight: Heat is DERIVED from Wave content, not arbitrary.
|
| 10 |
+
The checksum/hash of the payload determines its routing address.
|
| 11 |
+
|
| 12 |
+
Protocol:
|
| 13 |
+
1. CHUNKING: Break file into 512-byte atoms
|
| 14 |
+
2. HEATING: Calculate Meta Heat from chunk content
|
| 15 |
+
3. HARMONIZATION: Derive prime factors from content hash
|
| 16 |
+
4. TRANSMISSION: Route via prime factorization
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
import os
|
| 20 |
+
import hashlib
|
| 21 |
+
import math
|
| 22 |
+
from typing import List, Dict, Tuple, BinaryIO
|
| 23 |
+
from dataclasses import dataclass
|
| 24 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
# Atom size in bytes (matches SPCW spec)
|
| 28 |
+
ATOM_SIZE = 512
|
| 29 |
+
|
| 30 |
+
# Prime basis for heat calculation
|
| 31 |
+
HEAT_PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
|
| 32 |
+
|
| 33 |
+
|
| 34 |
+
@dataclass
|
| 35 |
+
class Atom:
|
| 36 |
+
"""
|
| 37 |
+
The fundamental unit of SPCW transport.
|
| 38 |
+
Binds Heat (address) to Wave (payload) mathematically.
|
| 39 |
+
"""
|
| 40 |
+
index: int # Position in stream
|
| 41 |
+
heat_code: int # Prime composite (routing address)
|
| 42 |
+
wave_payload: bytes # Raw binary data (max 512 bytes)
|
| 43 |
+
entropy: float # Shannon entropy of payload
|
| 44 |
+
checksum: str # MD5 of payload (for verification)
|
| 45 |
+
|
| 46 |
+
@property
|
| 47 |
+
def size(self) -> int:
|
| 48 |
+
return len(self.wave_payload)
|
| 49 |
+
|
| 50 |
+
@property
|
| 51 |
+
def factors(self) -> List[int]:
|
| 52 |
+
"""Prime factorization of heat code."""
|
| 53 |
+
return _factorize(self.heat_code)
|
| 54 |
+
|
| 55 |
+
def __repr__(self):
|
| 56 |
+
return f"Atom({self.index}, heat={self.heat_code}, size={self.size}, entropy={self.entropy:.2f})"
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
class SPCWTransceiver:
|
| 60 |
+
"""
|
| 61 |
+
The SPCW Binary Transport Layer.
|
| 62 |
+
Handles injection and extraction of real data.
|
| 63 |
+
"""
|
| 64 |
+
|
| 65 |
+
def __init__(self):
|
| 66 |
+
self.mtl = MTLInterpreter()
|
| 67 |
+
self.atom_registry = {} # heat_code -> Atom
|
| 68 |
+
self.stream_buffer = [] # Ordered atoms for reconstruction
|
| 69 |
+
|
| 70 |
+
def inject(self, filepath: str) -> Dict:
|
| 71 |
+
"""
|
| 72 |
+
Inject a file into the LOGOS manifold.
|
| 73 |
+
Returns injection report with atom stream.
|
| 74 |
+
"""
|
| 75 |
+
if not os.path.exists(filepath):
|
| 76 |
+
raise FileNotFoundError(f"Cannot inject: {filepath}")
|
| 77 |
+
|
| 78 |
+
filename = os.path.basename(filepath)
|
| 79 |
+
ext = os.path.splitext(filename)[1].lower()
|
| 80 |
+
file_size = os.path.getsize(filepath)
|
| 81 |
+
|
| 82 |
+
print(f"\n{'='*60}")
|
| 83 |
+
print(f" SPCW INJECTION: {filename}")
|
| 84 |
+
print(f"{'='*60}")
|
| 85 |
+
print(f" Size: {file_size} bytes")
|
| 86 |
+
print(f" Type: {ext}")
|
| 87 |
+
|
| 88 |
+
# Determine type prime from extension
|
| 89 |
+
type_prime = self._ext_to_prime(ext)
|
| 90 |
+
print(f" Type Prime: [{type_prime}]")
|
| 91 |
+
|
| 92 |
+
# Read and chunk the file
|
| 93 |
+
atoms = []
|
| 94 |
+
with open(filepath, 'rb') as f:
|
| 95 |
+
chunk_index = 0
|
| 96 |
+
while True:
|
| 97 |
+
chunk = f.read(ATOM_SIZE)
|
| 98 |
+
if not chunk:
|
| 99 |
+
break
|
| 100 |
+
|
| 101 |
+
atom = self._create_atom(chunk, chunk_index, type_prime)
|
| 102 |
+
atoms.append(atom)
|
| 103 |
+
|
| 104 |
+
# Register in MTL domain based on heat
|
| 105 |
+
domain = type_prime * 100 # e.g., IMAGE -> 1700
|
| 106 |
+
self.mtl.execute(f'(domain [{domain}])')
|
| 107 |
+
self.mtl.execute(f'(store atom_{atom.heat_code} {atom.heat_code})')
|
| 108 |
+
|
| 109 |
+
chunk_index += 1
|
| 110 |
+
|
| 111 |
+
# Calculate stream statistics
|
| 112 |
+
total_heat = sum(a.heat_code for a in atoms)
|
| 113 |
+
avg_entropy = sum(a.entropy for a in atoms) / len(atoms) if atoms else 0
|
| 114 |
+
|
| 115 |
+
print(f"\n[CHUNKING] Created {len(atoms)} atoms")
|
| 116 |
+
print(f"[HEATING] Total Meta Heat: {total_heat}")
|
| 117 |
+
print(f"[ENTROPY] Average: {avg_entropy:.3f}")
|
| 118 |
+
|
| 119 |
+
# Store stream metadata
|
| 120 |
+
stream_id = self._hash_to_prime(hashlib.md5(open(filepath, 'rb').read()).hexdigest())
|
| 121 |
+
self.stream_buffer = atoms
|
| 122 |
+
|
| 123 |
+
report = {
|
| 124 |
+
'filename': filename,
|
| 125 |
+
'stream_id': stream_id,
|
| 126 |
+
'type_prime': type_prime,
|
| 127 |
+
'atom_count': len(atoms),
|
| 128 |
+
'total_heat': total_heat,
|
| 129 |
+
'avg_entropy': avg_entropy,
|
| 130 |
+
'atoms': atoms
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
print(f"\n[STREAM ID] {stream_id}")
|
| 134 |
+
print(f"[OK] Injection Complete")
|
| 135 |
+
|
| 136 |
+
return report
|
| 137 |
+
|
| 138 |
+
def extract(self, stream_id: int = None) -> bytes:
|
| 139 |
+
"""
|
| 140 |
+
Extract and reconstruct a file from atom stream.
|
| 141 |
+
"""
|
| 142 |
+
if not self.stream_buffer:
|
| 143 |
+
print("[!] No stream in buffer")
|
| 144 |
+
return b''
|
| 145 |
+
|
| 146 |
+
# Sort by index and concatenate payloads
|
| 147 |
+
sorted_atoms = sorted(self.stream_buffer, key=lambda a: a.index)
|
| 148 |
+
reconstructed = b''.join(a.wave_payload for a in sorted_atoms)
|
| 149 |
+
|
| 150 |
+
print(f"\n[EXTRACT] Reconstructed {len(reconstructed)} bytes from {len(sorted_atoms)} atoms")
|
| 151 |
+
return reconstructed
|
| 152 |
+
|
| 153 |
+
def _create_atom(self, chunk: bytes, index: int, type_prime: int) -> Atom:
|
| 154 |
+
"""
|
| 155 |
+
Create an Atom from raw bytes.
|
| 156 |
+
Heat is DERIVED from content, not arbitrary.
|
| 157 |
+
"""
|
| 158 |
+
# Calculate entropy
|
| 159 |
+
entropy = self._shannon_entropy(chunk)
|
| 160 |
+
|
| 161 |
+
# Calculate checksum
|
| 162 |
+
checksum = hashlib.md5(chunk).hexdigest()
|
| 163 |
+
|
| 164 |
+
# CRITICAL: Heat Code derived from content
|
| 165 |
+
# We use the first few bytes + index + type to create a unique prime composite
|
| 166 |
+
content_hash = int(checksum[:8], 16) # First 8 hex chars as int
|
| 167 |
+
|
| 168 |
+
# Find primes that "resonate" with this content
|
| 169 |
+
# Use modulo against prime basis to select factors
|
| 170 |
+
heat_factors = [type_prime] # Always include type
|
| 171 |
+
|
| 172 |
+
for i, prime in enumerate(HEAT_PRIMES[:5]):
|
| 173 |
+
if (content_hash >> i) & 1:
|
| 174 |
+
heat_factors.append(prime)
|
| 175 |
+
|
| 176 |
+
# Add index factor for ordering
|
| 177 |
+
heat_factors.append(HEAT_PRIMES[index % len(HEAT_PRIMES)])
|
| 178 |
+
|
| 179 |
+
# Calculate heat code as product of factors
|
| 180 |
+
heat_code = 1
|
| 181 |
+
for f in heat_factors:
|
| 182 |
+
heat_code *= f
|
| 183 |
+
|
| 184 |
+
return Atom(
|
| 185 |
+
index=index,
|
| 186 |
+
heat_code=heat_code,
|
| 187 |
+
wave_payload=chunk,
|
| 188 |
+
entropy=entropy,
|
| 189 |
+
checksum=checksum
|
| 190 |
+
)
|
| 191 |
+
|
| 192 |
+
def _shannon_entropy(self, data: bytes) -> float:
|
| 193 |
+
"""Calculate Shannon entropy of byte data."""
|
| 194 |
+
if not data:
|
| 195 |
+
return 0.0
|
| 196 |
+
|
| 197 |
+
freq = {}
|
| 198 |
+
for byte in data:
|
| 199 |
+
freq[byte] = freq.get(byte, 0) + 1
|
| 200 |
+
|
| 201 |
+
entropy = 0.0
|
| 202 |
+
length = len(data)
|
| 203 |
+
for count in freq.values():
|
| 204 |
+
p = count / length
|
| 205 |
+
entropy -= p * math.log2(p)
|
| 206 |
+
|
| 207 |
+
return entropy
|
| 208 |
+
|
| 209 |
+
def _ext_to_prime(self, ext: str) -> int:
|
| 210 |
+
"""Map file extension to type prime."""
|
| 211 |
+
mapping = {
|
| 212 |
+
'.png': 17, '.jpg': 17, '.jpeg': 17, '.gif': 17, '.webp': 17, '.bmp': 17,
|
| 213 |
+
'.txt': 19, '.md': 19, '.json': 19, '.xml': 19, '.csv': 19,
|
| 214 |
+
'.py': 19, '.js': 19, '.html': 19, '.css': 19,
|
| 215 |
+
'.mp3': 23, '.wav': 23, '.ogg': 23, '.flac': 23,
|
| 216 |
+
'.mp4': 17 * 23, '.webm': 17 * 23, '.mkv': 17 * 23,
|
| 217 |
+
'.pdf': 17 * 19,
|
| 218 |
+
'.bin': 29, '.dat': 29,
|
| 219 |
+
}
|
| 220 |
+
return mapping.get(ext, 29) # Default to SIGNAL
|
| 221 |
+
|
| 222 |
+
def _hash_to_prime(self, hex_hash: str) -> int:
|
| 223 |
+
"""Convert hash to a prime-derived ID."""
|
| 224 |
+
val = int(hex_hash[:12], 16)
|
| 225 |
+
# Find next prime after this value mod 10000
|
| 226 |
+
candidate = (val % 10000) + 1000
|
| 227 |
+
while not _is_prime(candidate):
|
| 228 |
+
candidate += 1
|
| 229 |
+
return candidate
|
| 230 |
+
|
| 231 |
+
def get_domain_map(self) -> Dict:
|
| 232 |
+
"""Return populated domains."""
|
| 233 |
+
return {k: v for k, v in self.mtl.domains.items() if v}
|
| 234 |
+
|
| 235 |
+
|
| 236 |
+
def _factorize(n: int) -> List[int]:
|
| 237 |
+
"""Prime factorization."""
|
| 238 |
+
if n <= 1:
|
| 239 |
+
return [n]
|
| 240 |
+
factors = []
|
| 241 |
+
d = 2
|
| 242 |
+
while d * d <= n:
|
| 243 |
+
while n % d == 0:
|
| 244 |
+
factors.append(d)
|
| 245 |
+
n //= d
|
| 246 |
+
d += 1
|
| 247 |
+
if n > 1:
|
| 248 |
+
factors.append(n)
|
| 249 |
+
return factors
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
def _is_prime(n: int) -> bool:
|
| 253 |
+
"""Check primality."""
|
| 254 |
+
if n < 2:
|
| 255 |
+
return False
|
| 256 |
+
if n < 4:
|
| 257 |
+
return True
|
| 258 |
+
if n % 2 == 0:
|
| 259 |
+
return False
|
| 260 |
+
for i in range(3, int(math.sqrt(n)) + 1, 2):
|
| 261 |
+
if n % i == 0:
|
| 262 |
+
return False
|
| 263 |
+
return True
|
| 264 |
+
|
| 265 |
+
|
| 266 |
+
# ============================================
|
| 267 |
+
# STANDALONE TEST
|
| 268 |
+
# ============================================
|
| 269 |
+
if __name__ == "__main__":
|
| 270 |
+
transceiver = SPCWTransceiver()
|
| 271 |
+
|
| 272 |
+
print("\n" + "="*60)
|
| 273 |
+
print(" SPCW TRANSCEIVER: BINARY INJECTION TEST")
|
| 274 |
+
print("="*60)
|
| 275 |
+
|
| 276 |
+
# Find a test file (use this script itself)
|
| 277 |
+
test_file = __file__
|
| 278 |
+
|
| 279 |
+
# Inject
|
| 280 |
+
report = transceiver.inject(test_file)
|
| 281 |
+
|
| 282 |
+
# Show first 3 atoms
|
| 283 |
+
print("\n[ATOM SAMPLE]")
|
| 284 |
+
for atom in report['atoms'][:3]:
|
| 285 |
+
print(f" {atom}")
|
| 286 |
+
print(f" Factors: {atom.factors}")
|
| 287 |
+
|
| 288 |
+
# Extract and verify
|
| 289 |
+
reconstructed = transceiver.extract()
|
| 290 |
+
original = open(test_file, 'rb').read()
|
| 291 |
+
|
| 292 |
+
print(f"\n[VERIFICATION]")
|
| 293 |
+
print(f" Original size: {len(original)}")
|
| 294 |
+
print(f" Reconstructed: {len(reconstructed)}")
|
| 295 |
+
print(f" Match: {reconstructed == original}")
|
| 296 |
+
|
| 297 |
+
# Domain map
|
| 298 |
+
print(f"\n[DOMAIN MAP]")
|
| 299 |
+
for domain, contents in transceiver.get_domain_map().items():
|
| 300 |
+
print(f" [{domain}] {len(contents)} atoms")
|
| 301 |
+
|
| 302 |
+
print("\n" + "="*60)
|
| 303 |
+
print(" [OK] SPCW TRANSCEIVER OPERATIONAL")
|
| 304 |
+
print("="*60)
|
logos/tools/__init__.py
ADDED
|
File without changes
|
logos/tools/check_transcript.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from youtube_transcript_api import YouTubeTranscriptApi
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
def check_transcript(video_id):
|
| 5 |
+
try:
|
| 6 |
+
print(f"Fetching transcript for: {video_id}")
|
| 7 |
+
t = YouTubeTranscriptApi().fetch(video_id)
|
| 8 |
+
print("SUCCESS! Transcript found.")
|
| 9 |
+
print(f"Elements: {len(t)}")
|
| 10 |
+
print(f"First 5 lines: {[i.text for i in t[:5]]}")
|
| 11 |
+
except Exception as e:
|
| 12 |
+
print(f"FAILED: {e}")
|
| 13 |
+
|
| 14 |
+
if __name__ == "__main__":
|
| 15 |
+
vid = "WIZf-Doc8Bk"
|
| 16 |
+
check_transcript(vid)
|
logos/tools/context_oracle.py
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
"""
|
| 3 |
+
Protocol 29: Antigravity Context Oracle Tools
|
| 4 |
+
These tools allow Agents to interact with the Prime-Neuron Context Service.
|
| 5 |
+
"""
|
| 6 |
+
import requests
|
| 7 |
+
import json
|
| 8 |
+
from logos.config import SERVER_URL
|
| 9 |
+
|
| 10 |
+
def query_prime_context(query_text: str, prime_band: str = None) -> str:
|
| 11 |
+
"""
|
| 12 |
+
Semantic search over the Prime Manifold.
|
| 13 |
+
Args:
|
| 14 |
+
query_text: Natural language query
|
| 15 |
+
prime_band: "axioms" (0-1000), "mid" (1000-5000), "hitech" (5000+)
|
| 16 |
+
"""
|
| 17 |
+
url = f"{SERVER_URL}/v1/context/query"
|
| 18 |
+
|
| 19 |
+
filters = {}
|
| 20 |
+
if prime_band:
|
| 21 |
+
if prime_band == "axioms": filters["prime_range"] = [0, 1000]
|
| 22 |
+
elif prime_band == "mid": filters["prime_range"] = [1000, 5000]
|
| 23 |
+
elif prime_band == "hitech": filters["prime_range"] = [5000, 99999]
|
| 24 |
+
|
| 25 |
+
try:
|
| 26 |
+
resp = requests.post(url, json={"query_text": query_text, "filters": filters})
|
| 27 |
+
if resp.status_code == 200:
|
| 28 |
+
data = resp.json()
|
| 29 |
+
# Synthesize for Agent
|
| 30 |
+
summary = [f"Found {data['count']} neurons:"]
|
| 31 |
+
for n in data['results']:
|
| 32 |
+
summary.append(f"- [Prime {n.get('prime_index')}] {n.get('type')}: {str(n.get('payload'))[:50]}...")
|
| 33 |
+
return "\n".join(summary)
|
| 34 |
+
else:
|
| 35 |
+
return f"Error: {resp.text}"
|
| 36 |
+
except Exception as e:
|
| 37 |
+
return f"Connection Failed: {e}"
|
| 38 |
+
|
| 39 |
+
def upsert_prime_neuron(content: str, type: str = "text", prime_index: int = None) -> str:
|
| 40 |
+
"""
|
| 41 |
+
Writes a new concept to the Manifold.
|
| 42 |
+
"""
|
| 43 |
+
url = f"{SERVER_URL}/v1/context/neurons"
|
| 44 |
+
|
| 45 |
+
neuron = {
|
| 46 |
+
"type": type,
|
| 47 |
+
"payload": content
|
| 48 |
+
}
|
| 49 |
+
if prime_index:
|
| 50 |
+
neuron["prime_index"] = prime_index
|
| 51 |
+
|
| 52 |
+
try:
|
| 53 |
+
resp = requests.post(url, json={"neurons": [neuron]})
|
| 54 |
+
if resp.status_code == 200:
|
| 55 |
+
data = resp.json()
|
| 56 |
+
params = data['neurons'][0]
|
| 57 |
+
return f"Upserted Neuron: ID={params.get('id')} Prime={params.get('prime_index')}"
|
| 58 |
+
else:
|
| 59 |
+
return f"Error: {resp.text}"
|
| 60 |
+
except Exception as e:
|
| 61 |
+
return f"Connection Failed: {e}"
|
| 62 |
+
|
| 63 |
+
def parse_diagram_to_context(image_path: str, domain_context: str = "General") -> str:
|
| 64 |
+
"""
|
| 65 |
+
Ingests a diagram image, segments it, and stores nodes as neurons.
|
| 66 |
+
Currently a stub for Protocol 29 Step 3.
|
| 67 |
+
"""
|
| 68 |
+
if not image_path: return "Error: No image path provided."
|
| 69 |
+
|
| 70 |
+
# In a real implementation, this would:
|
| 71 |
+
# 1. Call Local Vision Model (Ollama/Llava) to describe image
|
| 72 |
+
# 2. Parse graph structure
|
| 73 |
+
# 3. Upsert nodes
|
| 74 |
+
|
| 75 |
+
# Simulating a mock upsert for the uploaded diagram
|
| 76 |
+
mock_neuron_text = f"Diagram Node from {image_path}: {domain_context}"
|
| 77 |
+
return upsert_prime_neuron(mock_neuron_text, "diagram_node")
|
| 78 |
+
|
| 79 |
+
if __name__ == "__main__":
|
| 80 |
+
# Test
|
| 81 |
+
print("Upserting...")
|
| 82 |
+
print(upsert_prime_neuron("The LOGOS System requires manifold constraints.", "axiom", 2))
|
| 83 |
+
print("Querying...")
|
| 84 |
+
print(query_prime_context("manifold"))
|
logos/tools/test_fusion.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""Inter-Domain Fusion Test: Genesis of Domain [6] (Flip)"""
|
| 3 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 4 |
+
|
| 5 |
+
mtl = MTLInterpreter()
|
| 6 |
+
|
| 7 |
+
print('=== INTER-DOMAIN FUSION TEST (Genesis of [6]) ===')
|
| 8 |
+
|
| 9 |
+
# 1. Setup: Define the "Mechanism" (The Tool) in [2]
|
| 10 |
+
mtl.execute('(domain [2])')
|
| 11 |
+
mtl.execute('(store inverter (list -1 -1 -1))')
|
| 12 |
+
print('Domain [2] inverter:', mtl.execute('(fetch inverter)'))
|
| 13 |
+
|
| 14 |
+
# 2. Setup: Define the "Result" (The State) in [3]
|
| 15 |
+
mtl.execute('(domain [3])')
|
| 16 |
+
mtl.execute('(store static_state (list 10 20 30))')
|
| 17 |
+
print('Domain [3] static_state:', mtl.execute('(fetch static_state)'))
|
| 18 |
+
|
| 19 |
+
# 3. Execution: Cross-Domain Application
|
| 20 |
+
print('\nApplying Mechanism [2] to Result [3]...')
|
| 21 |
+
mtl.execute('(domain [6])') # Switch to Flip domain
|
| 22 |
+
|
| 23 |
+
# Perform the fusion using Hadamard product
|
| 24 |
+
mtl.execute('(store fused_state (mult (in-domain [2] (fetch inverter)) (in-domain [3] (fetch static_state))))')
|
| 25 |
+
|
| 26 |
+
# 4. Verification
|
| 27 |
+
print('Active Domain:', mtl.active_domain)
|
| 28 |
+
fused = mtl.execute('(fetch fused_state)')
|
| 29 |
+
print('Fused State (The Flip):', fused)
|
| 30 |
+
|
| 31 |
+
expected = [-10, -20, -30]
|
| 32 |
+
if fused == expected:
|
| 33 |
+
print('β
FUSION VERIFIED: Mechanism Γ Result = Flip')
|
| 34 |
+
else:
|
| 35 |
+
print(f'β Expected {expected}, got {fused}')
|
| 36 |
+
|
| 37 |
+
# Show all domains
|
| 38 |
+
print('\n=== DOMAIN MAP ===')
|
| 39 |
+
for k, v in mtl.domains.items():
|
| 40 |
+
print(f' [{k}]: {v}')
|
logos/tools/test_logic_gates.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""
|
| 3 |
+
LOGIC GATES TEST: OR (LCM), AND (GCD), NOT (Steering)
|
| 4 |
+
|
| 5 |
+
The Complete Tensor Logic Triad:
|
| 6 |
+
- OR = Superposition (LCM) - Creates unified manifold containing both
|
| 7 |
+
- AND = Intersection (GCD) - Finds common factor between both
|
| 8 |
+
- NOT = Navigation (Steering) - Selects path based on pattern match
|
| 9 |
+
"""
|
| 10 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 11 |
+
|
| 12 |
+
mtl = MTLInterpreter()
|
| 13 |
+
|
| 14 |
+
print('=' * 60)
|
| 15 |
+
print(' LOGOS TENSOR LOGIC GATES: OR, AND, NOT')
|
| 16 |
+
print('=' * 60)
|
| 17 |
+
|
| 18 |
+
# === OR GATE (LCM) ===
|
| 19 |
+
print('\n[OR GATE] Superposition / Unified Manifold (LCM)')
|
| 20 |
+
print('-' * 40)
|
| 21 |
+
|
| 22 |
+
# O(2, 3) = 6 ("Red OR Blue = Purple")
|
| 23 |
+
result = mtl.execute('(or [2] [3])')
|
| 24 |
+
print(f' (or [2] [3]) = {result} (Mechanism OR Result = Flip)')
|
| 25 |
+
assert result == 6, f'Expected 6, got {result}'
|
| 26 |
+
print(' β
PASS')
|
| 27 |
+
|
| 28 |
+
# O(4, 6) = 12 ("Previous OR Flip = ?")
|
| 29 |
+
result = mtl.execute('(or [4] [6])')
|
| 30 |
+
print(f' (or [4] [6]) = {result} (LCM of 4,6 = 12 = Thought)')
|
| 31 |
+
assert result == 12, f'Expected 12, got {result}'
|
| 32 |
+
print(' β
PASS')
|
| 33 |
+
|
| 34 |
+
# O(6, 10) = 30 (All three: Mechanism, Result, Choice)
|
| 35 |
+
result = mtl.execute('(or [6] [10])')
|
| 36 |
+
print(f' (or [6] [10]) = {result} (Flip OR Around = 2*3*5 = 30)')
|
| 37 |
+
assert result == 30, f'Expected 30, got {result}'
|
| 38 |
+
print(' β
PASS')
|
| 39 |
+
|
| 40 |
+
# === AND GATE (GCD) ===
|
| 41 |
+
print('\n[AND GATE] Intersection / Common Factor (GCD)')
|
| 42 |
+
print('-' * 40)
|
| 43 |
+
|
| 44 |
+
# A(6, 10) = 2 ("What do Flip and Around share? Mechanism.")
|
| 45 |
+
result = mtl.execute('(and [6] [10])')
|
| 46 |
+
print(f' (and [6] [10]) = {result} (Flip AND Around = Mechanism)')
|
| 47 |
+
assert result == 2, f'Expected 2, got {result}'
|
| 48 |
+
print(' β
PASS')
|
| 49 |
+
|
| 50 |
+
# A(12, 18) = 6
|
| 51 |
+
result = mtl.execute('(and [12] [18])')
|
| 52 |
+
print(f' (and [12] [18]) = {result} (Thought AND 18 = Flip)')
|
| 53 |
+
assert result == 6, f'Expected 6, got {result}'
|
| 54 |
+
print(' β
PASS')
|
| 55 |
+
|
| 56 |
+
# A(7, 14) = 7 (Persist)
|
| 57 |
+
result = mtl.execute('(and [7] [14])')
|
| 58 |
+
print(f' (and [7] [14]) = {result} (Persist AND Hold = Persist)')
|
| 59 |
+
assert result == 7, f'Expected 7, got {result}'
|
| 60 |
+
print(' β
PASS')
|
| 61 |
+
|
| 62 |
+
# === NOT GATE (Steering) ===
|
| 63 |
+
print('\n[NOT GATE] Navigation / Structural Steering')
|
| 64 |
+
print('-' * 40)
|
| 65 |
+
|
| 66 |
+
# N(A)[A,B] -> B
|
| 67 |
+
result = mtl.execute('(not [2] [2] [3])')
|
| 68 |
+
print(f' (not [2] [2] [3]) = {result} (If Mechanism, go to Result)')
|
| 69 |
+
assert result == 3, f'Expected 3, got {result}'
|
| 70 |
+
print(' β
PASS')
|
| 71 |
+
|
| 72 |
+
# N(A)[X,B] -> X (No match)
|
| 73 |
+
result = mtl.execute('(not [2] [5] [3])')
|
| 74 |
+
print(f' (not [2] [5] [3]) = {result} (No match, stay at Choice)')
|
| 75 |
+
assert result == 5, f'Expected 5, got {result}'
|
| 76 |
+
print(' β
PASS')
|
| 77 |
+
|
| 78 |
+
# === COMBINED LOGIC ===
|
| 79 |
+
print('\n[COMBINED] Complex Tensor Navigation')
|
| 80 |
+
print('-' * 40)
|
| 81 |
+
|
| 82 |
+
# Create a superposition, then navigate it
|
| 83 |
+
# Step 1: O(2,3) = 6 (Create unified space)
|
| 84 |
+
# Step 2: N(6)[6, 42] = 42 (If key=6 matches first arg=6, return second=42)
|
| 85 |
+
unified = mtl.execute('(or [2] [3])')
|
| 86 |
+
print(f' Unified = (or [2] [3]) = {unified}')
|
| 87 |
+
|
| 88 |
+
# Now use unified (which is 6) as the key to navigate
|
| 89 |
+
# (not 6 6 42) -> Key matches first, return second -> 42
|
| 90 |
+
result = mtl.execute(f'(not {unified} {unified} 42)')
|
| 91 |
+
print(f' (not {unified} {unified} 42) = {result} (Navigate to Deep Storage)')
|
| 92 |
+
assert result == 42, f'Expected 42, got {result}'
|
| 93 |
+
print(' β
PASS')
|
| 94 |
+
|
| 95 |
+
# === SUMMARY ===
|
| 96 |
+
print('\n' + '=' * 60)
|
| 97 |
+
print('β
ALL LOGIC GATES VERIFIED')
|
| 98 |
+
print('=' * 60)
|
| 99 |
+
print('''
|
| 100 |
+
The Complete Tensor Logic Triad:
|
| 101 |
+
|
| 102 |
+
| Gate | Math | LOGOS Meaning |
|
| 103 |
+
|------|------------|-------------------------|
|
| 104 |
+
| OR | LCM(A,B) | Superposition/Unify |
|
| 105 |
+
| AND | GCD(A,B) | Intersection/Common |
|
| 106 |
+
| NOT | N(A)[...] | Navigation/Steering |
|
| 107 |
+
|
| 108 |
+
Key Insight:
|
| 109 |
+
- OR(2,3) = 6 β "Both Mechanism AND Result exist here"
|
| 110 |
+
- AND(6,10) = 2 β "Flip and Around share Mechanism"
|
| 111 |
+
- NOT(6)[6,42] β "If at Flip, navigate to Deep Storage"
|
| 112 |
+
''')
|
logos/tools/test_not_gate.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""NOT Gate: Structural Steering Test"""
|
| 3 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 4 |
+
|
| 5 |
+
mtl = MTLInterpreter()
|
| 6 |
+
|
| 7 |
+
print('=== NOT GATE: STRUCTURAL STEERING TEST ===')
|
| 8 |
+
|
| 9 |
+
# Case 1: N(A)[A,B] -> B (Match first, redirect to second)
|
| 10 |
+
print('\n[Case 1] N(5)[5, 10] -> Should return 10')
|
| 11 |
+
result = mtl.execute('(not [5] [5] [10])')
|
| 12 |
+
print(f' Result: {result}')
|
| 13 |
+
assert result == 10, f'Expected 10, got {result}'
|
| 14 |
+
print(' β
PASS')
|
| 15 |
+
|
| 16 |
+
# Case 1b: No match returns first
|
| 17 |
+
print('\n[Case 1b] N(5)[7, 10] -> Should return 7 (no match)')
|
| 18 |
+
result = mtl.execute('(not [5] [7] [10])')
|
| 19 |
+
print(f' Result: {result}')
|
| 20 |
+
assert result == 7, f'Expected 7, got {result}'
|
| 21 |
+
print(' β
PASS')
|
| 22 |
+
|
| 23 |
+
# Case 2: N(A)[B,C,A] -> B(C) (Match last, apply B to C)
|
| 24 |
+
print('\n[Case 2] N(5)[[2,2,2], [3,3,3], 5] -> Should return [6,6,6]')
|
| 25 |
+
result = mtl.execute('(not [5] (list 2 2 2) (list 3 3 3) [5])')
|
| 26 |
+
print(f' Result: {result}')
|
| 27 |
+
assert result == [6,6,6], f'Expected [6,6,6], got {result}'
|
| 28 |
+
print(' β
PASS')
|
| 29 |
+
|
| 30 |
+
# Case 2b: Integer application
|
| 31 |
+
print('\n[Case 2b] N(7)[3, 4, 7] -> Should return 12 (3*4)')
|
| 32 |
+
result = mtl.execute('(not [7] 3 4 [7])')
|
| 33 |
+
print(f' Result: {result}')
|
| 34 |
+
assert result == 12, f'Expected 12, got {result}'
|
| 35 |
+
print(' β
PASS')
|
| 36 |
+
|
| 37 |
+
print('\n=== ALL NOT GATE TESTS PASSED ===')
|
logos/tools/test_persistence.py
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""
|
| 3 |
+
DELTA HEAT PERSISTENCE TEST: Genesis of Domain [14] (Hold) and [42] (Deep Storage)
|
| 4 |
+
|
| 5 |
+
Math:
|
| 6 |
+
- [7] = Persist (The Hard Drive)
|
| 7 |
+
- [2] * [7] = [14] = Hold (Mechanism of Persistence = The "Save" Command)
|
| 8 |
+
- [6] * [7] = [42] = Persistent Flip (Deep Storage / Log File)
|
| 9 |
+
|
| 10 |
+
Heat:
|
| 11 |
+
- Delta Heat tracks atomic change over time
|
| 12 |
+
- A write operation generates heat (complexity increase)
|
| 13 |
+
"""
|
| 14 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 15 |
+
|
| 16 |
+
mtl = MTLInterpreter()
|
| 17 |
+
|
| 18 |
+
print('=' * 60)
|
| 19 |
+
print(' DELTA HEAT PERSISTENCE TEST (Genesis of [14] and [42])')
|
| 20 |
+
print('=' * 60)
|
| 21 |
+
|
| 22 |
+
# === PHASE 1: Recreate the Volatile State ===
|
| 23 |
+
print('\n[PHASE 1] Recreating Volatile State in Domain [6]')
|
| 24 |
+
mtl.execute('(domain [2])')
|
| 25 |
+
mtl.execute('(store inverter (list -1 -1 -1))')
|
| 26 |
+
mtl.execute('(domain [3])')
|
| 27 |
+
mtl.execute('(store state (list 10 20 30))')
|
| 28 |
+
mtl.execute('(domain [6])')
|
| 29 |
+
mtl.execute('(store fused_state (mult (in-domain [2] (fetch inverter)) (in-domain [3] (fetch state))))')
|
| 30 |
+
volatile = mtl.execute('(fetch fused_state)')
|
| 31 |
+
print(f' Volatile Data in [6]: {volatile}')
|
| 32 |
+
|
| 33 |
+
# === PHASE 2: Apply Persist Factor [7] ===
|
| 34 |
+
print('\n[PHASE 2] Applying Persist Factor [7] -> Deep Storage [42]')
|
| 35 |
+
# Domain [42] = [6] * [7] = Persistent Flip
|
| 36 |
+
# We store the volatile data into [42], encoding it as "persisted"
|
| 37 |
+
mtl.execute('(domain [42])')
|
| 38 |
+
# Persist the data by wrapping it with the storage context
|
| 39 |
+
mtl.execute('(store log_entry_001 (in-domain [6] (fetch fused_state)))')
|
| 40 |
+
persisted = mtl.execute('(fetch log_entry_001)')
|
| 41 |
+
print(f' Persisted Data in [42]: {persisted}')
|
| 42 |
+
|
| 43 |
+
# === PHASE 3: Hold Operation via Domain [14] ===
|
| 44 |
+
print('\n[PHASE 3] "Hold" Operation - Domain [14] = Mechanism of Persistence')
|
| 45 |
+
# Domain [14] acts as the "Save" mechanism
|
| 46 |
+
# It should provide a function to commit volatile -> persistent
|
| 47 |
+
|
| 48 |
+
mtl.execute('(domain [14])')
|
| 49 |
+
# Store the "address" of what we're holding, not the data itself (pointer logic)
|
| 50 |
+
# In LOGOS, we can use the composite ID as a reference
|
| 51 |
+
mtl.execute('(store held_ref [42])') # Holding reference to [42]
|
| 52 |
+
mtl.execute('(store held_timestamp 1736582400)') # Unix timestamp (conceptual)
|
| 53 |
+
held = mtl.execute('(get-domain [14])')
|
| 54 |
+
print(f' Hold Registry [14]: {held}')
|
| 55 |
+
|
| 56 |
+
# === PHASE 4: Delta Heat Tracking ===
|
| 57 |
+
print('\n[PHASE 4] Delta Heat Calculation')
|
| 58 |
+
# Heat = Complexity of operation
|
| 59 |
+
# Original state in [3]: [10, 20, 30]
|
| 60 |
+
# Final state in [42]: [-10, -20, -30]
|
| 61 |
+
# Delta = sum of absolute changes
|
| 62 |
+
|
| 63 |
+
original = [10, 20, 30]
|
| 64 |
+
final = [-10, -20, -30]
|
| 65 |
+
delta_heat = sum(abs(o - f) for o, f in zip(original, final))
|
| 66 |
+
print(f' Original State: {original}')
|
| 67 |
+
print(f' Final State: {final}')
|
| 68 |
+
print(f' Delta Heat: {delta_heat}')
|
| 69 |
+
|
| 70 |
+
# Store heat metric in the Hold domain
|
| 71 |
+
mtl.execute(f'(store delta_heat {delta_heat})')
|
| 72 |
+
print(f' Heat logged in [14]: {mtl.execute("(fetch delta_heat)")}')
|
| 73 |
+
|
| 74 |
+
# === PHASE 5: Domain Map Verification ===
|
| 75 |
+
print('\n[PHASE 5] Final Domain Map')
|
| 76 |
+
print('=' * 40)
|
| 77 |
+
for domain_key in [2, 3, 6, 7, 14, 42]:
|
| 78 |
+
contents = mtl.domains.get(domain_key, {})
|
| 79 |
+
if contents:
|
| 80 |
+
print(f' [{domain_key:2d}] {contents}')
|
| 81 |
+
|
| 82 |
+
# === VERIFICATION ===
|
| 83 |
+
print('\n' + '=' * 60)
|
| 84 |
+
if persisted == [-10, -20, -30] and delta_heat == 120:
|
| 85 |
+
print('β
PERSISTENCE VERIFIED: Volatile -> Permanent Storage')
|
| 86 |
+
print('β
DELTA HEAT CALCULATED: Atomic Change Tracked')
|
| 87 |
+
print(f' [6] Flip β [42] Deep Storage (6 Γ 7 = 42)')
|
| 88 |
+
print(f' [14] Hold = Mechanism of Persistence')
|
| 89 |
+
else:
|
| 90 |
+
print('β Verification Failed')
|
logos/tools/test_synapse.py
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""
|
| 3 |
+
SYNAPTIC BRIDGE TEST (Protocol 39 - Genesis of [13])
|
| 4 |
+
|
| 5 |
+
The Math of Connection:
|
| 6 |
+
- Synapse = Atom_A Γ Atom_B Γ 13 (RELATE factor)
|
| 7 |
+
- Traceability: If synapse % atom == 0, atom is connected
|
| 8 |
+
- Dissolution: synapse / 13 = raw pair
|
| 9 |
+
|
| 10 |
+
This proves LOGOS can build a Knowledge Graph where:
|
| 11 |
+
- Links are mathematical properties (not external strings)
|
| 12 |
+
- The "Link" contains the "Target"
|
| 13 |
+
- You cannot break a link without changing the number
|
| 14 |
+
"""
|
| 15 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 16 |
+
|
| 17 |
+
mtl = MTLInterpreter()
|
| 18 |
+
|
| 19 |
+
print('=' * 60)
|
| 20 |
+
print(' SYNAPTIC BRIDGE TEST (Genesis of [13] - RELATE)')
|
| 21 |
+
print('=' * 60)
|
| 22 |
+
|
| 23 |
+
# ============================================
|
| 24 |
+
# PHASE 1: CREATE THE SYNAPSE
|
| 25 |
+
# ============================================
|
| 26 |
+
print('\n[PHASE 1] Creating Synaptic Link')
|
| 27 |
+
print('-' * 40)
|
| 28 |
+
|
| 29 |
+
image_atom = 17 # IMAGE
|
| 30 |
+
text_atom = 19 # TEXT
|
| 31 |
+
rel_prime = 13 # RELATE
|
| 32 |
+
|
| 33 |
+
print(f' Image Atom: [{image_atom}]')
|
| 34 |
+
print(f' Text Atom: [{text_atom}]')
|
| 35 |
+
print(f' Relate Factor: [{rel_prime}]')
|
| 36 |
+
|
| 37 |
+
# Create the synapse using MTL
|
| 38 |
+
synapse_id = mtl.execute(f'(relate [{image_atom}] [{text_atom}])')
|
| 39 |
+
print(f'\n Synapse ID: {image_atom} Γ {text_atom} Γ {rel_prime} = [{synapse_id}]')
|
| 40 |
+
|
| 41 |
+
expected = image_atom * text_atom * rel_prime
|
| 42 |
+
assert synapse_id == expected, f'Expected {expected}, got {synapse_id}'
|
| 43 |
+
print(f' β
Synapse Created: [{synapse_id}]')
|
| 44 |
+
|
| 45 |
+
# Store in Relationship Domain [1300]
|
| 46 |
+
mtl.execute('(domain [1300])')
|
| 47 |
+
mtl.execute(f'(store caption_link {synapse_id})')
|
| 48 |
+
print(f' π Stored in RELATIONSHIP Domain [1300]')
|
| 49 |
+
|
| 50 |
+
# ============================================
|
| 51 |
+
# PHASE 2: TRACEABILITY (Reverse Lookup)
|
| 52 |
+
# ============================================
|
| 53 |
+
print('\n[PHASE 2] Traceability Check')
|
| 54 |
+
print('-' * 40)
|
| 55 |
+
|
| 56 |
+
# Retrieve the synapse
|
| 57 |
+
retrieved = mtl.execute('(fetch caption_link)')
|
| 58 |
+
print(f' Retrieved Synapse: [{retrieved}]')
|
| 59 |
+
|
| 60 |
+
# Trace back to Image
|
| 61 |
+
trace_img = mtl.execute(f'(trace {retrieved} [{image_atom}])')
|
| 62 |
+
if trace_img == image_atom:
|
| 63 |
+
print(f' β
Synapse contains IMAGE [{image_atom}]')
|
| 64 |
+
else:
|
| 65 |
+
print(f' β IMAGE traceability failed')
|
| 66 |
+
|
| 67 |
+
# Trace back to Text
|
| 68 |
+
trace_txt = mtl.execute(f'(trace {retrieved} [{text_atom}])')
|
| 69 |
+
if trace_txt == text_atom:
|
| 70 |
+
print(f' β
Synapse contains TEXT [{text_atom}]')
|
| 71 |
+
else:
|
| 72 |
+
print(f' β TEXT traceability failed')
|
| 73 |
+
|
| 74 |
+
# Trace RELATE factor
|
| 75 |
+
trace_rel = mtl.execute(f'(trace {retrieved} [{rel_prime}])')
|
| 76 |
+
if trace_rel == rel_prime:
|
| 77 |
+
print(f' β
Synapse contains RELATE [{rel_prime}]')
|
| 78 |
+
else:
|
| 79 |
+
print(f' β RELATE traceability failed')
|
| 80 |
+
|
| 81 |
+
# ============================================
|
| 82 |
+
# PHASE 3: LINK DISSOLUTION
|
| 83 |
+
# ============================================
|
| 84 |
+
print('\n[PHASE 3] Link Dissolution')
|
| 85 |
+
print('-' * 40)
|
| 86 |
+
|
| 87 |
+
# Dissolve the link (remove [13])
|
| 88 |
+
raw_pair = mtl.execute(f'(dissolve-link {retrieved})')
|
| 89 |
+
expected_pair = image_atom * text_atom # 17 * 19 = 323
|
| 90 |
+
print(f' Dissolved Link: [{retrieved}] / 13 = [{raw_pair}]')
|
| 91 |
+
print(f' Expected: 17 Γ 19 = [{expected_pair}]')
|
| 92 |
+
|
| 93 |
+
assert raw_pair == expected_pair, f'Expected {expected_pair}, got {raw_pair}'
|
| 94 |
+
print(f' β
Dissolution Verified: Raw pair is [{raw_pair}] (IMAGE Γ TEXT)')
|
| 95 |
+
|
| 96 |
+
# ============================================
|
| 97 |
+
# PHASE 4: GET LINKED ATOM
|
| 98 |
+
# ============================================
|
| 99 |
+
print('\n[PHASE 4] Reverse Navigation (Get Linked)')
|
| 100 |
+
print('-' * 40)
|
| 101 |
+
|
| 102 |
+
# Given the synapse and the image, find the text
|
| 103 |
+
found_text = mtl.execute(f'(get-linked {retrieved} [{image_atom}])')
|
| 104 |
+
print(f' Query: "What is linked to IMAGE [{image_atom}]?"')
|
| 105 |
+
print(f' Result: [{found_text}]')
|
| 106 |
+
|
| 107 |
+
assert found_text == text_atom, f'Expected {text_atom}, got {found_text}'
|
| 108 |
+
print(f' β
Found TEXT [{found_text}]')
|
| 109 |
+
|
| 110 |
+
# Given the synapse and the text, find the image
|
| 111 |
+
found_image = mtl.execute(f'(get-linked {retrieved} [{text_atom}])')
|
| 112 |
+
print(f' Query: "What is linked to TEXT [{text_atom}]?"')
|
| 113 |
+
print(f' Result: [{found_image}]')
|
| 114 |
+
|
| 115 |
+
assert found_image == image_atom, f'Expected {image_atom}, got {found_image}'
|
| 116 |
+
print(f' β
Found IMAGE [{found_image}]')
|
| 117 |
+
|
| 118 |
+
# ============================================
|
| 119 |
+
# PHASE 5: COMPLEX SYNAPSE CHAIN
|
| 120 |
+
# ============================================
|
| 121 |
+
print('\n[PHASE 5] Multi-Node Relationship Graph')
|
| 122 |
+
print('-' * 40)
|
| 123 |
+
|
| 124 |
+
# Create a chain: Image -> Text -> Audio
|
| 125 |
+
audio_atom = 23
|
| 126 |
+
synapse_text_audio = mtl.execute(f'(relate [{text_atom}] [{audio_atom}])')
|
| 127 |
+
mtl.execute(f'(store text_audio_link {synapse_text_audio})')
|
| 128 |
+
print(f' Created: TEXT [{text_atom}] <-> AUDIO [{audio_atom}] = [{synapse_text_audio}]')
|
| 129 |
+
|
| 130 |
+
# Now we have a graph:
|
| 131 |
+
# Image <--> Text <--> Audio
|
| 132 |
+
# Can we traverse it?
|
| 133 |
+
|
| 134 |
+
# From Image, find Text
|
| 135 |
+
linked_to_img = mtl.execute(f'(get-linked {synapse_id} [{image_atom}])')
|
| 136 |
+
print(f' From IMAGE, found: TEXT [{linked_to_img}]')
|
| 137 |
+
|
| 138 |
+
# From Text, find Audio
|
| 139 |
+
linked_to_txt = mtl.execute(f'(get-linked {synapse_text_audio} [{text_atom}])')
|
| 140 |
+
print(f' From TEXT, found: AUDIO [{linked_to_txt}]')
|
| 141 |
+
|
| 142 |
+
print(f' β
Graph traversal: IMAGE -> TEXT -> AUDIO')
|
| 143 |
+
|
| 144 |
+
# ============================================
|
| 145 |
+
# SUMMARY
|
| 146 |
+
# ============================================
|
| 147 |
+
print('\n' + '=' * 60)
|
| 148 |
+
print('β
SYNAPTIC BRIDGE VERIFIED')
|
| 149 |
+
print('=' * 60)
|
| 150 |
+
print('''
|
| 151 |
+
The Knowledge Graph Properties:
|
| 152 |
+
|
| 153 |
+
| Operation | MTL Command | Result |
|
| 154 |
+
|----------------|--------------------------|------------------|
|
| 155 |
+
| Create Link | (relate A B) | A Γ B Γ 13 |
|
| 156 |
+
| Trace | (trace synapse atom) | atom if present |
|
| 157 |
+
| Dissolve | (dissolve-link synapse) | synapse / 13 |
|
| 158 |
+
| Navigate | (get-linked synapse A) | B (the other end)|
|
| 159 |
+
|
| 160 |
+
Key Insight:
|
| 161 |
+
- Links ARE the numbers (not external metadata)
|
| 162 |
+
- Traceability is O(1) via modulo check
|
| 163 |
+
- Graph traversal is arithmetic division
|
| 164 |
+
''')
|
| 165 |
+
|
| 166 |
+
# Show domain state
|
| 167 |
+
print('RELATIONSHIP Domain [1300]:')
|
| 168 |
+
print(f' {mtl.domains.get(1300, {})}')
|
logos/tools/validate_mtl.py
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""
|
| 3 |
+
LOGOS MTL Turing Completeness Validation Script
|
| 4 |
+
|
| 5 |
+
Run: python logos/tools/validate_mtl.py
|
| 6 |
+
"""
|
| 7 |
+
import os
|
| 8 |
+
import sys
|
| 9 |
+
|
| 10 |
+
# Ensure we can import from logos
|
| 11 |
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
| 12 |
+
|
| 13 |
+
def main():
|
| 14 |
+
print('=' * 60)
|
| 15 |
+
print(' LOGOS MTL TURING COMPLETENESS VALIDATION')
|
| 16 |
+
print('=' * 60)
|
| 17 |
+
|
| 18 |
+
from logos.mtl.interpreter import MTLInterpreter
|
| 19 |
+
|
| 20 |
+
genesis_path = os.path.join(os.path.dirname(__file__), '..', 'mtl', 'genesis.json')
|
| 21 |
+
mtl = MTLInterpreter(genesis_path)
|
| 22 |
+
|
| 23 |
+
tests = [
|
| 24 |
+
('Mult [2]*[3]', '(mult [2] [3])', 6),
|
| 25 |
+
('Fractran Adder (72 -> 3125)', '(fractran [[5 2] [5 3]] 72)', 3125),
|
| 26 |
+
('If True (10 % 2 == 0)', '(if (divisible? 10 2) 1 0)', 1),
|
| 27 |
+
('If False (10 % 3 != 0)', '(if (divisible? 10 3) 1 0)', 0),
|
| 28 |
+
('Sub (10 - 3)', '(sub 10 3)', 7),
|
| 29 |
+
('Add (10 + 3)', '(add 10 3)', 13),
|
| 30 |
+
('Genesis Lookup', '(mult [MECHANISM] [RESULT])', 6),
|
| 31 |
+
]
|
| 32 |
+
|
| 33 |
+
print('\n[1] CORE MTL TESTS')
|
| 34 |
+
passed = 0
|
| 35 |
+
for name, expr, expected in tests:
|
| 36 |
+
try:
|
| 37 |
+
result = mtl.execute(expr)
|
| 38 |
+
status = 'β
' if result == expected else 'β'
|
| 39 |
+
if result == expected: passed += 1
|
| 40 |
+
print(f' {status} {name}: => {result} (expected {expected})')
|
| 41 |
+
except Exception as e:
|
| 42 |
+
print(f' β {name}: ERROR - {e}')
|
| 43 |
+
|
| 44 |
+
print('\n[2] DEFUN/RECURSION TEST')
|
| 45 |
+
try:
|
| 46 |
+
mtl.execute('(defun triple (x) (mult x 3))')
|
| 47 |
+
result = mtl.execute('(triple 7)')
|
| 48 |
+
expected = 21
|
| 49 |
+
status = 'β
' if result == expected else 'β'
|
| 50 |
+
if result == expected: passed += 1
|
| 51 |
+
print(f' {status} (triple 7) => {result} (expected {expected})')
|
| 52 |
+
except Exception as e:
|
| 53 |
+
print(f' β Defun Test: ERROR - {e}')
|
| 54 |
+
|
| 55 |
+
print('\n[3] COND TEST')
|
| 56 |
+
try:
|
| 57 |
+
result = mtl.execute('(cond ((eq? 1 2) 100) ((eq? 2 2) 200) (1 300))')
|
| 58 |
+
expected = 200
|
| 59 |
+
status = 'β
' if result == expected else 'β'
|
| 60 |
+
if result == expected: passed += 1
|
| 61 |
+
print(f' {status} cond => {result} (expected {expected})')
|
| 62 |
+
except Exception as e:
|
| 63 |
+
print(f' β Cond Test: ERROR - {e}')
|
| 64 |
+
|
| 65 |
+
total = len(tests) + 2 # +2 for defun and cond
|
| 66 |
+
print(f'\n[SUMMARY] {passed}/{total} tests passed')
|
| 67 |
+
print('=' * 60)
|
| 68 |
+
|
| 69 |
+
return 0 if passed == total else 1
|
| 70 |
+
|
| 71 |
+
if __name__ == '__main__':
|
| 72 |
+
sys.exit(main())
|