Skip to content

Commit bd96dfb

Browse files
Copilotlkdvos
andauthored
Rename isisometry to isisometric for consistency with project_isometric (#73)
Co-authored-by: lkdvos <[email protected]> Co-authored-by: Lukas Devos <[email protected]>
1 parent d082c7d commit bd96dfb

File tree

13 files changed

+90
-94
lines changed

13 files changed

+90
-94
lines changed

ext/MatrixAlgebraKitChainRulesCoreExt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ MatrixAlgebraKit.iszerotangent(::AbstractZero) = true
1414
@non_differentiable MatrixAlgebraKit.select_algorithm(args...)
1515
@non_differentiable MatrixAlgebraKit.initialize_output(args...)
1616
@non_differentiable MatrixAlgebraKit.check_input(args...)
17-
@non_differentiable MatrixAlgebraKit.isisometry(args...)
17+
@non_differentiable MatrixAlgebraKit.isisometric(args...)
1818
@non_differentiable MatrixAlgebraKit.isunitary(args...)
1919

2020
function ChainRulesCore.rrule(::typeof(copy_input), f, A)

src/MatrixAlgebraKit.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using LinearAlgebra: Diagonal, diag, diagind, isdiag
99
using LinearAlgebra: UpperTriangular, LowerTriangular
1010
using LinearAlgebra: BlasFloat, BlasReal, BlasComplex, BlasInt
1111

12-
export isisometry, isunitary, ishermitian, isantihermitian
12+
export isisometric, isunitary, ishermitian, isantihermitian
1313

1414
export project_hermitian, project_antihermitian, project_isometric
1515
export project_hermitian!, project_antihermitian!, project_isometric!
@@ -65,6 +65,7 @@ export notrunc, truncrank, trunctol, truncerror, truncfilter
6565
:svd_pullback!, :svd_trunc_pullback!
6666
)
6767
)
68+
eval(Expr(:public, :is_left_isometric, :is_right_isometric))
6869
end
6970

7071
include("common/defaults.jl")

src/common/matrixproperties.jl

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
isisometry(A; side=:left, isapprox_kwargs...) -> Bool
2+
isisometric(A; side=:left, isapprox_kwargs...) -> Bool
33
44
Test whether a linear map is an isometry, where the type of isometry is controlled by `kind`:
55
@@ -8,13 +8,14 @@ Test whether a linear map is an isometry, where the type of isometry is controll
88
99
The `isapprox_kwargs` are passed on to `isapprox` to control the tolerances.
1010
11-
New specializations should overload [`is_left_isometry`](@ref) and [`is_right_isometry`](@ref).
11+
New specializations should overload [`MatrixAlgebraKit.is_left_isometric`](@ref) and
12+
[`MatrixAlgebraKit.is_right_isometric`](@ref).
1213
1314
See also [`isunitary`](@ref).
1415
"""
15-
function isisometry(A; side::Symbol = :left, isapprox_kwargs...)
16-
side === :left && return is_left_isometry(A; isapprox_kwargs...)
17-
side === :right && return is_right_isometry(A; isapprox_kwargs...)
16+
function isisometric(A; side::Symbol = :left, isapprox_kwargs...)
17+
side === :left && return is_left_isometric(A; isapprox_kwargs...)
18+
side === :right && return is_right_isometric(A; isapprox_kwargs...)
1819

1920
throw(ArgumentError(lazy"Invalid isometry side: $side"))
2021
end
@@ -25,48 +26,42 @@ end
2526
Test whether a linear map is unitary, i.e. `A * A' ≈ I ≈ A' * A`.
2627
The `isapprox_kwargs` are passed on to `isapprox` to control the tolerances.
2728
28-
See also [`isisometry`](@ref).
29+
See also [`isisometric`](@ref).
2930
"""
3031
function isunitary(A; isapprox_kwargs...)
31-
return is_left_isometry(A; isapprox_kwargs...) &&
32-
is_right_isometry(A; isapprox_kwargs...)
32+
return is_left_isometric(A; isapprox_kwargs...) &&
33+
is_right_isometric(A; isapprox_kwargs...)
3334
end
3435
function isunitary(A::AbstractMatrix; isapprox_kwargs...)
3536
size(A, 1) == size(A, 2) || return false
36-
return is_left_isometry(A; isapprox_kwargs...)
37+
return is_left_isometric(A; isapprox_kwargs...)
3738
end
3839

3940
@doc """
40-
is_left_isometry(A; isapprox_kwargs...) -> Bool
41+
is_left_isometric(A; isapprox_kwargs...) -> Bool
4142
42-
Test whether a linear map is a left isometry, i.e. `A' * A ≈ I`.
43+
Test whether a linear map is a (left) isometry, i.e. `A' * A ≈ I`.
4344
The `isapprox_kwargs` can be used to control the tolerances of the equality.
4445
45-
See also [`isisometry`](@ref) and [`is_right_isometry`](@ref).
46-
""" is_left_isometry
46+
See also [`isisometric`](@ref) and [`MatrixAlgebraKit.is_right_isometric`](@ref).
47+
""" is_left_isometric
4748

48-
function is_left_isometry(A::AbstractMatrix; atol::Real = 0, rtol::Real = defaulttol(A), norm = LinearAlgebra.norm)
49+
function is_left_isometric(A::AbstractMatrix; atol::Real = 0, rtol::Real = defaulttol(A), norm = LinearAlgebra.norm)
4950
P = A' * A
5051
nP = norm(P) # isapprox would use `rtol * max(norm(P), norm(I))`
5152
diagview(P) .-= 1
5253
return norm(P) <= max(atol, rtol * nP) # assume that the norm of I is `sqrt(n)`
5354
end
5455
5556
@doc """
56-
is_right_isometry(A; isapprox_kwargs...) -> Bool
57+
is_right_isometric(A; isapprox_kwargs...) -> Bool
5758
58-
Test whether a linear map is a right isometry, i.e. `A * A' I`.
59+
Test whether a linear map is a (right) isometry, i.e. `A * A' I`.
5960
The `isapprox_kwargs` can be used to control the tolerances of the equality.
6061
61-
See also [`isisometry`](@ref) and [`is_left_isometry`](@ref).
62-
""" is_right_isometry
63-
64-
function is_right_isometry(A::AbstractMatrix; atol::Real = 0, rtol::Real = defaulttol(A), norm = LinearAlgebra.norm)
65-
P = A * A'
66-
nP = norm(P) # isapprox would use `rtol * max(norm(P), norm(I))`
67-
diagview(P) .-= 1
68-
return norm(P) <= max(atol, rtol * nP) # assume that the norm of I is `sqrt(n)`
69-
end
62+
See also [`isisometric`](@ref) and [`MatrixAlgebraKit.is_left_isometric`](@ref).
63+
""" is_right_isometric
64+
is_right_isometric(A; kwargs...) = is_left_isometric(A'; kwargs...)
7065
7166
"""
7267
ishermitian(A; isapprox_kwargs...)

test/amd/eigh.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ end
4848
4949
D1, V1 = @constinferred eigh_trunc(A; alg, trunc=truncrank(r))
5050
@test length(diagview(D1)) == r
51-
@test isisometry(V1)
51+
@test isisometric(V1)
5252
@test A * V1 ≈ V1 * D1
5353
@test LinearAlgebra.opnorm(A - V1 * D1 * V1') D₀[r + 1]
5454

5555
trunc = trunctol(; atol=s * D₀[r + 1])
5656
D2, V2 = @constinferred eigh_trunc(A; alg, trunc)
5757
@test length(diagview(D2)) == r
58-
@test isisometry(V2)
58+
@test isisometric(V2)
5959
@test A * V2 V2 * D2
6060

6161
# test for same subspace

test/cuda/eigh.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ end
4343
4444
D1, V1 = @constinferred eigh_trunc(A; alg, trunc=truncrank(r))
4545
@test length(diagview(D1)) == r
46-
@test isisometry(V1)
46+
@test isisometric(V1)
4747
@test A * V1 ≈ V1 * D1
4848
@test LinearAlgebra.opnorm(A - V1 * D1 * V1') D₀[r + 1]
4949

5050
trunc = trunctol(; atol = s * D₀[r + 1])
5151
D2, V2 = @constinferred eigh_trunc(A; alg, trunc)
5252
@test length(diagview(D2)) == r
53-
@test isisometry(V2)
53+
@test isisometric(V2)
5454
@test A * V2 V2 * D2
5555

5656
# test for same subspace

test/eigh.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ end
5252
5353
D1, V1 = @constinferred eigh_trunc(A; alg, trunc = truncrank(r))
5454
@test length(diagview(D1)) == r
55-
@test isisometry(V1)
55+
@test isisometric(V1)
5656
@test A * V1 ≈ V1 * D1
5757
@test LinearAlgebra.opnorm(A - V1 * D1 * V1') D₀[r + 1]
5858

5959
trunc = trunctol(; atol = s * D₀[r + 1])
6060
D2, V2 = @constinferred eigh_trunc(A; alg, trunc)
6161
@test length(diagview(D2)) == r
62-
@test isisometry(V2)
62+
@test isisometric(V2)
6363
@test A * V2 V2 * D2
6464

6565
s = 1 - sqrt(eps(real(T)))

test/lq.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ eltypes = (Float32, Float64, ComplexF32, ComplexF64)
1717
@test L isa Matrix{T} && size(L) == (m, minmn)
1818
@test Q isa Matrix{T} && size(Q) == (minmn, n)
1919
@test L * Q A
20-
@test isisometry(Q; side = :right)
20+
@test isisometric(Q; side = :right)
2121
Nᴴ = @constinferred lq_null(A)
2222
@test Nᴴ isa Matrix{T} && size(Nᴴ) == (n - minmn, n)
2323
@test maximum(abs, A * Nᴴ') < eps(real(T))^(2 / 3)
24-
@test isisometry(Nᴴ; side = :right)
24+
@test isisometric(Nᴴ; side = :right)
2525
2626
Ac = similar(A)
2727
L2, Q2 = @constinferred lq_compact!(copy!(Ac, A), (L, Q))
@@ -51,12 +51,12 @@ eltypes = (Float32, Float64, ComplexF32, ComplexF64)
5151
# unblocked algorithm
5252
lq_compact!(copy!(Ac, A), (L, Q); blocksize = 1)
5353
@test L * Q ≈ A
54-
@test isisometry(Q; side = :right)
54+
@test isisometric(Q; side = :right)
5555
lq_compact!(copy!(Ac, A), (noL, Q2); blocksize = 1)
5656
@test Q == Q2
5757
lq_null!(copy!(Ac, A), Nᴴ; blocksize = 1)
5858
@test maximum(abs, A * Nᴴ') < eps(real(T))^(2 / 3)
59-
@test isisometry(Nᴴ; side = :right)
59+
@test isisometric(Nᴴ; side = :right)
6060
if m <= n
6161
lq_compact!(copy!(Q2, A), (noL, Q2); blocksize = 1) # in-place Q
6262
@test Q Q2
@@ -66,12 +66,12 @@ eltypes = (Float32, Float64, ComplexF32, ComplexF64)
6666
end
6767
lq_compact!(copy!(Ac, A), (L, Q); blocksize = 8)
6868
@test L * Q A
69-
@test isisometry(Q; side = :right)
69+
@test isisometric(Q; side = :right)
7070
lq_compact!(copy!(Ac, A), (noL, Q2); blocksize = 8)
7171
@test Q == Q2
7272
lq_null!(copy!(Ac, A), Nᴴ; blocksize = 8)
7373
@test maximum(abs, A * Nᴴ') < eps(real(T))^(2 / 3)
74-
@test isisometry(Nᴴ; side = :right)
74+
@test isisometric(Nᴴ; side = :right)
7575
@test Nᴴ * Nᴴ' I
7676

7777
qr_alg = LAPACK_HouseholderQR(; blocksize = 1)
@@ -91,15 +91,15 @@ eltypes = (Float32, Float64, ComplexF32, ComplexF64)
9191
# positive
9292
lq_compact!(copy!(Ac, A), (L, Q); positive = true)
9393
@test L * Q ≈ A
94-
@test isisometry(Q; side = :right)
94+
@test isisometric(Q; side = :right)
9595
@test all(>=(zero(real(T))), real(diag(L)))
9696
lq_compact!(copy!(Ac, A), (noL, Q2); positive = true)
9797
@test Q == Q2
9898
9999
# positive and blocksize 1
100100
lq_compact!(copy!(Ac, A), (L, Q); positive = true, blocksize = 1)
101101
@test L * Q ≈ A
102-
@test isisometry(Q; side = :right)
102+
@test isisometric(Q; side = :right)
103103
@test all(>=(zero(real(T))), real(diag(L)))
104104
lq_compact!(copy!(Ac, A), (noL, Q2); positive = true, blocksize = 1)
105105
@test Q == Q2

0 commit comments

Comments
 (0)