|
|
>>> a=[.5,.5]
|
|
|
>>> b=[.5,.5]
|
|
|
>>> M=[[0.,1.],[1.,0.]]
|
|
|
>>> ot.sinkhorn(a,b,M,1)
|
|
|
m = b.shape[0]
|
|
|
|
|
|
# Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute
|
|
|
K = np.empty(M.shape, dtype=M.dtype)
|
|
|
np.divide(M, -reg, out=K)
|
|
|
np.exp(K, out=K)
|
|
|
|
|
|
u = np.ones(n)/n
|
|
|
np.exp(K, out=K)
|
|
|
|
|
|
u = np.ones(n)/n
|
|
|
v = np.ones(m)/m
|
|
|
|
|
|
u = np.ones(n)/n
|
|
|
v = np.ones(m)/m
|
|
|
G = np.diag(u)@K@np.diag(v)
|
|
|
G[:,i_2] = u*K[:,i_2]*v[i_2]
|
|
|
#aviol = (G@one_m - a)
|
|
|
#aviol_2 = (G.T@one_n - b)
|
|
|
viol = viol + ( -old_v + v[i_2])*K[:,i_2]*u
|
|
|
np.testing.assert_allclose(G0, Ges, atol=1e-05)
|
|
|
np.testing.assert_allclose(G0, Gerr)
|
|
|
|
|
|
np.testing.assert_allclose(G0, G_green, atol = 1e-32)
|
|
|
np.testing.assert_allclose(G0, Gerr)
|
|
|
|
|
|
np.testing.assert_allclose(G0, G_green, atol = 1e-32)
|
|
|
print(G0,G_green)
|
|
|
one_n = np.ones(n)
|
|
|
one_m = np.ones(m)
|
|
|
viol = G@one_m - a
|
|
|
viol_2 = G.T@one_n - b
|
|
|
log['u'] = u
|
|
|
log['v'] = v
|
|
|
|
|
|
while i < numItermax and stopThr_val > stopThr:
|