Skip to content

Commit 613ca15

Browse files
kshyattandreasnoack
authored andcommitted
Cleanup pinv tests and add testsets (#23097)
1 parent 5913f24 commit 613ca15

File tree

1 file changed

+62
-216
lines changed

1 file changed

+62
-216
lines changed

test/linalg/pinv.jl

Lines changed: 62 additions & 216 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
# Test the pseudo-inverse
55
#
66

7-
debug = false
8-
97
using Base.Test
108

9+
srand(12345)
10+
1111
function hilb(T::Type, n::Integer)
1212
a=Array{T}(n,n)
1313
for i=1:n
@@ -89,239 +89,85 @@ end
8989

9090

9191
function test_pinv(a,m,n,tol1,tol2,tol3)
92-
debug && println("=== julia/matlab pinv, default tol=eps(1.0)*max(size(a)) ===")
9392
apinv = @inferred pinv(a)
9493

9594
@test vecnorm(a*apinv*a-a)/vecnorm(a) 0 atol=tol1
9695
x0 = randn(n); b = a*x0; x = apinv*b
9796
@test vecnorm(a*x-b)/vecnorm(b) 0 atol=tol1
98-
debug && println(vecnorm(a*apinv*a - a)/vecnorm(a))
99-
debug && println(vecnorm(a*x-b)/vecnorm(b))
100-
101-
102-
debug && println("=== julia pinv, tol=sqrt(eps(1.0)) ===")
10397
apinv = pinv(a,sqrt(eps(real(one(eltype(a))))))
10498

10599
@test vecnorm(a*apinv*a-a)/vecnorm(a) 0 atol=tol2
106100
x0 = randn(n); b = a*x0; x = apinv*b
107101
@test vecnorm(a*x-b)/vecnorm(b) 0 atol=tol2
108-
debug && println(vecnorm(a*apinv*a - a)/vecnorm(a))
109-
debug && println(vecnorm(a*x-b)/vecnorm(b))
110102
end
111103

112-
113-
srand(12345)
114-
115-
let
116-
for eltya in (Float64, Complex128)
117-
118-
debug && println("\n\n<<<<<", eltya, ">>>>>")
119-
120-
m = 1000
121-
n = 100
122-
debug && println("\n\n n = ", n, ", m = ",m)
123-
104+
@testset for eltya in (Float32, Float64, Complex64, Complex128)
105+
@testset for (m, n) in [(1000, 100), (100, 100), (100, 1000)]
124106
default_tol = (real(one(eltya))) * max(m,n) * 10
125-
126-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
127-
### a = randn_float64(m,n) * hilb(eltya,n)
128-
a = hilb(eltya,m,n)
129-
test_pinv(a,m,n,1e-2,1e-5,1e-5)
130-
131-
debug && println("\n--- dense/diagonal matrix ---\n")
132-
a = onediag(eltya,m,n)
133-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
134-
135-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
136-
a = tridiag(eltya,m,n)
137-
test_pinv(a,m,n,default_tol,1e-5,default_tol)
138-
139-
debug && println("\n--- Diagonal matrix ---\n")
140-
a = onediag_sparse(eltya,m)
141-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
142-
143-
m = 100
144-
n = 100
145-
debug && println("\n\n n = ", n, ", m = ",m)
146-
147-
default_tol = (real(one(eltya))) * max(m,n) * 10
148-
149-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
107+
tol1 = 1e-2
108+
tol2 = 1e-5
109+
tol3 = 1e-5
110+
if real(eltya) == Float32
111+
tol1 = 1e0
112+
tol2 = 1e-2
113+
tol3 = 1e-2
114+
end
115+
@testset "dense/ill-conditioned matrix" begin
150116
### a = randn_float64(m,n) * hilb(eltya,n)
151-
a = hilb(eltya,m,n)
152-
test_pinv(a,m,n,1e-2,1e-5,1e-5)
153-
154-
debug && println("\n--- dense/diagonal matrix ---\n")
155-
a = onediag(eltya,m,n)
156-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
157-
158-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
159-
a = tridiag(eltya,m,n)
160-
test_pinv(a,m,n,default_tol,1e-5,default_tol)
161-
162-
debug && println("\n--- Diagonal matrix ---\n")
163-
a = onediag_sparse(eltya,m)
164-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
165-
166-
m = 100
167-
n = 1000
168-
debug && println("\n\n n = ", n, ", m = ",m)
169-
170-
default_tol = (real(one(eltya))) * max(m,n) * 10
171-
172-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
173-
### a = randn_float64(m,n) * hilb(eltya,n)
174-
a = hilb(eltya,m,n)
175-
test_pinv(a,m,n,1e-2,1e-5,1e-5)
176-
177-
debug && println("\n--- dense/diagonal matrix ---\n")
178-
a = onediag(eltya,m,n)
179-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
180-
181-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
182-
a = tridiag(eltya,m,n)
183-
test_pinv(a,m,n,default_tol,1e-5,default_tol)
184-
185-
debug && println("\n--- Diagonal matrix ---\n")
186-
a = onediag_sparse(eltya,m)
187-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
117+
a = hilb(eltya, m, n)
118+
test_pinv(a, m, n, tol1, tol2, tol3)
119+
end
120+
@testset "dense/diagonal matrix" begin
121+
a = onediag(eltya, m, n)
122+
test_pinv(a, m, n, default_tol, default_tol, default_tol)
123+
end
124+
@testset "dense/tri-diagonal matrix" begin
125+
a = tridiag(eltya, m, n)
126+
test_pinv(a, m, n, default_tol, tol2, default_tol)
127+
end
128+
@testset "Diagonal matrix" begin
129+
a = onediag_sparse(eltya, m)
130+
test_pinv(a, m, m, default_tol, default_tol, default_tol)
131+
end
188132
end
189133
end
190134

135+
@testset "zero valued numbers/vectors/matrices" begin
136+
@testset for eltya in (Float32, Float64, Complex64, Complex128)
137+
a = pinv(zero(eltya))
138+
@test a 0.0
191139

192-
for eltya in (Float32, Complex64)
193-
194-
debug && println("\n\n<<<<<", eltya, ">>>>>")
195-
196-
m = 1000
197-
n = 100
198-
debug && println("\n\n n = ", n, ", m = ",m)
199-
200-
default_tol = (real(one(eltya))) * max(m,n) * 10
201-
202-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
203-
### a = randn_float32(m,n) * hilb(eltya,n)
204-
a = hilb(eltya,m,n)
205-
test_pinv(a,m,n,1e0,1e-2,1e-2)
206-
207-
debug && println("\n--- dense/diagonal matrix ---\n")
208-
a = onediag(eltya,m,n)
209-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
210-
211-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
212-
a = tridiag(eltya,m,n)
213-
test_pinv(a,m,n,default_tol,1e-2,default_tol)
214-
215-
debug && println("\n--- Diagonal matrix ---\n")
216-
a = onediag_sparse(eltya,m)
217-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
218-
219-
m = 100
220-
n = 100
221-
debug && println("\n\n n = ", n, ", m = ",m)
222-
223-
default_tol = (real(one(eltya))) * max(m,n) * 10
224-
225-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
226-
### a = randn_float32(m,n) * hilb(eltya,n)
227-
a = hilb(eltya,m,n)
228-
test_pinv(a,m,n,1e0,1e-2,1e-2)
229-
230-
debug && println("\n--- dense/diagonal matrix ---\n")
231-
a = onediag(eltya,m,n)
232-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
233-
234-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
235-
a = tridiag(eltya,m,n)
236-
test_pinv(a,m,n,default_tol,1e-2,default_tol)
237-
238-
debug && println("\n--- Diagonal matrix ---\n")
239-
a = onediag_sparse(eltya,m)
240-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
241-
242-
m = 100
243-
n = 1000
244-
debug && println("\n\n n = ", n, ", m = ",m)
245-
246-
default_tol = (real(one(eltya))) * max(m,n) * 10
140+
a = pinv([zero(eltya); zero(eltya)])
141+
@test a[1] 0.0
142+
@test a[2] 0.0
247143

248-
debug && println("\n--- dense/ill-conditioned matrix ---\n")
249-
### a = randn_float32(m,n) * hilb(eltya,n)
250-
a = hilb(eltya,m,n)
251-
test_pinv(a,m,n,1e0,1e-2,1e-2)
252-
253-
debug && println("\n--- dense/diagonal matrix ---\n")
254-
a = onediag(eltya,m,n)
255-
test_pinv(a,m,n,default_tol,default_tol,default_tol)
256-
257-
debug && println("\n--- dense/tri-diagonal matrix ---\n")
258-
a = tridiag(eltya,m,n)
259-
test_pinv(a,m,n,default_tol,1e-2,default_tol)
260-
261-
debug && println("\n--- Diagonal matrix ---\n")
262-
a = onediag_sparse(eltya,m)
263-
test_pinv(a,m,m,default_tol,default_tol,default_tol)
264-
265-
end
266-
267-
# test zero matrices
268-
for eltya in (Float32, Float64, Complex64, Complex128)
269-
debug && println("\n\n<<<<<", eltya, ">>>>>")
270-
debug && println("\n--- zero constant ---")
271-
a = pinv(zero(eltya))
272-
@test a 0.0
273-
end
274-
275-
for eltya in (Float32, Float64, Complex64, Complex128)
276-
debug && println("\n\n<<<<<", eltya, ">>>>>")
277-
debug && println("\n--- zero vector ---")
278-
a = pinv([zero(eltya); zero(eltya)])
279-
@test a[1] 0.0
280-
@test a[2] 0.0
281-
end
282-
283-
for eltya in (Float32, Float64, Complex64, Complex128)
284-
debug && println("\n\n<<<<<", eltya, ">>>>>")
285-
debug && println("\n--- zero Diagonal matrix ---")
286-
a = pinv(Diagonal([zero(eltya); zero(eltya)]))
287-
@test a.diag[1] 0.0
288-
@test a.diag[2] 0.0
289-
end
290-
291-
# test sub-normal matrices
292-
for eltya in (Float32, Float64)
293-
debug && println("\n\n<<<<<", eltya, ">>>>>")
294-
debug && println("\n--- sub-normal constant ---")
295-
a = pinv(realmin(eltya)/100)
296-
@test a 0.0
297-
debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>")
298-
debug && println("\n--- sub-normal constant ---")
299-
a = pinv(realmin(eltya)/100*(1+1im))
300-
@test a 0.0
301-
end
302-
303-
for eltya in (Float32, Float64)
304-
debug && println("\n\n<<<<<", eltya, ">>>>>")
305-
debug && println("\n--- sub-normal vector ---")
306-
a = pinv([realmin(eltya); realmin(eltya)]/100)
307-
@test a[1] 0.0
308-
@test a[2] 0.0
309-
debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>")
310-
debug && println("\n--- sub-normal vector ---")
311-
a = pinv([realmin(eltya); realmin(eltya)]/100*(1+1im))
312-
@test a[1] 0.0
313-
@test a[2] 0.0
144+
a = pinv(Diagonal([zero(eltya); zero(eltya)]))
145+
@test a.diag[1] 0.0
146+
@test a.diag[2] 0.0
147+
end
314148
end
315149

316-
for eltya in (Float32, Float64)
317-
debug && println("\n\n<<<<<", eltya, ">>>>>")
318-
debug && println("\n--- sub-normal Diagonal matrix ---")
319-
a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100))
320-
@test a.diag[1] 0.0
321-
@test a.diag[2] 0.0
322-
debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>")
323-
debug && println("\n--- sub-normal Diagonal matrix ---")
324-
a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100*(1+1im)))
325-
@test a.diag[1] 0.0
326-
@test a.diag[2] 0.0
150+
@testset "sub-normal numbers/vectors/matrices" begin
151+
@testset for eltya in (Float32, Float64)
152+
a = pinv(realmin(eltya)/100)
153+
@test a 0.0
154+
# Complex subnormal
155+
a = pinv(realmin(eltya)/100*(1+1im))
156+
@test a 0.0
157+
158+
a = pinv([realmin(eltya); realmin(eltya)]/100)
159+
@test a[1] 0.0
160+
@test a[2] 0.0
161+
# Complex subnormal
162+
a = pinv([realmin(eltya); realmin(eltya)]/100*(1+1im))
163+
@test a[1] 0.0
164+
@test a[2] 0.0
165+
a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100))
166+
@test a.diag[1] 0.0
167+
@test a.diag[2] 0.0
168+
# Complex subnormal
169+
a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100*(1+1im)))
170+
@test a.diag[1] 0.0
171+
@test a.diag[2] 0.0
172+
end
327173
end

0 commit comments

Comments
 (0)