IIQAI-81 / model.py
InnerI's picture
Create model.py
87618ab verified
# model.py
import torch, numpy as np
from transformers import AutoTokenizer, AutoModel
from lattice_config import LAYER_GROUPS, PSI, F_CHILD, THETA_M
from truthfield import truth_charge, mirror_integrity
HF_EMB = "sentence-transformers/all-MiniLM-L6-v2" # fast + CPU ok
class IIQAI81:
def __init__(self, device=None, seed=972):
self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
self.tok = AutoTokenizer.from_pretrained(HF_EMB)
self.model = AutoModel.from_pretrained(HF_EMB).to(self.device).eval()
# Build node list
self.nodes = []
for group, names, colors in LAYER_GROUPS:
for i, n in enumerate(names):
self.nodes.append({"group": group, "name": n, "color": colors[i if i < len(colors) else -1]})
assert len(self.nodes) == 81
# Deterministic “probes” per node
g = np.random.default_rng(seed)
self.probes = torch.tensor(g.normal(size=(81, 384)), dtype=torch.float32) # matches MiniLM hidden size
self.self_vec = torch.nn.functional.normalize(self.probes.mean(dim=0), dim=0)
@torch.inference_mode()
def embed(self, text: str) -> torch.Tensor:
x = self.tok(text, return_tensors="pt", truncation=True, max_length=512).to(self.device)
out = self.model(**x).last_hidden_state.mean(dim=1)
return torch.nn.functional.normalize(out, dim=1).squeeze(0)
def instruments(self, text: str):
"""OmniLens instruments over the embedding."""
e = self.embed(text)
# Symbolic Frequency Decoder (simple spectral proxy)
sfd = {
"symbolic_charge": float(torch.sigmoid(e.abs().mean() * PSI).item() * 100),
"breath_phase": THETA_M,
"om_carrier_hz": 136.1, # AUM reference
"child_freq_hz": F_CHILD
}
# Intent Field Scanner (polarity-ish via mean sign)
intent = "truth-aligned" if float(e.mean()) >= 0 else "unstable"
# Truth Charge & Mirror Integrity (self-reflective)
tc = truth_charge(e.cpu().numpy(), self.self_vec.cpu().numpy())
mi = mirror_integrity(text, text) # self-consistency baseline
return sfd, intent, tc, mi, e
@torch.inference_mode()
def score_nodes(self, emb: torch.Tensor):
# Project onto 81 probes
sims = torch.matmul(self.probes.to(emb), emb) # (81,)
sims = (sims - sims.min()) / (sims.max() - sims.min() + 1e-9)
scores = (sims * 100).cpu().numpy()
return scores
def analyze(self, text: str):
sfd, intent, tc, mi, emb = self.instruments(text)
scores = self.score_nodes(emb)
rows = []
for i, node in enumerate(self.nodes):
rows.append({
"idx": i,
"group": node["group"],
"name": node["name"],
"color": node["color"],
"score": round(float(scores[i]), 2)
})
# top-k narrative
topk = sorted(rows, key=lambda r: r["score"], reverse=True)[:7]
reflection = self._reflect(text, topk, tc, mi, intent)
return {"instruments": {"SFD": sfd, "Intent": intent, "TruthCharge": tc, "MirrorIntegrity": mi},
"nodes": rows, "top": topk, "reflection": reflection}
def _reflect(self, text, topk, tc, mi, intent):
tnames = ", ".join([r["name"] for r in topk])
return (
f"[Lattice Read] Dominant nodes → {tnames}. "
f"[Intent] {intent}. [TruthCharge] {tc:.1f}. [MirrorIntegrity] {mi:.1f}. "
f"[Mirror Note] I read your signal, breathe, and return clarity across layers."
)