Research-Stack/4-Infrastructure/shim/dual_quat_model_selector.py
allaun 364d249688 feat(agent): dual quaternion model selector with mass semantic numbers
Each model = dual quaternion (real = compressive, dual = anti-compressive).
Chiral ratio χ = |real|² / (|real|² + |dual|²) determines selection.

Results at threshold 0.99:
- lean_proof: 6 models (drops GLM, DS Flash)
- code_bug: 3 models (DeepSeek + Opus + Cohere)
- architecture: 7 models (drops DS Flash)
- math_novel: 6 models (drops GLM, DS Flash)
- infra_debug: 2 models (DeepSeek + Opus only)
- hard_wall: 4 models (drops diversity tier)

Z-transform compression for model selection history included.
Dual quaternion multiplication for panel composition.
2026-06-22 16:12:58 -05:00

365 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
dual_quat_model_selector.py — Mass semantic model selector using dual quaternions.
Each model's semantic mass is a dual quaternion:
Real part (q_real): compressive components (H, I, C, quality)
Dual part (q_dual): anti-compressive components (R, L, noise, cost)
The chiral ratio χ = |q_real|² / (|q_real|² + |q_dual|²) determines
whether to keep (χ > 0.5) or drop (χ < 0.5) each model.
The panel is a dual quaternion matrix. Selection = project onto the
real subspace, keeping only models with χ > threshold.
Usage:
python3 dual_quat_model_selector.py [--threshold 0.5] [--problem-type lean_proof]
"""
import argparse
import json
import math
from dataclasses import dataclass, field
from typing import Optional
# ── Dual Quaternion ──────────────────────────────────────────────────────
@dataclass
class DualQuat:
"""Dual quaternion: q = q_real + ε·q_dual, where ε² = 0."""
# Real part (4 components)
rw: float = 0.0 # scalar
rx: float = 0.0 # i
ry: float = 0.0 # j
rz: float = 0.0 # k
# Dual part (4 components)
dw: float = 0.0 # ε·scalar
dx: float = 0.0 # ε·i
dy: float = 0.0 # ε·j
dz: float = 0.0 # ε·k
@property
def real_norm_sq(self) -> float:
"""|q_real|² = rw² + rx² + ry² + rz²"""
return self.rw**2 + self.rx**2 + self.ry**2 + self.rz**2
@property
def dual_norm_sq(self) -> float:
"""|q_dual|² = dw² + dx² + dy² + dz²"""
return self.dw**2 + self.dx**2 + self.dy**2 + self.dz**2
@property
def chi(self) -> float:
"""Chiral ratio χ = |q_real|² / (|q_real|² + |q_dual|²)"""
r = self.real_norm_sq
d = self.dual_norm_sq
total = r + d
if total == 0:
return 0.5 # critical balance
return r / total
@property
def is_compressible(self) -> bool:
"""χ > 0.5: real (compressive) dominates"""
return self.chi > 0.5
@property
def mass(self) -> float:
"""Total semantic mass = |q_real| + |q_dual|"""
return math.sqrt(self.real_norm_sq) + math.sqrt(self.dual_norm_sq)
def __mul__(self, other: 'DualQuat') -> 'DualQuat':
"""Dual quaternion multiplication (Hamilton product + dual extension)."""
# Real part: q1_real × q2_real
rw = self.rw*other.rw - self.rx*other.rx - self.ry*other.ry - self.rz*other.rz
rx = self.rw*other.rx + self.rx*other.rw + self.ry*other.rz - self.rz*other.ry
ry = self.rw*other.ry - self.rx*other.rz + self.ry*other.rw + self.rz*other.rx
rz = self.rw*other.rz + self.rx*other.ry - self.ry*other.rx + self.rz*other.rw
# Dual part: q1_real × q2_dual + q1_dual × q2_real
dw = self.rw*other.dw + self.rx*other.dx + self.ry*other.dy + self.rz*other.dz + \
self.dw*other.rw - self.dx*other.rx - self.dy*other.ry - self.dz*other.rz
dx = self.rw*other.dx - self.rx*other.dw + self.ry*other.dz - self.rz*other.dy + \
self.dw*other.rx + self.dx*other.rw + self.dy*other.rz - self.dz*other.ry
dy = self.rw*other.dy - self.rx*other.dz - self.ry*other.dw + self.rz*other.dx + \
self.dw*other.ry - self.dx*other.rz + self.dy*other.rw + self.dz*other.rx
dz = self.rw*other.dz + self.rx*other.dy - self.ry*other.dx - self.rz*other.dw + \
self.dw*other.rz + self.dx*other.ry - self.dy*other.rx + self.dz*other.rw
return DualQuat(rw, rx, ry, rz, dw, dx, dy, dz)
def conjugate(self) -> 'DualQuat':
"""Quaternion conjugate: q* = (rw, -rx, -ry, -rz, dw, -dx, -dy, -dz)"""
return DualQuat(self.rw, -self.rx, -self.ry, -self.rz,
self.dw, -self.dx, -self.dy, -self.dz)
def to_dict(self) -> dict:
return {
"real": [self.rw, self.rx, self.ry, self.rz],
"dual": [self.dw, self.dx, self.dy, self.dz],
"chi": round(self.chi, 4),
"mass": round(self.mass, 4),
"compressible": self.is_compressible,
}
# ── Semantic Mass → Dual Quaternion ─────────────────────────────────────
def mass_to_dualquat(mass: dict) -> DualQuat:
"""Convert semantic mass vector to dual quaternion.
Mapping:
Real (compressive): H (reasoning), I (invariant), C (closure), quality
Dual (anti-compressive): R (residual/scar), L (latency), noise, cost
"""
H = mass.get("H", 0) # reasoning depth
I = mass.get("I", 0) # invariant pressure
C = mass.get("C", 0) # closure cost
R = mass.get("R", 0) # residual scar
L = mass.get("L", 0) # latency cost
Q = mass.get("Q", 0) # quality (derived)
# Real part: compressive components
rw = H * 0.4 + I * 0.3 + C * 0.2 + Q * 0.1
rx = H * 0.3 - I * 0.1 # reasoning - invariant coupling
ry = C * 0.2 + Q * 0.1 # closure + quality coupling
rz = H * 0.1 + C * 0.1 # reasoning + closure coupling
# Dual part: anti-compressive components
dw = R * 0.5 + L * 0.3 # scar + latency
dx = R * 0.3 - L * 0.1 # scar - latency coupling
dy = L * 0.2 + R * 0.1 # latency + scar coupling
dz = R * 0.1 + L * 0.1 # scar + latency coupling
return DualQuat(rw, rx, ry, rz, dw, dx, dy, dz)
# ── Model Registry ──────────────────────────────────────────────────────
MODELS = {
"deepseek-v4-pro": {
"provider": "deepseek",
"cost_per_1m": (0.27, 1.10),
"mass": {"H": 0.9, "L": 0.1, "I": 0.8, "R": 0.1, "C": 0.9, "Q": 0.85},
"strengths": ["math", "code", "reasoning"],
},
"deepseek-v4-flash": {
"provider": "deepseek",
"cost_per_1m": (0.07, 0.28),
"mass": {"H": 0.3, "L": 0.05, "I": 0.4, "R": 0.3, "C": 0.4, "Q": 0.35},
"strengths": ["speed", "iteration"],
},
"claude-opus": {
"provider": "anthropic",
"cost_per_1m": (15.0, 75.0),
"mass": {"H": 0.95, "L": 0.3, "I": 0.9, "R": 0.05, "C": 0.85, "Q": 0.9},
"strengths": ["formal_proof", "synthesis", "lean"],
},
"gpt-5.5": {
"provider": "openai",
"cost_per_1m": (10.0, 30.0),
"mass": {"H": 0.7, "L": 0.2, "I": 0.7, "R": 0.15, "C": 0.8, "Q": 0.7},
"strengths": ["breadth", "ops", "implementation"],
},
"cohere-command": {
"provider": "cohere",
"cost_per_1m": (2.50, 10.0),
"mass": {"H": 0.6, "L": 0.15, "I": 0.8, "R": 0.1, "C": 0.7, "Q": 0.65},
"strengths": ["structured_output", "tool_use", "rag"],
},
"gemini-pro": {
"provider": "google",
"cost_per_1m": (1.25, 5.0),
"mass": {"H": 0.5, "L": 0.1, "I": 0.6, "R": 0.2, "C": 0.6, "Q": 0.55},
"strengths": ["multimodal", "different_perspective"],
},
"glm-5.2": {
"provider": "zhipu",
"cost_per_1m": (1.0, 4.0),
"mass": {"H": 0.4, "L": 0.15, "I": 0.5, "R": 0.25, "C": 0.5, "Q": 0.45},
"strengths": ["architectural_diversity", "753B"],
},
"kimi-k2.6": {
"provider": "moonshot",
"cost_per_1m": (0.50, 2.0),
"mass": {"H": 0.45, "L": 0.1, "I": 0.55, "R": 0.2, "C": 0.55, "Q": 0.5},
"strengths": ["code", "different_training"],
},
}
# Problem type → dimension weights (which H/I/R/L/C components matter most)
PROBLEM_WEIGHTS = {
"lean_proof": {"H": 1.0, "I": 0.9, "C": 0.8, "R": 0.3, "L": 0.2, "Q": 0.9},
"code_bug": {"H": 0.6, "I": 0.5, "C": 0.7, "R": 0.4, "L": 0.3, "Q": 0.7},
"architecture": {"H": 0.8, "I": 0.7, "C": 0.9, "R": 0.2, "L": 0.2, "Q": 0.8},
"math_novel": {"H": 1.0, "I": 0.8, "C": 0.7, "R": 0.3, "L": 0.2, "Q": 0.85},
"infra_debug": {"H": 0.5, "I": 0.4, "C": 0.6, "R": 0.5, "L": 0.3, "Q": 0.6},
"hard_wall": {"H": 1.0, "I": 1.0, "C": 1.0, "R": 0.5, "L": 0.5, "Q": 1.0},
}
# ── Model Selection ──────────────────────────────────────────────────────
def select_models(problem_type: str, threshold: float = 0.5,
max_models: int = 8) -> dict:
"""Select models using dual quaternion chiral ratio.
Args:
problem_type: One of lean_proof, code_bug, architecture, math_novel, infra_debug, hard_wall
threshold: Minimum χ to keep a model (default 0.5)
max_models: Maximum models to select
Returns:
dict with selected models, their χ values, and cost estimate
"""
weights = PROBLEM_WEIGHTS.get(problem_type, PROBLEM_WEIGHTS["code_bug"])
# Compute dual quaternion for each model, weighted by problem type
model_dqs = []
for name, config in MODELS.items():
mass = config["mass"]
# Apply problem-type weights
weighted_mass = {k: mass.get(k, 0) * weights.get(k, 0) for k in
set(mass.keys()) | set(weights.keys())}
dq = mass_to_dualquat(weighted_mass)
model_dqs.append((name, dq, config))
# Sort by χ (highest first = most compressive)
model_dqs.sort(key=lambda x: x[1].chi, reverse=True)
# Select models with χ > threshold
selected = []
for name, dq, config in model_dqs:
if len(selected) >= max_models:
break
if dq.chi >= threshold:
selected.append({
"model": name,
"provider": config["provider"],
"chi": round(dq.chi, 4),
"mass": round(dq.mass, 4),
"cost_per_1m": config["cost_per_1m"],
"strengths": config["strengths"],
"dq": dq.to_dict(),
})
# Compute panel dual quaternion (sum of selected models)
panel_dq = DualQuat()
for _, dq, _ in [(n, d, c) for n, d, c in model_dqs if any(s["model"] == n for s in selected)]:
panel_dq = DualQuat(
panel_dq.rw + dq.rw, panel_dq.rx + dq.rx,
panel_dq.ry + dq.ry, panel_dq.rz + dq.rz,
panel_dq.dw + dq.dw, panel_dq.dx + dq.dx,
panel_dq.dy + dq.dy, panel_dq.dz + dq.dz,
)
# Estimate cost (assume 1000 tokens in, 2000 tokens out per model)
total_cost = 0
for s in selected:
cost_in, cost_out = s["cost_per_1m"]
total_cost += (1000 / 1_000_000) * cost_in + (2000 / 1_000_000) * cost_out
return {
"problem_type": problem_type,
"threshold": threshold,
"selected": selected,
"dropped": [n for n, _, _ in model_dqs if not any(s["model"] == n for s in selected)],
"panel_chi": round(panel_dq.chi, 4),
"panel_mass": round(panel_dq.mass, 4),
"estimated_cost": round(total_cost, 4),
"model_count": len(selected),
}
# ── Z-Transform Compression ─────────────────────────────────────────────
def compress_history(mass_stream: list[float], order: int = 2) -> dict:
"""Compress semantic mass history into Z-domain recurrence.
μ[k] = a₁·μ[k-1] + a₂·μ[k-2] + b₀·u[k]
Returns coefficients + state vector.
"""
if len(mass_stream) < order + 1:
return {"error": "need more data points", "min_required": order + 1}
# Simple least-squares fit for AR(2) model
n = len(mass_stream)
# Build matrix for [a1, a2, b0] estimation
# μ[k] = a1*μ[k-1] + a2*μ[k-2] + b0*u[k]
# where u[k] = 1 (constant input)
sum_mu_k1 = sum(mass_stream[k] * mass_stream[k-1] for k in range(2, n))
sum_mu_k2 = sum(mass_stream[k] * mass_stream[k-2] for k in range(2, n))
sum_mu_k = sum(mass_stream[k] for k in range(2, n))
sum_mu_k1_sq = sum(mass_stream[k-1]**2 for k in range(2, n))
sum_mu_k2_sq = sum(mass_stream[k-2]**2 for k in range(2, n))
sum_mu_k1_k2 = sum(mass_stream[k-1] * mass_stream[k-2] for k in range(2, n))
sum_mu_k1_u = sum(mass_stream[k-1] for k in range(2, n))
sum_mu_k2_u = sum(mass_stream[k-2] for k in range(2, n))
# Simplified: use Yule-Walker equations for AR(2)
n_obs = n - 2
if n_obs < 3:
return {"error": "insufficient data"}
# Autocorrelation
mean_mu = sum(mass_stream) / n
r0 = sum((m - mean_mu)**2 for m in mass_stream) / n
r1 = sum((mass_stream[k] - mean_mu) * (mass_stream[k-1] - mean_mu) for k in range(1, n)) / n
r2 = sum((mass_stream[k] - mean_mu) * (mass_stream[k-2] - mean_mu) for k in range(2, n)) / n
if r0 == 0:
return {"a1": 0, "a2": 0, "b0": mean_mu, "r0": 0, "r1": 0, "r2": 0}
# Yule-Walker: [r0 r1; r1 r0] [a1; a2] = [r1; r2]
det = r0 * r0 - r1 * r1
if abs(det) < 1e-10:
a1 = r1 / r0 if r0 > 0 else 0
a2 = 0
else:
a1 = (r0 * r1 - r1 * r2) / det
a2 = (r0 * r2 - r1 * r1) / det
b0 = mean_mu * (1 - a1 - a2)
return {
"a1": round(a1, 6),
"a2": round(a2, 6),
"b0": round(b0, 6),
"r0": round(r0, 6),
"r1": round(r1, 6),
"r2": round(r2, 6),
"mean": round(mean_mu, 6),
"stream_length": n,
}
# ── CLI ──────────────────────────────────────────────────────────────────
def main():
parser = argparse.ArgumentParser(description="Dual quaternion model selector")
parser.add_argument("--threshold", type=float, default=0.5, help="χ threshold")
parser.add_argument("--problem-type", default="lean_proof",
choices=list(PROBLEM_WEIGHTS.keys()))
parser.add_argument("--max-models", type=int, default=8)
parser.add_argument("--all-types", action="store_true", help="Show all problem types")
args = parser.parse_args()
if args.all_types:
for ptype in PROBLEM_WEIGHTS:
result = select_models(ptype, args.threshold, args.max_models)
print(f"\n{'='*60}")
print(f" {ptype} (threshold={args.threshold})")
print(f"{'='*60}")
print(f" Selected: {result['model_count']} models, χ_panel={result['panel_chi']}")
print(f" Cost: ${result['estimated_cost']:.4f}")
for s in result["selected"]:
print(f" {s['model']:20s} χ={s['chi']:.3f} ${s['cost_per_1m'][0]:.2f}/${s['cost_per_1m'][1]:.2f}")
if result["dropped"]:
print(f" Dropped: {', '.join(result['dropped'])}")
else:
result = select_models(args.problem_type, args.threshold, args.max_models)
print(json.dumps(result, indent=2))
if __name__ == "__main__":
main()