summaryrefslogtreecommitdiff
path: root/ot
diff options
context:
space:
mode:
authorRĂ©mi Flamary <remi.flamary@gmail.com>2022-01-28 17:40:16 +0100
committerGitHub <noreply@github.com>2022-01-28 17:40:16 +0100
commit71a57c68ea9eb2bc948c4dd1cce9928f34bf20e8 (patch)
tree1d07299ff3e99003642a8eb72537abe2bc6eb8b3 /ot
parentd7c709e2bae3bafec9efad87e758919c8db61933 (diff)
[MRG] Backend implementation of the free support barycenter (#340)
* backend version barycenter * new tests * cleanup release file and doc * f*ing pep8 * remove unused variable
Diffstat (limited to 'ot')
-rw-r--r--ot/lp/__init__.py28
1 files changed, 15 insertions, 13 deletions
diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py
index 5da897d..2ff7c1f 100644
--- a/ot/lp/__init__.py
+++ b/ot/lp/__init__.py
@@ -535,18 +535,18 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None
Parameters
----------
- measures_locations : list of N (k_i,d) numpy.ndarray
+ measures_locations : list of N (k_i,d) array-like
The discrete support of a measure supported on :math:`k_i` locations of a `d`-dimensional space
(:math:`k_i` can be different for each element of the list)
- measures_weights : list of N (k_i,) numpy.ndarray
+ measures_weights : list of N (k_i,) array-like
Numpy arrays where each numpy array has :math:`k_i` non-negatives values summing to one
representing the weights of each discrete input measure
- X_init : (k,d) np.ndarray
+ X_init : (k,d) array-like
Initialization of the support locations (on `k` atoms) of the barycenter
- b : (k,) np.ndarray
+ b : (k,) array-like
Initialization of the weights of the barycenter (non-negatives, sum to 1)
- weights : (N,) np.ndarray
+ weights : (N,) array-like
Initialization of the coefficients of the barycenter (non-negatives, sum to 1)
numItermax : int, optional
@@ -564,7 +564,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None
Returns
-------
- X : (k,d) np.ndarray
+ X : (k,d) array-like
Support locations (on k atoms) of the barycenter
@@ -577,15 +577,17 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None
"""
+ nx = get_backend(*measures_locations,*measures_weights,X_init)
+
iter_count = 0
N = len(measures_locations)
k = X_init.shape[0]
d = X_init.shape[1]
if b is None:
- b = np.ones((k,)) / k
+ b = nx.ones((k,),type_as=X_init) / k
if weights is None:
- weights = np.ones((N,)) / N
+ weights = nx.ones((N,),type_as=X_init) / N
X = X_init
@@ -596,15 +598,15 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None
while (displacement_square_norm > stopThr and iter_count < numItermax):
- T_sum = np.zeros((k, d))
+ T_sum = nx.zeros((k, d),type_as=X_init)
+
- for (measure_locations_i, measure_weights_i, weight_i) in zip(measures_locations, measures_weights,
- weights.tolist()):
+ for (measure_locations_i, measure_weights_i, weight_i) in zip(measures_locations, measures_weights, weights):
M_i = dist(X, measure_locations_i)
T_i = emd(b, measure_weights_i, M_i, numThreads=numThreads)
- T_sum = T_sum + weight_i * np.reshape(1. / b, (-1, 1)) * np.matmul(T_i, measure_locations_i)
+ T_sum = T_sum + weight_i * 1. / b[:,None] * nx.dot(T_i, measure_locations_i)
- displacement_square_norm = np.sum(np.square(T_sum - X))
+ displacement_square_norm = nx.sum((T_sum - X)**2)
if log:
displacement_square_norms.append(displacement_square_norm)