Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MRG] Add github action test cuda #473

Merged
merged 17 commits into from
May 5, 2023
25 changes: 25 additions & 0 deletions .github/workflows/build_tests_cuda.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Tests CUDA

on:
workflow_dispatch:
pull_request_review:
types: [submitted]
push:
branches:
- 'master' # Set a branch to run CI tests on

jobs:
linux-cuda:

runs-on: pc-cuda
if: github.event.review.state == 'approved' || github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && github.event.branch == 'master')

steps:
- uses: actions/checkout@v1
- name: Install POT
run: |
python3.10 -m pip install --ignore-installed -e .
- name: Run tests
run: |
python3.10 -m pytest --durations=20 -v test/ ot/ --doctest-modules --color=yes --ignore=test/test_dr.py --ignore=ot.dr --ignore=ot.plot

2 changes: 2 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#### New features
- Make alpha parameter in Fused Gromov Wasserstein differentiable (PR #463)
- Added the sparsity-constrained OT solver to `ot.smooth` and added ` projection_sparse_simplex` to `ot.utils` (PR #459)
- Add tests on GPU for master branch and approved PR (PR #473)

#### Closed issues

- Fix circleci-redirector action and codecov (PR #460)
Expand Down
194 changes: 0 additions & 194 deletions ot/stochastic.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,27 +58,6 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i):
-------
coordinate gradient : ndarray, shape (nt,)

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000)
array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06],
[1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03],
[3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07],
[2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04],
[9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01],
[2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01],
[4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]])


.. _references-coordinate-grad-semi-dual:
References
----------
Expand Down Expand Up @@ -137,27 +116,6 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None):
v : ndarray, shape (`nt`,)
Dual variable.

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000)
array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06],
[1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03],
[3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07],
[2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04],
[9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01],
[2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01],
[4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]])


.. _references-sag-entropic-transport:
References
----------
Expand Down Expand Up @@ -225,27 +183,6 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None):
ave_v : ndarray, shape (`nt`,)
dual variable

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000)
array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06],
[1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03],
[3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07],
[2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04],
[9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01],
[2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01],
[4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]])


.. _references-averaged-sgd-entropic-transport:
References
----------
Expand Down Expand Up @@ -304,27 +241,6 @@ def c_transform_entropic(b, M, reg, beta):
u : ndarray, shape (`ns`,)
Dual variable.

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000)
array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06],
[1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03],
[3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07],
[2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04],
[9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01],
[2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01],
[4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]])


.. _references-c-transform-entropic:
References
----------
Expand Down Expand Up @@ -399,27 +315,6 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None,
log : dict
log dictionary return only if log==True in parameters

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000)
array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06],
[1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03],
[3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07],
[2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04],
[9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01],
[2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01],
[4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]])


.. _references-solve-semi-dual-entropic:
References
----------
Expand Down Expand Up @@ -509,33 +404,6 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha,
grad : ndarray, shape (`ns`,)
partial grad F

Examples
--------
>>> import ot
>>> np.random.seed(0)
>>> n_source = 7
>>> n_target = 4
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> X_source = np.random.randn(n_source, 2)
>>> Y_target = np.random.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg=1, batch_size=3, numItermax=30000, lr=0.1, log=True)
>>> log['alpha']
array([0.71759102, 1.57057384, 0.85576566, 0.1208211 , 0.59190466,
1.197148 , 0.17805133])
>>> log['beta']
array([0.49741367, 0.57478564, 1.40075528, 2.75890102])
>>> sgd_dual_pi
array([[2.09730063e-02, 8.38169324e-02, 7.50365455e-03, 8.72731415e-09],
[5.58432437e-03, 5.89881299e-04, 3.09558411e-05, 8.35469849e-07],
[3.26489515e-03, 7.15536035e-02, 2.99778211e-02, 3.02601593e-10],
[4.05390622e-02, 5.31085068e-02, 6.65191787e-02, 1.55812785e-06],
[7.82299812e-02, 6.12099102e-03, 4.44989098e-02, 2.37719187e-03],
[5.06266486e-02, 2.16230494e-03, 2.26215141e-03, 6.81514609e-04],
[6.06713990e-02, 3.98139808e-02, 5.46829338e-02, 8.62371424e-06]])


.. _references-batch-grad-dual:
References
----------
Expand Down Expand Up @@ -600,37 +468,6 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr):
beta : ndarray, shape (nt,)
dual variable

Examples
--------
>>> import ot
>>> n_source = 7
>>> n_target = 4
>>> reg = 1
>>> numItermax = 20000
>>> lr = 0.1
>>> batch_size = 3
>>> log = True
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> rng = np.random.RandomState(0)
>>> X_source = rng.randn(n_source, 2)
>>> Y_target = rng.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log)
>>> log['alpha']
array([0.64171798, 1.27932201, 0.78132257, 0.15638935, 0.54888354,
1.03663469, 0.20595781])
>>> log['beta']
array([0.51207194, 0.58033189, 1.28922676, 2.26859736])
>>> sgd_dual_pi
array([[1.97276541e-02, 7.81248547e-02, 6.22136048e-03, 4.95442423e-09],
[4.23494310e-03, 4.43286263e-04, 2.06927079e-05, 3.82389139e-07],
[3.07542414e-03, 6.67897769e-02, 2.48904999e-02, 1.72030247e-10],
[4.26271990e-02, 5.53375455e-02, 6.16535024e-02, 9.88812650e-07],
[7.60423265e-02, 5.89585256e-03, 3.81267087e-02, 1.39458256e-03],
[4.37557504e-02, 1.85189176e-03, 1.72335760e-03, 3.55491279e-04],
[6.33096109e-02, 4.11683954e-02, 5.02962051e-02, 5.43097516e-06]])

References
----------
.. [19] Seguy, V., Bhushan Damodaran, B., Flamary, R., Courty, N., Rolet, A.& Blondel, M. Large-scale Optimal Transport and Mapping Estimation. International Conference on Learning Representation (2018)
Expand Down Expand Up @@ -702,37 +539,6 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1,
log : dict
log dictionary return only if log==True in parameters

Examples
--------
>>> import ot
>>> n_source = 7
>>> n_target = 4
>>> reg = 1
>>> numItermax = 20000
>>> lr = 0.1
>>> batch_size = 3
>>> log = True
>>> a = ot.utils.unif(n_source)
>>> b = ot.utils.unif(n_target)
>>> rng = np.random.RandomState(0)
>>> X_source = rng.randn(n_source, 2)
>>> Y_target = rng.randn(n_target, 2)
>>> M = ot.dist(X_source, Y_target)
>>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log)
>>> log['alpha']
array([0.64057733, 1.2683513 , 0.75610161, 0.16024284, 0.54926534,
1.0514201 , 0.19958936])
>>> log['beta']
array([0.51372571, 0.58843489, 1.27993921, 2.24344807])
>>> sgd_dual_pi
array([[1.97377795e-02, 7.86706853e-02, 6.15682001e-03, 4.82586997e-09],
[4.19566963e-03, 4.42016865e-04, 2.02777272e-05, 3.68823708e-07],
[3.00379244e-03, 6.56562018e-02, 2.40462171e-02, 1.63579656e-10],
[4.28626062e-02, 5.60031599e-02, 6.13193826e-02, 9.67977735e-07],
[7.61972739e-02, 5.94609051e-03, 3.77886693e-02, 1.36046648e-03],
[4.44810042e-02, 1.89476742e-03, 1.73285847e-03, 3.51826036e-04],
[6.30118293e-02, 4.12398660e-02, 4.95148998e-02, 5.26247246e-06]])

References
----------
.. [19] Seguy, V., Bhushan Damodaran, B., Flamary, R., Courty, N., Rolet, A.& Blondel, M. Large-scale Optimal Transport and Mapping Estimation. International Conference on Learning Representation (2018)
Expand Down