Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Point sets and transport

Squared MMD Statistic

mmd_statistics
all-pairspairedcondensedsinglestatisticPoint sets
\[ \widehat{\operatorname{MMD}}_u^2=\frac{\sum_{i\ne j}k(x_i,x_j)}{P(P-1)}+\frac{\sum_{i\ne j}k(y_i,y_j)}{Q(Q-1)}-\frac{2\sum_{i,j}k(x_i,y_j)}{PQ} \]

estimator="unbiased" is the default and requires at least two valid points on each side. estimator="biased" includes diagonals. Signed result: no clamp or root.

Shapes and Modes

InputLayout
One sample[P,D]
Collection X[...,N,P,D]
Collection Y[...,M,Q,D]
ModeSelectorOutput
all-pairscompare(X,Y,metric=...)[...,N,M]
pairedcompare(X,Y,metric=...,mode="paired")[...,N]; equal sample counts
condensedcompare(X,metric=...,mode="condensed")[...,N*(N-1)//2]; strict upper triangle
singlecompare(x,y,metric=...,mode="single")[...]; leading batches only

Leading batch dimensions broadcast. See mode and shape conventions.

Entry Points

Named Python entryFunction
All-pairsmmd_statistics
Pairedpaired_mmd_statistics
Condensedcondensed_mmd_statistics

The Python and C++ compare selectors cover every mode shown above. Use compare for this statistic; distance/kernel selectors have different roles. single_comparison is shorthand for single mode.

Catalog aliases: mmd_statistic.

Accepted metric options: kernel, estimator, length_scale, gamma, degree, coef0, alpha, nu, batched, feature_dim, x1_lengths, x2_lengths, chunk_size. Omitted options keep the metric defaults; unused options are rejected.

Example

Choose Python or C++ in the top bar; the setting applies across this guide.

Python
import torch
import torchpairwise as tp

X = torch.rand(2, 3, 2)  # [N=2,P=3,D=2]
Y = torch.rand(3, 4, 2)  # [M=3,Q=4,D=2]

metric = "mmd_statistics"
all_pairs = tp.compare(X, Y, metric=metric)  # [2,3]
paired_Y = Y[:2]
paired = tp.compare(X, paired_Y, metric=metric, mode="paired")  # [2]
condensed = tp.compare(X, metric=metric, mode="condensed")      # [1]
x, y = X[0], Y[0]
single = tp.compare(x, y, metric=metric, mode="single")  # scalar
C++ / LibTorch
#include <torchpairwise.h>

namespace tp = torchpairwise::ops;
auto X = at::rand({2, 3, 2});  // [N=2,P=3,D=2]
auto Y = at::rand({3, 4, 2});  // [M=3,Q=4,D=2]

const std::string metric = "mmd_statistics";
tp::ComparisonOptions options;
auto all_pairs = tp::compare(X, Y, metric, "all_pairs", options);  // [2,3]
auto paired_Y = Y.narrow(0, 0, 2);
auto paired = tp::compare(X, paired_Y, metric, "paired", options);  // [2]
// [1]
auto condensed = tp::compare(X, c10::nullopt, metric, "condensed", options);
auto x = X[0], y = Y[0];
auto single = tp::compare(x, y, metric, "single", options);  // scalar

Streamed Evaluation

tp.lazy(x, y, name) binds this statistic for reductions, selection and products without retaining its full generated comparison matrix. Native source factories depend on the sample family; see streamed operators and C++ use.

Numerical Contract

Floating CPU/CUDA inputs use matching float32 / float64, with lower precision promoted under autocast where supported. First derivatives follow the metric’s smooth and boundary conventions. See the detailed conventions and precision and deployment.