Skip to content

Commit ea6eda4

Browse files
authored
Merge pull request #82 from mrava87/main
minor: added test for L2 with dense Op
2 parents 3e5e4cc + 6fcc7f3 commit ea6eda4

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

pytests/test_norms.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import numpy as np
44
from numpy.testing import assert_array_almost_equal
55

6-
from pylops.basicoperators import Identity, Diagonal
6+
from pylops.basicoperators import Identity, Diagonal, MatrixMult
77
from pyproximal.utils import moreau
88
from pyproximal.proximal import Box, Euclidean, L2, L1, L21, L21_plus_L1, Huber, Nuclear
99

@@ -34,7 +34,7 @@ def test_Euclidean(par):
3434

3535
@pytest.mark.parametrize("par", [(par1), (par2)])
3636
def test_L2(par):
37-
"""L2 norm and proximal/dual proximal
37+
"""L2 norm of Op*x-b and proximal/dual proximal
3838
"""
3939
l2 = L2(Op=Identity(par['nx'], dtype=par['dtype']),
4040
b=np.zeros(par['nx'], dtype=par['dtype']),
@@ -50,7 +50,7 @@ def test_L2(par):
5050

5151
@pytest.mark.parametrize("par", [(par1), (par2)])
5252
def test_L2_diff(par):
53-
"""L2 norm of difference and proximal/dual proximal
53+
"""L2 norm of difference (x-b) and proximal/dual proximal
5454
"""
5555
b = np.ones(par['nx'], dtype=par['dtype'])
5656
l2 = L2(b=b, sigma=par['sigma'])
@@ -85,6 +85,26 @@ def test_L2_op(par):
8585
assert_array_almost_equal(l2.prox(x, tau), x / den, decimal=4)
8686

8787

88+
@pytest.mark.parametrize("par", [(par1), (par2)])
89+
def test_L2_dense(par):
90+
"""L2 norm of Op*x with dense Op and proximal/dual proximal
91+
"""
92+
b = np.zeros(par['nx'], dtype=par['dtype'])
93+
d = np.random.normal(0., 1., par['nx']).astype(par['dtype'])
94+
l2 = L2(Op=MatrixMult(np.diag(d), dtype=par['dtype']),
95+
b=b, sigma=par['sigma'], densesolver='numpy')
96+
97+
# norm
98+
x = np.random.normal(0., 1., par['nx']).astype(par['dtype'])
99+
assert l2(x) == (par['sigma'] / 2.) * np.linalg.norm(d * x) ** 2
100+
101+
# prox: since Op is a Diagonal operator the denominator becomes
102+
# 1 + sigma*tau*d[i] for every i
103+
tau = 2.
104+
den = 1. + par['sigma'] * tau * d ** 2
105+
assert_array_almost_equal(l2.prox(x, tau), x / den, decimal=4)
106+
107+
88108
@pytest.mark.parametrize("par", [(par1), (par2)])
89109
def test_L1(par):
90110
"""L1 norm and proximal/dual proximal

0 commit comments

Comments
 (0)