zuna / bottlenecks.py
mhough's picture
Self-contained HF-compatible ZUNA (vendored arch, byte-identical weights)
c618186 verified
Raw
History Blame Contribute Delete
643 Bytes
from torch import Tensor
import torch
def imq_kernel2(X: Tensor, Y: Tensor, C: float) -> Tensor:
dist_sq = torch.cdist(X, Y, p=2).pow(2)
return C / (C + dist_sq)
@torch.compile()
def mmd_imq(X: Tensor, Y: Tensor, C: float) -> Tensor:
K_XX = imq_kernel2(X, X, C)
K_YY = imq_kernel2(Y, Y, C)
K_XY = imq_kernel2(X, Y, C)
n, m = X.size(0), Y.size(0)
term1 = (K_XX.sum().double() - K_XX.diag().sum().double()).double() / (n*(n-1)) if n>1 else 0.0
term2 = (K_YY.sum().double() - K_YY.diag().sum().double()).double() / (m*(m-1)) if m>1 else 0.0
term3 = 2 * K_XY.mean()
return (term1 + term2 - term3).float()