预处理 diagrams 与批量调用

English

需要反复比较同一个 diagram 时,请使用预处理和 one-to-many API。

只预处理一次

import numpy as np
import topp

x = np.array([[0.0, 1.0], [0.25, 0.75]])
query = topp.prepare_diagram(x)

print(query.n_points)         # 所有合法输入行
print(query.n_finite_points)  # 对角线上方的有限点

预处理对象不可变,并持有输入副本:

x[:] = 0.0
assert query.n_finite_points == 2

Bottleneck 批量调用

targets = [
    [[0.0, 1.1], [0.30, 0.80]],
    [[0.0, 2.0]],
    np.empty((0, 2)),
]

distances = topp.bottleneck_distances(query, targets)
assert distances.shape == (3,)
assert distances.dtype == np.float64

Wasserstein 批量调用

w2 = topp.wasserstein_distances(
    query,
    targets,
    order=2,
    internal_p=2,
)

原生调用会在整个目标列表之间复用 Wasserstein workspace。

调用方提供输出数组

out = np.empty(len(targets), dtype=np.float64)
returned = topp.bottleneck_distances(query, targets, out=out)

assert returned is out

out 必须可写、内存对齐、按 C 顺序连续、类型为 float64,且形状为 (len(targets),)

bad = np.empty(len(targets), dtype=np.float32)

try:
    topp.bottleneck_distances(query, targets, out=bad)
except TypeError as error:
    print(error)  # out must have dtype float64

目标列表为空时,返回空的 float64 数组。