LJdacnMXkr / evidence /code /core.py
DineshAI's picture
Publish cumulative Sinkhorn reproduction evidence
5338e3e verified
Raw
History Blame Contribute Delete
2.95 kB
"""Numerical primitives reconstructed from the exact judged logbook.
The judged Hugging Face revision embedded ``verify.py`` but did not preserve this
imported helper. These functions implement the formulas described by that
logbook and by Algorithm 1 of arXiv:2507.06161.
"""
from __future__ import annotations
import numpy as np
from scipy.linalg import expm
from scipy.spatial.distance import cdist
def gaussian_kernel(points: np.ndarray, sigma: float) -> np.ndarray:
distances = cdist(points, points, metric="sqeuclidean")
return np.exp(-distances / (2.0 * sigma**2))
def exponential_kernel(points: np.ndarray, sigma: float) -> np.ndarray:
distances = cdist(points, points, metric="euclidean")
return np.exp(-distances / sigma)
def heat_kernel(laplacian: np.ndarray, time: float) -> np.ndarray:
return expm(-time * laplacian)
def symmetric_sinkhorn(
smoothing: np.ndarray,
tol: float = 1e-12,
max_iter: int = 1_000,
) -> tuple[np.ndarray, np.ndarray, int, float, list[float]]:
"""Apply the symmetric Sinkhorn update from Algorithm 1.
The returned error curve uses the maximum absolute row-sum residual, which
matches the stopping behavior reported in the judged logbook.
"""
n = smoothing.shape[0]
scaling = np.ones(n, dtype=np.float64)
errors: list[float] = []
for iteration in range(1, max_iter + 1):
normalized = scaling[:, None] * smoothing * scaling[None, :]
residual = normalized @ np.ones(n, dtype=np.float64) - 1.0
error = float(np.max(np.abs(residual)))
errors.append(error)
if error < tol:
return normalized, scaling, iteration, error, errors
denominator = smoothing @ scaling
scaling = np.sqrt(scaling / np.maximum(denominator, 1e-300))
normalized = scaling[:, None] * smoothing * scaling[None, :]
residual = normalized @ np.ones(n, dtype=np.float64) - 1.0
error = float(np.max(np.abs(residual)))
return normalized, scaling, max_iter, error, errors
def axiom_symmetry(operator: np.ndarray) -> float:
return float(np.max(np.abs(operator - operator.T)))
def axiom_mass_conservation(operator: np.ndarray) -> float:
return float(np.max(np.abs(operator @ np.ones(operator.shape[0]) - 1.0)))
def axiom_spectrum(operator: np.ndarray) -> tuple[float, float]:
eigenvalues = np.linalg.eigvalsh((operator + operator.T) / 2.0)
return float(eigenvalues[0]), float(eigenvalues[-1])
def axiom_positivity(operator: np.ndarray) -> float:
mask = ~np.eye(operator.shape[0], dtype=bool)
return float(np.min(operator[mask]))
def is_diffusion_operator(operator: np.ndarray, tol: float = 1e-6) -> bool:
low, high = axiom_spectrum(operator)
return bool(
axiom_symmetry(operator) < tol
and axiom_mass_conservation(operator) < tol
and low >= -tol
and high <= 1.0 + tol
and axiom_positivity(operator) >= -tol
)