Block universe v4 mobile safe
import numpy as np
import time
import matplotlib.pyplot as plt
# =========================================================
# RANDOM SEED (DIFFERENT EVERY RUN)
# =========================================================
np.random.seed(int(time.time()))
# =========================================================
# GLOBAL CONSTANTS
# =========================================================
c = 1.0
kappa = 1.0
dtau = 0.01
WINDOW = 20
STEPS = 200
PRINT_INTERVAL = 5
# =========================================================
# HARDWARE LAYER
# =========================================================
class Metric:
def interval(self, p, q):
dt = q.t - p.t
dx = q.x - p.x
return -dt**2 + dx**2
def proper_time_step(self, velocity):
return np.sqrt(max(1 - velocity**2, 0)) * dtau
class Event:
def __init__(self, t, x):
self.t = t
self.x = x
class Manifold:
def __init__(self, t_range=(0, 20), x_range=(-10, 10), dt=0.02, dx=0.1):
self.dt = dt
self.dx = dx
self.t_vals = np.arange(t_range[0], t_range[1], dt)
self.x_vals = np.arange(x_range[0], x_range[1], dx)
class ScalarField:
def __init__(self, manifold):
self.manifold = manifold
self.values = np.zeros((len(manifold.t_vals), len(manifold.x_vals)))
def evolve(self):
drift = np.sin(time.time()) * 0.001
noise = np.random.normal(0, 0.004, self.values.shape)
self.values += drift + noise
def sample(self, t_index, x_index):
return self.values[t_index, x_index]
class Worldline:
def __init__(self, t0=0.0, x0=0.0):
self.t = t0
self.x = x0
self.events = [Event(self.t, self.x)]
def step(self, velocity, metric):
self.t += dtau
self.x += velocity * dtau
event = Event(self.t, self.x)
self.events.append(event)
d_tau = metric.proper_time_step(velocity)
return event, d_tau
# =========================================================
# SENSOR + NOW BUFFER
# =========================================================
def sensory_map(state):
return state + np.random.normal(0, 0.05)
def now_window(obs):
if len(obs) < WINDOW:
return np.mean(obs)
return np.mean(obs[-WINDOW:])
# =========================================================
# ENTROPY
# =========================================================
def entropy_rate(old, new):
eps = 1e-9
p = np.clip(old, eps, 1)
q = np.clip(new, eps, 1)
return np.sum(p * np.log(p / q))
# =========================================================
# MEMORY (ANTI LOCK)
# =========================================================
class Memory:
def __init__(self):
b = np.random.rand()
self.belief = np.array([b, 1 - b])
self.past = []
def update(self, observation):
likelihood = np.array([1 - observation, observation])
new_belief = self.belief * likelihood
# jitter prevents collapse
new_belief += np.random.normal(0, 0.01, 2)
new_belief = np.clip(new_belief, 1e-6, None)
new_belief /= np.sum(new_belief)
sigma = entropy_rate(self.belief, new_belief)
self.belief = new_belief
self.past.append(new_belief.copy())
return sigma
# =========================================================
# GUI TIME
# =========================================================
class GUITime:
def __init__(self):
self.t_hat = 0.0
def integrate(self, sigma):
self.t_hat += kappa * sigma
return self.t_hat
# =========================================================
# INITIALIZATION
# =========================================================
metric = Metric()
manifold = Manifold()
field = ScalarField(manifold)
worldline = Worldline()
memory = Memory()
gui_clock = GUITime()
observations = []
tau = 0.0
velocity = 0.6
entropy_log = []
tau_log = []
that_log = []
print("\n>>> Booting Block + GUI Time Simulation\n")
# =========================================================
# MAIN LOOP
# =========================================================
for step in range(STEPS):
field.evolve()
event, d_tau = worldline.step(velocity, metric)
tau += d_tau
ti = min(int(event.t / manifold.dt), len(manifold.t_vals)-1)
xi = min(int((event.x - manifold.x_vals[0]) / manifold.dx),
len(manifold.x_vals)-1)
true_state = field.sample(ti, xi)
obs = sensory_map(true_state)
observations.append(obs)
now_state = now_window(observations)
sigma = memory.update(np.clip(now_state, 0, 1))
t_hat = gui_clock.integrate(sigma)
entropy_log.append(sigma)
tau_log.append(tau)
that_log.append(t_hat)
if step % PRINT_INTERVAL == 0:
print(f"Step {step:03d} | τ={tau:.3f} | t̂={t_hat:.3f} | Now={now_state:.3f}")
if sigma > 0.05:
print("🔥 HIGH ENTROPY EVENT")
# =========================================================
# SAFE INLINE PLOT (NO FILE WRITE)
# =========================================================
try:
plt.figure(figsize=(5,3))
plt.plot(tau_log, that_log)
plt.xlabel("Proper Time τ")
plt.ylabel("GUI Time t̂")
plt.title("Subjective vs Physical Time")
plt.grid(True)
plt.show()
except:
print("Plot skipped (environment limitation)")
# =========================================================
# SUMMARY
# =========================================================
print("\n===== SIMULATION COMPLETE =====")
print("Proper time τ:", tau)
print("GUI time t̂:", gui_clock.t_hat)
print("Worldline length:", len(worldline.events))
print("Memory depth:", len(memory.past))
print("Final belief:", memory.belief)
Comments
Post a Comment