Skip to content

Commit 94f9048

Browse files
committed
Incremental fixes
1 parent f305d4a commit 94f9048

File tree

6 files changed

+46
-121
lines changed

6 files changed

+46
-121
lines changed

Project.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Combinatorics = "1"
3535
FiniteDifferences = "0.12"
3636
LRUCache = "1.0.2"
3737
LinearAlgebra = "1"
38-
MatrixAlgebraKit = "0.6.0"
38+
MatrixAlgebraKit = "0.5.0"
3939
OhMyThreads = "0.8.0"
4040
PackageExtensionCompat = "1"
4141
Printf = "1"
@@ -68,3 +68,6 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
6868

6969
[targets]
7070
test = ["ArgParse", "Aqua", "Combinatorics", "LinearAlgebra", "TensorOperations", "Test", "TestExtras", "SafeTestsets", "ChainRulesCore", "ChainRulesTestUtils", "FiniteDifferences", "Zygote"]
71+
72+
[sources]
73+
MatrixAlgebraKit = {url="https://github.com/quantumkithub/matrixalgebrakit.jl", rev="main"}

src/TensorKit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export left_orth, right_orth, left_null, right_null,
8282
eigh_full!, eigh_full, eigh_trunc!, eigh_trunc, eig_full!, eig_full, eig_trunc!,
8383
eig_trunc,
8484
eigh_vals!, eigh_vals, eig_vals!, eig_vals,
85-
isposdef, isposdef!, ishermitian, isisometry, isunitary, sylvester, rank, cond
85+
isposdef, isposdef!, ishermitian, isisometric, isunitary, sylvester, rank, cond
8686

8787
export braid, braid!, permute, permute!, transpose, transpose!, twist, twist!, repartition,
8888
repartition!

src/factorizations/adjoint.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ function MAK.right_null!(t::AdjointTensorMap, N, alg::AbstractAlgorithm)
2929
return N
3030
end
3131

32-
function MAK.is_left_isometry(t::AdjointTensorMap; kwargs...)
33-
return is_right_isometry(adjoint(t); kwargs...)
32+
function MAK.is_left_isometric(t::AdjointTensorMap; kwargs...)
33+
return is_right_isometric(adjoint(t); kwargs...)
3434
end
35-
function MAK.is_right_isometry(t::AdjointTensorMap; kwargs...)
36-
return is_left_isometry(adjoint(t); kwargs...)
35+
function MAK.is_right_isometric(t::AdjointTensorMap; kwargs...)
36+
return is_left_isometric(adjoint(t); kwargs...)
3737
end
3838

3939
# 2-arg functions

src/factorizations/factorizations.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import MatrixAlgebraKit as MAK
1818
using MatrixAlgebraKit: AbstractAlgorithm, TruncatedAlgorithm, DiagonalAlgorithm
1919
using MatrixAlgebraKit: TruncationStrategy, NoTruncation, TruncationByValue,
2020
TruncationByError, TruncationIntersection, TruncationByFilter, TruncationByOrder
21-
using MatrixAlgebraKit: left_orth_polar!, right_orth_polar!, left_orth_svd!,
22-
right_orth_svd!, left_null_svd!, right_null_svd!, diagview
21+
using MatrixAlgebraKit: diagview, isisometric
2322

2423
include("utility.jl")
2524
include("matrixalgebrakit.jl")
@@ -30,9 +29,9 @@ include("pullbacks.jl")
3029

3130
TensorKit.one!(A::AbstractMatrix) = MatrixAlgebraKit.one!(A)
3231

33-
function MatrixAlgebraKit.isisometry(t::AbstractTensorMap, (p₁, p₂)::Index2Tuple)
32+
function MatrixAlgebraKit.isisometric(t::AbstractTensorMap, (p₁, p₂)::Index2Tuple)
3433
t = permute(t, (p₁, p₂); copy = false)
35-
return isisometry(t)
34+
return isisometric(t)
3635
end
3736

3837
#------------------------------#

src/factorizations/matrixalgebrakit.jl

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ end
2626
for f! in (
2727
:qr_compact!, :qr_full!, :lq_compact!, :lq_full!,
2828
:eig_full!, :eigh_full!, :svd_compact!, :svd_full!,
29-
:left_polar!, :left_orth_polar!, :right_polar!, :right_orth_polar!,
30-
:left_orth!, :right_orth!,
29+
:left_polar!, :right_polar!, :left_orth!, :right_orth!,
3130
)
3231
@eval function MAK.$f!(t::AbstractTensorMap, F, alg::AbstractAlgorithm)
3332
MAK.check_input($f!, t, F, alg)
@@ -417,26 +416,6 @@ function MAK.check_input(::typeof(left_polar!), t::AbstractTensorMap, WP, ::Abst
417416
return nothing
418417
end
419418

420-
function MAK.check_input(::typeof(left_orth_polar!), t::AbstractTensorMap, WP, ::AbstractAlgorithm)
421-
codomain(t) domain(t) ||
422-
throw(ArgumentError("Polar decomposition requires `codomain(t) ≿ domain(t)`"))
423-
424-
W, P = WP
425-
@assert W isa AbstractTensorMap
426-
@assert P isa AbstractTensorMap
427-
428-
# scalartype checks
429-
@check_scalar W t
430-
@check_scalar P t
431-
432-
# space checks
433-
VW = fuse(domain(t))
434-
@check_space(W, codomain(t) VW)
435-
@check_space(P, VW domain(t))
436-
437-
return nothing
438-
end
439-
440419
function MAK.initialize_output(::typeof(left_polar!), t::AbstractTensorMap, ::AbstractAlgorithm)
441420
W = similar(t, space(t))
442421
P = similar(t, domain(t) domain(t))
@@ -462,26 +441,6 @@ function MAK.check_input(::typeof(right_polar!), t::AbstractTensorMap, PWᴴ, ::
462441
return nothing
463442
end
464443

465-
function MAK.check_input(::typeof(right_orth_polar!), t::AbstractTensorMap, PWᴴ, ::AbstractAlgorithm)
466-
codomain(t) domain(t) ||
467-
throw(ArgumentError("Polar decomposition requires `domain(t) ≿ codomain(t)`"))
468-
469-
P, Wᴴ = PWᴴ
470-
@assert P isa AbstractTensorMap
471-
@assert Wᴴ isa AbstractTensorMap
472-
473-
# scalartype checks
474-
@check_scalar P t
475-
@check_scalar Wᴴ t
476-
477-
# space checks
478-
VW = fuse(codomain(t))
479-
@check_space(P, codomain(t) VW)
480-
@check_space(Wᴴ, VW domain(t))
481-
482-
return nothing
483-
end
484-
485444
function MAK.initialize_output(::typeof(right_polar!), t::AbstractTensorMap, ::AbstractAlgorithm)
486445
P = similar(t, codomain(t) codomain(t))
487446
Wᴴ = similar(t, space(t))
@@ -582,36 +541,6 @@ function MAK.right_orth!(
582541
end
583542
end
584543

585-
function MAK.left_orth_polar!(t::AbstractTensorMap; alg = nothing, kwargs...)
586-
alg′ = MAK.select_algorithm(left_polar!, t, alg; kwargs...)
587-
VC = MAK.initialize_output(left_orth!, t)
588-
return left_orth_polar!(t, VC, alg′)
589-
end
590-
function MAK.left_orth_polar!(t::AbstractTensorMap, VC, alg)
591-
alg′ = MAK.select_algorithm(left_polar!, t, alg)
592-
return left_orth_polar!(t, VC, alg′)
593-
end
594-
function MAK.right_orth_polar!(t::AbstractTensorMap; alg = nothing, kwargs...)
595-
alg′ = MAK.select_algorithm(right_polar!, t, alg; kwargs...)
596-
CVᴴ = MAK.initialize_output(right_orth!, t)
597-
return right_orth_polar!(t, CVᴴ, alg′)
598-
end
599-
function MAK.right_orth_polar!(t::AbstractTensorMap, CVᴴ, alg)
600-
alg′ = MAK.select_algorithm(right_polar!, t, alg)
601-
return right_orth_polar!(t, CVᴴ, alg′)
602-
end
603-
604-
function MAK.left_orth_svd!(t::AbstractTensorMap; trunc = notrunc(), kwargs...)
605-
U, S, Vᴴ = trunc == notrunc() ? svd_compact!(t; kwargs...) :
606-
svd_trunc!(t; trunc, kwargs...)
607-
return U, lmul!(S, Vᴴ)
608-
end
609-
function MAK.right_orth_svd!(t::AbstractTensorMap; trunc = notrunc(), kwargs...)
610-
U, S, Vᴴ = trunc == notrunc() ? svd_compact!(t; kwargs...) :
611-
svd_trunc!(t; trunc, kwargs...)
612-
return rmul!(U, S), Vᴴ
613-
end
614-
615544
# Nullspace
616545
# ---------
617546
function MAK.check_input(::typeof(left_null!), t::AbstractTensorMap, N, ::AbstractAlgorithm)
@@ -651,12 +580,6 @@ function MAK.initialize_output(::typeof(right_null!), t::AbstractTensorMap)
651580
return N
652581
end
653582

654-
for (f!, f_svd!) in zip((:left_null!, :right_null!), (:left_null_svd!, :right_null_svd!))
655-
@eval function MAK.$f_svd!(t::AbstractTensorMap, N, alg, ::Nothing = nothing)
656-
return $f!(t, N; alg_svd = alg)
657-
end
658-
end
659-
660583
# Projections
661584
# -----------
662585
function MAK.check_input(::typeof(project_hermitian!), tsrc::AbstractTensorMap, tdst::AbstractTensorMap)

test/tensors/factorizations.jl

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,18 @@ for V in spacelist
4747

4848
Q, R = @constinferred qr_compact(t)
4949
@test Q * R t
50-
@test isisometry(Q)
50+
@test isisometric(Q)
5151

5252
Q, R = @constinferred left_orth(t; kind = :qr)
5353
@test Q * R t
54-
@test isisometry(Q)
54+
@test isisometric(Q)
5555

5656
N = @constinferred qr_null(t)
57-
@test isisometry(N)
57+
@test isisometric(N)
5858
@test norm(N' * t) 0 atol = 100 * eps(norm(t))
5959

6060
N = @constinferred left_null(t; kind = :qr)
61-
@test isisometry(N)
61+
@test isisometric(N)
6262
@test norm(N' * t) 0 atol = 100 * eps(norm(t))
6363
end
6464

@@ -73,12 +73,12 @@ for V in spacelist
7373

7474
Q, R = @constinferred qr_compact(t)
7575
@test Q * R t
76-
@test isisometry(Q)
76+
@test isisometric(Q)
7777
@test dim(Q) == dim(R) == dim(t)
7878

7979
Q, R = @constinferred left_orth(t; kind = :qr)
8080
@test Q * R t
81-
@test isisometry(Q)
81+
@test isisometric(Q)
8282
@test dim(Q) == dim(R) == dim(t)
8383

8484
N = @constinferred qr_null(t)
@@ -100,14 +100,14 @@ for V in spacelist
100100

101101
L, Q = @constinferred lq_compact(t)
102102
@test L * Q t
103-
@test isisometry(Q; side = :right)
103+
@test isisometric(Q; side = :right)
104104

105105
L, Q = @constinferred right_orth(t; kind = :lq)
106106
@test L * Q t
107-
@test isisometry(Q; side = :right)
107+
@test isisometric(Q; side = :right)
108108

109109
Nᴴ = @constinferred lq_null(t)
110-
@test isisometry(Nᴴ; side = :right)
110+
@test isisometric(Nᴴ; side = :right)
111111
@test norm(t * Nᴴ') 0 atol = 100 * eps(norm(t))
112112
end
113113

@@ -122,12 +122,12 @@ for V in spacelist
122122

123123
L, Q = @constinferred lq_compact(t)
124124
@test L * Q t
125-
@test isisometry(Q; side = :right)
125+
@test isisometric(Q; side = :right)
126126
@test dim(Q) == dim(L) == dim(t)
127127

128128
L, Q = @constinferred right_orth(t; kind = :lq)
129129
@test L * Q t
130-
@test isisometry(Q; side = :right)
130+
@test isisometric(Q; side = :right)
131131
@test dim(Q) == dim(L) == dim(t)
132132

133133
Nᴴ = @constinferred lq_null(t)
@@ -146,12 +146,12 @@ for V in spacelist
146146
@assert domain(t) codomain(t)
147147
w, p = @constinferred left_polar(t)
148148
@test w * p t
149-
@test isisometry(w)
149+
@test isisometric(w)
150150
@test isposdef(p)
151151

152152
w, p = @constinferred left_orth(t; kind = :polar)
153153
@test w * p t
154-
@test isisometry(w)
154+
@test isisometric(w)
155155
end
156156

157157
for T in eltypes,
@@ -160,12 +160,12 @@ for V in spacelist
160160
@assert codomain(t) domain(t)
161161
p, wᴴ = @constinferred right_polar(t)
162162
@test p * wᴴ t
163-
@test isisometry(wᴴ; side = :right)
163+
@test isisometric(wᴴ; side = :right)
164164
@test isposdef(p)
165165

166166
p, wᴴ = @constinferred right_orth(t; kind = :polar)
167167
@test p * wᴴ t
168-
@test isisometry(wᴴ; side = :right)
168+
@test isisometric(wᴴ; side = :right)
169169
end
170170
end
171171

@@ -185,9 +185,9 @@ for V in spacelist
185185

186186
u, s, vᴴ = @constinferred svd_compact(t)
187187
@test u * s * vᴴ t
188-
@test isisometry(u)
188+
@test isisometric(u)
189189
@test isposdef(s)
190-
@test isisometry(vᴴ; side = :right)
190+
@test isisometric(vᴴ; side = :right)
191191

192192
s′ = LinearAlgebra.diag(s)
193193
for (c, b) in LinearAlgebra.svdvals(t)
@@ -196,14 +196,14 @@ for V in spacelist
196196

197197
v, c = @constinferred left_orth(t; kind = :svd)
198198
@test v * c t
199-
@test isisometry(v)
199+
@test isisometric(v)
200200

201201
N = @constinferred left_null(t; kind = :svd)
202-
@test isisometry(N)
202+
@test isisometric(N)
203203
@test norm(N' * t) 0 atol = 100 * eps(norm(t))
204204

205205
Nᴴ = @constinferred right_null(t; kind = :svd)
206-
@test isisometry(Nᴴ; side = :right)
206+
@test isisometric(Nᴴ; side = :right)
207207
@test norm(t * Nᴴ') 0 atol = 100 * eps(norm(t))
208208
end
209209

@@ -233,22 +233,22 @@ for V in spacelist
233233

234234
U, S, Vᴴ = @constinferred svd_trunc(t; trunc = notrunc())
235235
@test U * S * Vᴴ t
236-
@test isisometry(U)
237-
@test isisometry(Vᴴ; side = :right)
236+
@test isisometric(U)
237+
@test isisometric(Vᴴ; side = :right)
238238

239239
trunc = truncrank(dim(domain(S)) ÷ 2)
240240
U1, S1, Vᴴ1 = @constinferred svd_trunc(t; trunc)
241241
@test t * Vᴴ1' U1 * S1
242-
@test isisometry(U1)
243-
@test isisometry(Vᴴ1; side = :right)
242+
@test isisometric(U1)
243+
@test isisometric(Vᴴ1; side = :right)
244244
@test dim(domain(S1)) <= trunc.howmany
245245

246246
λ = minimum(minimum, values(LinearAlgebra.diag(S1)))
247247
trunc = trunctol(; atol = λ - 10eps(λ))
248248
U2, S2, Vᴴ2 = @constinferred svd_trunc(t; trunc)
249249
@test t * Vᴴ2' U2 * S2
250-
@test isisometry(U2)
251-
@test isisometry(Vᴴ2; side = :right)
250+
@test isisometric(U2)
251+
@test isisometric(Vᴴ2; side = :right)
252252
@test minimum(minimum, values(LinearAlgebra.diag(S1))) >= λ
253253
@test U2 U1
254254
@test S2 S1
@@ -257,22 +257,22 @@ for V in spacelist
257257
trunc = truncspace(space(S2, 1))
258258
U3, S3, Vᴴ3 = @constinferred svd_trunc(t; trunc)
259259
@test t * Vᴴ3' U3 * S3
260-
@test isisometry(U3)
261-
@test isisometry(Vᴴ3; side = :right)
260+
@test isisometric(U3)
261+
@test isisometric(Vᴴ3; side = :right)
262262
@test space(S3, 1) space(S2, 1)
263263

264264
trunc = truncerror(; atol = 0.5)
265265
U4, S4, Vᴴ4 = @constinferred svd_trunc(t; trunc)
266266
@test t * Vᴴ4' U4 * S4
267-
@test isisometry(U4)
268-
@test isisometry(Vᴴ4; side = :right)
267+
@test isisometric(U4)
268+
@test isisometric(Vᴴ4; side = :right)
269269
@test norm(t - U4 * S4 * Vᴴ4) <= 0.5
270270

271271
trunc = truncrank(dim(domain(S)) ÷ 2) & trunctol(; atol = λ - 10eps(λ))
272272
U5, S5, Vᴴ5 = @constinferred svd_trunc(t; trunc)
273273
@test t * Vᴴ5' U5 * S5
274-
@test isisometry(U5)
275-
@test isisometry(Vᴴ5; side = :right)
274+
@test isisometric(U5)
275+
@test isisometric(Vᴴ5; side = :right)
276276
@test minimum(minimum, values(LinearAlgebra.diag(S5))) >= λ
277277
@test dim(domain(S5)) dim(domain(S)) ÷ 2
278278
end
@@ -304,7 +304,7 @@ for V in spacelist
304304

305305
t2 = (t + t')
306306
D, V = eigen(t2)
307-
@test isisometry(V)
307+
@test isisometric(V)
308308
D̃, Ṽ = @constinferred eigh_full(t2)
309309
@test D
310310
@test V

0 commit comments

Comments
 (0)