Skip to content

Commit c81d2e6

Browse files
authored
define LinearAlgebra.normalize (#79)
1 parent 98c5fd9 commit c81d2e6

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "FusionTensors"
22
uuid = "e16ca583-1f51-4df0-8e12-57d32947d33e"
33
authors = ["ITensor developers <[email protected]> and contributors"]
4-
version = "0.5.9"
4+
version = "0.5.10"
55

66
[deps]
77
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"

src/fusiontensor/linear_algebra_interface.jl

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,20 @@ function LinearAlgebra.mul!(
3333
return C
3434
end
3535

36-
function LinearAlgebra.norm(ft::FusionTensor)
36+
function LinearAlgebra.norm(ft::FusionTensor, p::Real=2)
3737
m = data_matrix(ft)
3838
row_sectors = sectors(codomain_axis(ft))
39-
n2 = sum(eachblockstoredindex(m); init=zero(real(eltype(ft)))) do b
40-
return quantum_dimension(row_sectors[Int(first(Tuple(b)))]) * norm(m[b])^2
39+
np = sum(eachblockstoredindex(m); init=zero(real(eltype(ft)))) do b
40+
return quantum_dimension(row_sectors[Int(first(Tuple(b)))]) * norm(m[b], p)^p
4141
end
42-
return sqrt(n2)
42+
return np^(1 / p)
43+
end
44+
45+
LinearAlgebra.normalize(ft::FusionTensor, p::Real=2) = ft / norm(ft, p)
46+
47+
function LinearAlgebra.normalize!(ft::FusionTensor, p::Real=2)
48+
data_matrix(ft) ./= norm(ft, p)
49+
return ft
4350
end
4451

4552
function LinearAlgebra.tr(ft::FusionTensor)
@@ -49,18 +56,3 @@ function LinearAlgebra.tr(ft::FusionTensor)
4956
return quantum_dimension(row_sectors[Int(first(Tuple(b)))]) * tr(m[b])
5057
end
5158
end
52-
53-
function LinearAlgebra.qr(ft::FusionTensor)
54-
qmat, rmat = block_qr(data_matrix(ft))
55-
qtens = FusionTensor(qmat, codomain_axes(ft), (axes(qmat, 2),))
56-
rtens = FusionTensor(rmat, (axes(rmat, 1),), domain_axes(ft))
57-
return qtens, rtens
58-
end
59-
60-
function LinearAlgebra.svd(ft::FusionTensor)
61-
umat, s, vmat = block_svd(data_matrix(ft))
62-
utens = FusionTensor(umat, codomain_axes(ft), (axes(umat, 2),))
63-
stens = FusionTensor(s, (axes(umat, 1),), (axes(vmat, 2),))
64-
vtens = FusionTensor(vmat, (axes(vmat, 1),), domain_axes(ft))
65-
return utens, stens, vtens
66-
end

test/test_linear_algebra.jl

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using LinearAlgebra: norm, tr
1+
using LinearAlgebra: norm, normalize, normalize!, tr
22
using Test: @test, @testset
33

44
using BlockArrays: BlockArrays
55

66
using BlockSparseArrays: BlockSparseArrays
77
using FusionTensors: FusionTensor, to_fusiontensor
8-
using GradedArrays: SU2, TrivialSector, U1, dual, gradedrange
8+
using GradedArrays: O2, SU2, TrivialSector, U1, dual, gradedrange
99

1010
include("setup.jl")
1111

@@ -20,12 +20,31 @@ include("setup.jl")
2020

2121
g0 = gradedrange([TrivialSector() => 2])
2222
gu1 = gradedrange([U1(1) => 1, U1(-1) => 1])
23+
go2 = gradedrange([O2(1 / 2) => 1])
2324
gsu2 = gradedrange([SU2(1 / 2) => 1])
2425

25-
for g in [g0, gu1, gsu2]
26+
for g in [g0, gu1, go2, gsu2]
2627
ft = to_fusiontensor(sdst, (g, g), (dual(g), dual(g)))
2728
@test isnothing(check_sanity(ft))
2829
@test norm(ft) 3 / 2
30+
@test norm(ft, 2) 3 / 2
31+
@test norm(ft, 2.0) 3 / 2
2932
@test isapprox(tr(ft), 0; atol=eps(Float64))
33+
34+
ft2 = normalize(ft)
35+
@test norm(ft2) 1.0
36+
@test norm(ft) 3 / 2 # unaffected by normalize
37+
@test ft 3 / 2 * ft2
38+
normalize!(ft)
39+
@test norm(ft) 1.0
40+
end
41+
42+
for g in [g0, gu1]
43+
ft = to_fusiontensor(sdst, (g, g), (dual(g), dual(g)))
44+
@test norm(ft, 1) 2.0
45+
end
46+
for g in [go2, gsu2]
47+
ft = to_fusiontensor(sdst, (g, g), (dual(g), dual(g)))
48+
@test norm(ft, 1) 1.5
3049
end
3150
end

0 commit comments

Comments
 (0)