@@ -4,17 +4,22 @@ using ITensors:
44 ITensor,
55 Index,
66 QN,
7+ apply,
78 dag,
89 delta,
910 inds,
11+ mapprime,
1012 noprime,
13+ norm,
1114 op,
15+ permute,
1216 prime,
1317 random_itensor,
1418 replaceind,
1519 replaceinds,
16- sim
17- using ITensorNetworks. ITensorsExtensions: map_eigvals
20+ sim,
21+ swapprime
22+ using ITensorNetworks. ITensorsExtensions: eigendecomp, map_eigvals
1823using StableRNGs: StableRNG
1924using Test: @test , @testset
2025@testset " ITensorsExtensions" begin
@@ -72,5 +77,54 @@ using Test: @test, @testset
7277 I = replaceind (inv_sqrtP * sqrtP, new_ind, i)
7378 @test I ≈ op (" I" , i)
7479 end
80+
81+ @testset " Fermionic eigendecomp" begin
82+ s1 = Index ([QN (" Nf" , 0 , - 1 )=> 2 , QN (" Nf" , 1 , - 1 )=> 2 ], " Site,Fermion,n=1" )
83+ s2 = Index ([QN (" Nf" , 0 , - 1 )=> 2 , QN (" Nf" , 1 , - 1 )=> 2 ], " Site,Fermion,n=2" )
84+
85+ # Make a random Hermitian matrix-like 4th order ITensor
86+ T = random_itensor (s1' , s2' , dag (s2), dag (s1))
87+ T = apply (T, swapprime (dag (T), 0 => 1 ))
88+ @test T ≈ swapprime (dag (T), 0 => 1 ) # check Hermitian
89+
90+ Ul, D, Ur = eigendecomp (T, [s1' , s2' ], [dag (s1), dag (s2)]; ishermitian= true )
91+
92+ @test Ul* D* Ur ≈ T
93+ end
94+
95+ @testset " Fermionic map eigvals tests" begin
96+ s1 = Index ([QN (" Nf" , 0 , - 1 )=> 2 , QN (" Nf" , 1 , - 1 )=> 2 ], " Site,Fermion,n=1" )
97+ s2 = Index ([QN (" Nf" , 0 , - 1 )=> 2 , QN (" Nf" , 1 , - 1 )=> 2 ], " Site,Fermion,n=2" )
98+
99+ # Make a random Hermitian matrix ITensor
100+ M = random_itensor (s1' , dag (s1))
101+ # M = mapprime(prime(M)*swapprime(dag(M),0=>1),2=>1)
102+ M = apply (M, swapprime (dag (M), 0 => 1 ))
103+
104+ # Make a random Hermitian matrix-like 4th order ITensor
105+ T = random_itensor (s1' , s2' , dag (s2), dag (s1))
106+ T = apply (T, swapprime (dag (T), 0 => 1 ))
107+
108+ # Matrix test
109+ sqrtM = map_eigvals (sqrt, M, s1' , dag (s1); ishermitian= true )
110+ @test M ≈ apply (sqrtM, sqrtM)
111+
112+ # # Tensor test
113+ sqrtT = map_eigvals (sqrt, T, [s1' , s2' ], [dag (s1), dag (s2)]; ishermitian= true )
114+ @test T ≈ apply (sqrtT, sqrtT)
115+
116+ # Permute and test again
117+ T = permute (T, dag (s2), s2' , dag (s1), s1' )
118+ sqrtT = map_eigvals (sqrt, T, [s1' , s2' ], [dag (s1), dag (s2)]; ishermitian= true )
119+ @test T ≈ apply (sqrtT, sqrtT)
120+
121+ # # Explicitly passing indices in different, valid orders
122+ sqrtT = map_eigvals (sqrt, T, [s2' , s1' ], [dag (s2), dag (s1)]; ishermitian= true )
123+ @test T ≈ apply (sqrtT, sqrtT)
124+ sqrtT = map_eigvals (sqrt, T, [dag (s2), dag (s1)], [s2' , s1' ], ; ishermitian= true )
125+ @test T ≈ apply (sqrtT, sqrtT)
126+ sqrtT = map_eigvals (sqrt, T, [dag (s1), dag (s2)], [s1' , s2' ], ; ishermitian= true )
127+ @test T ≈ apply (sqrtT, sqrtT)
128+ end
75129end
76130end
0 commit comments