Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/exports.jl
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ export
insertblock!,
ishermitian,
itensor,
logdot,
loginner,
mul!,
matrix,
mapprime!,
Expand Down
3 changes: 3 additions & 0 deletions src/itensor.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1916,9 +1916,12 @@ diag(T::ITensor) = diag(tensor(T))
mul!(C::ITensor, A::ITensor, B::ITensor, args...)::ITensor = contract!(C, A, B, args...)

dot(A::ITensor, B::ITensor) = (dag(A) * B)[]
logdot(A::ITensor, B::ITensor) = log(complex(dot(A, B)))

inner(y::ITensor, A::ITensor, x::ITensor) = (dag(y) * A * x)[]
inner(y::ITensor, x::ITensor) = (dag(y) * x)[]
loginner(A::ITensor, B::ITensor) = log(complex(inner(A, B)))
loginner(y::ITensor, A::ITensor, x::ITensor) = log(complex(inner(y, A, x)))

#
# In-place operations
Expand Down
28 changes: 23 additions & 5 deletions test/base/test_itensor.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ using ITensors.NDTensors: DenseTensor, NDTensors, array, dim, dims, eigen, facto
using ITensors: ITensors, ITensor, Index, IndexSet, Order, QN, TagSet, addtags, allhastags,
anyhastags, commonind, convert_eltype, convert_leaf_eltype, dag, directsum, eachindval,
eachval, filterinds, firstind, hascommoninds, hasind, hasinds, hassameinds, hastags,
inner, itensor, mapprime, noprime, onehot, order, permute, prime, product,
random_itensor, removetags, replaceind, replaceind!, replaceinds, replaceinds!,
inner, itensor, logdot, loginner, mapprime, noprime, onehot, order, permute, prime,
product, random_itensor, removetags, replaceind, replaceind!, replaceinds, replaceinds!,
replacetags, scalar, setelt, setprime, settags, sim, swapinds, swapinds!, swapprime,
uniqueind, uniqueindex, val, δ, ⊕
using LinearAlgebra:
Expand Down Expand Up @@ -1741,16 +1741,34 @@ end
@test_throws ErrorException product(A, B)
end

@testset "inner ($ElType)" for ElType in (Float64, ComplexF64)
@testset "inner and loginner ($ElType)" for ElType in (Float64, ComplexF64)
i = Index(2)
j = Index(2)
A = random_itensor(ElType, i', j', i, j)
x = random_itensor(ElType, i, j)
y = random_itensor(ElType, i, j)
@test inner(x, y) ≈ (dag(x) * y)[]
@test inner(x', A, y) ≈ (dag(x)' * A * y)[]

val2 = inner(x, y)
@test val2 ≈ (dag(x) * y)[]
val3 = inner(x', A, y)
@test val3 ≈ (dag(x)' * A * y)[]

@test loginner(x, y) ≈ log(complex(val2))
@test logdot(x, y) ≈ log(complex(val2))

@test loginner(x', A, y) ≈ log(complex(val3))

# No automatic priming
@test_throws DimensionMismatch inner(x, A, y)
@test_throws DimensionMismatch loginner(x, A, y)

if ElType == Float64
C = itensor([1.0, 0.0], i)
D = itensor([-1.0, 0.0], i)
@test loginner(C, D) ≈ log(-1.0 + 0.0im)
@test imag(loginner(C, D)) ≈ π
end
@test loginner(x, y) isa Complex
end

@testset "hastags" begin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ const ITENSORS_EXPORTED_NAMES = [
:isindequal,
:itensor,
:linkindex,
:logdot,
:loginner,
:lq,
:mapprime,
:mapprime!,
Expand Down
Loading