import numpy as np import hashlib import matplotlib.pyplot as plt import os from copy import deepcopy class SymbolicMemory: def __init__(self): self.memory = {} self.history = [] def encode(self, grid): flat = grid.flatten() key = hashlib.sha256(str((grid.shape, tuple(np.bincount(flat, minlength=10)))).encode()).hexdigest() return key def store(self, key, value): self.memory[key] = value def entropy(self, grid): flat = grid.flatten() _, counts = np.unique(flat, return_counts=True) probs = counts / counts.sum() entropy = -np.sum(probs * np.log2(probs)) self.history.append(entropy) return entropy def plot(self, task_id): os.makedirs("entropy_graphs", exist_ok=True) plt.plot(self.history) plt.title(f"ZEVE Entropy: {task_id}") plt.xlabel("Step") plt.ylabel("Entropy") plt.savefig(f"entropy_graphs/entropy_{task_id}.png") plt.clf() class IRACOETSolver: def __init__(self): self.memory = SymbolicMemory() def solve_task(self, task): for pair in task['train']: key = self.memory.encode(np.array(pair['input'])) self.memory.store(key, pair['output']) results = [] for pair in task['test']: result = self.solve(np.array(pair['input']), task.get('id', 'unknown')) results.append(result) return results def solve(self, grid, task_id): current = deepcopy(grid) best = self.memory.entropy(current) for _ in range(9): options = [ np.fliplr(current), np.flipud(current), np.rot90(current), np.roll(current, 1, 0), np.roll(current, 1, 1) ] scored = [(g, self.memory.entropy(g)) for g in options] candidate, score = min(scored, key=lambda x: x[1]) if score < best: current, best = candidate, score else: break self.memory.plot(task_id) return current.tolist()