# evo_transformer.py import random import json class EvoTransformer: def __init__(self, config=None): 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): score = round(random.uniform(0.85, 0.95), 4) return {"accuracy": score, "params": self.estimate_params()} def estimate_params(self): return round(self.config["layers"] * self.config["ffn_dim"] * 0.001, 2) def save_history(self): csv_path = "evo_history.csv" json_path = "evo_history.json" with open(csv_path, "w") as f: f.write("generation,layers,attention_heads,ffn_dim,dropout,memory\n") for i, cfg in enumerate(self.history): f.write(f"{i+1},{cfg['layers']},{cfg['attention_heads']},{cfg['ffn_dim']},{cfg['dropout']},{cfg['memory']}\n") with open(json_path, "w") as f: json.dump(self.history, f, indent=2) return csv_path, json_path