# evo_transformer.py import random class EvoTransformer: def __init__(self, config=None): # Initialize with default or passed config self.config = config or { "layers": 4, "attention_heads": 4, "ffn_dim": 1024, "dropout": 0.1, "memory": False, } self.history = [self.config.copy()] def mutate(self): new_config = self.config.copy() trait = random.choice(list(new_config.keys())) if trait == "layers": new_config[trait] = max(1, new_config[trait] + random.choice([-1, 1])) elif trait == "attention_heads": new_config[trait] = random.choice([2, 4, 6, 8]) elif trait == "ffn_dim": new_config[trait] = random.choice([512, 1024, 2048]) elif trait == "dropout": new_config[trait] = round(min(max(0.0, new_config[trait] + random.uniform(-0.05, 0.05)), 0.5), 2) elif trait == "memory": new_config[trait] = not new_config[trait] self.config = new_config self.history.append(new_config.copy()) def evolve(self, generations=3): for _ in range(generations): self.mutate() def get_history(self): return self.history def evaluate(self): # Simulate an accuracy score for demo purposes score = round(random.uniform(0.85, 0.95), 4) return {"accuracy": score, "params": self.estimate_params()} def estimate_params(self): # Simulated parameter count based on config return 10 + self.config["layers"] * self.config["ffn_dim"] * 0.001