33import numpy as np
44from numpy .testing import assert_array_almost_equal
55
6- from pylops .basicoperators import Identity , Diagonal
6+ from pylops .basicoperators import Identity , Diagonal , MatrixMult
77from pyproximal .utils import moreau
88from 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 )])
3636def 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 )])
5252def 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 )])
89109def test_L1 (par ):
90110 """L1 norm and proximal/dual proximal
0 commit comments