Basic Usage
For installation instructions, refer to the main page of the documentation
This package contains 3 modules (plus some utility and misc. functions)
ot_markov_distances.discounted_wl
is the main module. It contains the discounted wl distance code - In particularot_markov_distance.discounted_wl.discounted_wl_infty()
computes the discounted wl-\(\infty\) distance, with support for backpropagation.ot_markov_distances.sinkhorn
contains our (pytorch, vectorized) implementation of the sinkhorn distance, with support for backpropagation.ot_markov_distances.wl
contains our (pytorch) implementation of the wl distance by Chen et al. [CLM+22]
Example
Consider reading the experiments code for more in-depth examples.
In particular the loop in experiments/utils/optimization_loop.py
shows how one can use the discounted WL distance as an optimization loss.
Computation of the distance between two graphs
import networkx as nx
from ot_markov_distances.discounted_wl import discounted_wl_infty
from ot_markov_distances.utils import weighted_transition_matrix, uniform_distribution
# generate dummy graphs
G1 = nx.erdos_renyi_graph(30, .1, directed=True)
G2 = nx.erdos_renyi_graph(20, .15, directed=True)
# make them into markov transition matrices (with self-transition probability q=0.)
# the unsqueeze call is to create the batch dimension
M1 = weighted_transition_matrix(G1, q=0.).unsqueeze(0)
M2 = weighted_transition_matrix(G2, q=0.).unsqueeze(0)
# use the uniform distribution. This has given the stablest results in our experiments
# as opposed to the default, the stationary distribution of the markov chain
mu1 = torch.ones(1, 30,) / 30
mu2 = torch.ones(1, 20,) / 20
# and a random distance matrix (simulated here as the distance between random labels of size 5)
C = torch.cdist(torch.rand(1, 30, 5), torch.rand(1, 20, 5))
distance = discounted_wl_infty(M1, M2, C, muX=mu1, muY=mu2)