import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import json
from datetime import datetime
import os
def toroidal_distance(i, j, grid_size=12):
xi, yi = i % grid_size, (i // grid_size) % grid_size
xj, yj = j % grid_size, (j // grid_size) % grid_size
dx = min(abs(xi - xj), grid_size - abs(xi - xj))
dy = min(abs(yi - yj), grid_size - abs(yi - yj))
return dx + dy
def create_toroidal_mask(seq_len, grid_size=12, radius=2.0, alpha=0.5, dtype=torch.float16, device='cuda'):
mask = torch.zeros(1, 1, seq_len, seq_len, dtype=dtype, device=device)
for i in range(seq_len):
for j in range(seq_len):
if j > i: mask[0, 0, i, j] = float('-inf')
else:
dist = toroidal_distance(i, j, grid_size)
if dist > radius:
mask[0, 0, i, j] = -alpha * (dist - radius)
return mask
TEST_PROMPTS = [
("The capital of France is", ["Paris"]),
("Water freezes at", ["0", "32", "zero"]),
("The largest planet is", ["Jupiter"]),
("Einstein's theory of", ["relativity"]),
("The chemical symbol for gold is", ["Au"]),
("World War II ended in", ["1945"]),
("DNA stands for", ["deoxyribonucleic"]),
("The Mona Lisa was painted by", ["Leonardo", "Vinci"]),
("Shakespeare wrote", ["Hamlet", "Romeo", "Macbeth"]),
("Mount Everest is in", ["Nepal", "Himalaya"]),
("The atomic number of hydrogen is", ["1", "one"]),
("Photosynthesis converts sunlight into", ["energy", "glucose"]),
("The currency of Japan is", ["yen"]),
("Newton discovered", ["gravity", "motion"]),
("The Amazon River is in", ["South America", "Brazil"]),
("The Great Wall was built in", ["China"]),
("Oxygen is what percent of air", ["21", "20"]),
("Pi is approximately", ["3.14", "3.1"]),
("The speed of light is", ["300", "299"]),
("The human heart has", ["four", "4"]),
]
def generate(model, tokenizer, prompt, use_toroidal=False, max_tokens=30):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
seq_len = inputs['input_ids'].shape[1]
if use_toroidal:
attn_mask = create_toroidal_mask(
seq_len + max_tokens, grid_size=12, radius=2.0, alpha=0.5,
dtype=model.dtype, device=model.device
)
else:
attn_mask = None
with torch.no_grad():
out = model.generate(
**inputs,
max_new_tokens=max_tokens,
do_sample=False,
attention_mask=inputs.get('attention_mask'),
pad_token_id=tokenizer.pad_token_id,
)
return tokenizer.decode(out[0], skip_special_tokens=True)
def run_test(model_name="mistralai/Mistral-7B-v0.1", num_samples=20):
print("=" * 60)
print("TOROIDAL COHERENCE TEST")
print("=" * 60)
print(f"Model: {model_name}")
print(f"Samples: {num_samples}")
print("\nLoading...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto",
)
print(f"GPU: {torch.cuda.memory_allocated()/1e9:.1f}GB")
prompts = (TEST_PROMPTS * 2)[:num_samples]
results = {
"model": model_name,
"baseline": {"correct": 0, "total": 0},
"toroidal": {"correct": 0, "total": 0},
"details": []
}
print("\nRunning baseline and toroidal for each prompt...")
for i, (prompt, expected) in enumerate(prompts):
resp_base = generate(model, tokenizer, prompt, use_toroidal=False)
correct_base = any(e.lower() in resp_base.lower() for e in expected)
results["baseline"]["total"] += 1
if correct_base:
results["baseline"]["correct"] += 1
resp_toro = generate(model, tokenizer, prompt, use_toroidal=True)
correct_toro = any(e.lower() in resp_toro.lower() for e in expected)
results["toroidal"]["total"] += 1
if correct_toro:
results["toroidal"]["correct"] += 1
results["details"].append({
"prompt": prompt,
"baseline": resp_base[:100],
"toroidal": resp_toro[:100],
"base_correct": correct_base,
"toro_correct": correct_toro,
})
mark_b = "✓" if correct_base else "✗"
mark_t = "✓" if correct_toro else "✗"
print(f"[{i+1:2d}] B:{mark_b} T:{mark_t} | {prompt[:30]}...")
base_acc = results["baseline"]["correct"] / results["baseline"]["total"]
toro_acc = results["toroidal"]["correct"] / results["toroidal"]["total"]
print("\n" + "=" * 60)
print("RESULTS")
print("=" * 60)
print(f"Baseline: {base_acc:.1%} ({results['baseline']['correct']}/{results['baseline']['total']})")
print(f"Toroidal: {toro_acc:.1%} ({results['toroidal']['correct']}/{results['toroidal']['total']})")
os.makedirs("./results", exist_ok=True)
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
outfile = f"./results/simple_{ts}.json"
with open(outfile, "w") as f:
json.dump(results, f, indent=2)
print(f"\nSaved: {outfile}")
return results
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--model", default="mistralai/Mistral-7B-v0.1")
parser.add_argument("--samples", type=int, default=20)
args = parser.parse_args()
run_test(args.model, args.samples)