Spaces:
Sleeping
Sleeping
# 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 | |