TMFS / tmfs_topo.py
TheGreatUnknown's picture
Rename tmfs_topo_full.py to tmfs_topo.py
8d0558f verified
import torch
import numpy as np
import matplotlib.pyplot as plt
# Configuration
CONFIG = {
"n_agents": 10,
"steps": 50,
"grid_size": 10,
"target": torch.tensor([5.0, 5.0])
}
# Tracker for entropy and convergence
class MetricsTracker:
def __init__(self):
self.entropies = []
self.distances = []
def record(self, positions, target):
center = positions.mean(dim=0)
distances = torch.norm(positions - center, dim=1)
entropy = distances.std().item()
self.entropies.append(entropy)
dist_to_target = torch.norm(positions - target, dim=1).mean().item()
self.distances.append(dist_to_target)
def plot(self):
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.plot(self.entropies, label="Entropy")
ax1.set_title("Entropy Over Time")
ax1.set_xlabel("Steps")
ax1.set_ylabel("Entropy")
ax2.plot(self.distances, label="Convergence")
ax2.set_title("Convergence to Target")
ax2.set_xlabel("Steps")
ax2.set_ylabel("Avg Distance to Target")
plt.tight_layout()
plt.show()
# Agent class
class Agent:
def __init__(self, position):
self.position = torch.tensor(position, dtype=torch.float32)
self.dna = ["∑", "Ω", "ε₀"]
self.entropy_thresholds = [1.5, 1.0] # Dynamic thresholds for evolution
def emit_symbol(self):
return self.dna[int(torch.norm(self.position - CONFIG["target"]).item()) % 3]
def evolve_dna(self, entropy):
if entropy > self.entropy_thresholds[0]:
self.dna[0] = "∑"
elif entropy > self.entropy_thresholds[1]:
self.dna[0] = "Ω"
else:
self.dna[0] = "ε₀"
def update(self, field, target):
self.position += 0.3 * (field - self.position) + 0.3 * (target - self.position)
# Morphic Memory
class MorphicMemoryCore:
def __init__(self, decay_rate=0.1):
self.memory = []
self.decay_rate = decay_rate
def update(self, state):
self.memory.append(state.clone())
if len(self.memory) > 50:
self.memory.pop(0)
def compute_field(self):
if not self.memory:
return torch.zeros(2)
weights = torch.exp(-self.decay_rate * torch.arange(len(self.memory), 0, -1, dtype=torch.float32))
weights /= weights.sum()
field = sum(w * s.mean(dim=0) for w, s in zip(weights, self.memory))
return field
# TMFS system
class TMFS:
def __init__(self, use_field=True):
self.use_field = use_field
self.agents = [Agent([np.random.rand()*CONFIG["grid_size"], np.random.rand()*CONFIG["grid_size"]]) for _ in range(CONFIG["n_agents"])]
self.memory = MorphicMemoryCore()
self.target = CONFIG["target"]
self.tracker = MetricsTracker()
def step(self):
positions = torch.stack([a.position for a in self.agents])
entropy_val = torch.norm(positions - positions.mean(dim=0), dim=1).std().item()
if self.use_field:
self.memory.update(positions)
field = self.memory.compute_field()
else:
field = torch.zeros(2)
for agent in self.agents:
agent.evolve_dna(entropy_val)
agent.update(field, self.target)
self.tracker.record(torch.stack([a.position for a in self.agents]), self.target)
def run(self):
trajectories = []
for _ in range(CONFIG["steps"]):
self.step()
trajectories.append(torch.stack([a.position for a in self.agents]).clone())
return torch.stack(trajectories), self.tracker
# Run and visualize
def run_simulation():
sim = TMFS(use_field=True)
traj, tracker = sim.run()
# Trajectories
plt.figure(figsize=(12, 6))
for i in range(CONFIG["n_agents"]):
plt.plot(traj[:, i, 0], traj[:, i, 1], label=f"Agent {i+1}")
plt.scatter([CONFIG["target"][0]], [CONFIG["target"][1]], c="red", label="Target")
plt.title("Agent Trajectories With Morphic Field")
plt.legend()
plt.grid(True)
plt.show()
tracker.plot()
print("Simulation complete. Final symbolic DNA:")
print([agent.dna for agent in sim.agents])
if __name__ == "__main__":
run_simulation()