Compare commits

...

2 Commits

1 changed files with 19 additions and 2 deletions

View File

@ -20,21 +20,38 @@ H0 = H0 + transpose(H0) # symmetric
H1 = randn(ComplexF64, N, N) H1 = randn(ComplexF64, N, N)
H1 = H1 + transpose(H1) # symmetric H1 = H1 + transpose(H1) # symmetric
# define the inner product for vectors
inner(ψ1, ψ2) = only(transpose(ψ1) * ψ2)
normalized(ψ) = ψ ./ sqrt(inner(ψ, ψ))
overlap(ψ1_hat, ψ2) = inner(ψ1_hat, ψ2) / sqrt(inner(ψ2, ψ2))
# training # training
Es = ComplexF64[] Es = ComplexF64[]
ψs = Vector{ComplexF64}[] ψs = Vector{ComplexF64}[]
lr = 0.05 lr = 0.05
epochs = 100000 epochs = 100000
for epoch in 1:epochs for epoch in 1:epochs
last_ψ = isempty(ψs) ? nothing : ψs[1]
empty!(Es) empty!(Es)
empty!(ψs) empty!(ψs)
for (c, E) in zip(data_c, data_E) for (c, E) in zip(data_c, data_E)
H = H0 + c * H1 H = H0 + c * H1
evals, evecs = eigen(H) evals, evecs = eigen(H)
i = nearestIndex(evals, E) # TODO: more robust way to identify the eigenvector # identification of the eigenstate
if isnothing(last_ψ)
i = nearestIndex(evals, E)
else
overlaps = [abs(overlap(last_ψ, evecs[:, i])) for i in 1:N]
i = argmax(overlaps)
if epoch > 0.01epochs # check agreement with eigenvalues after 1% of epochs
i nearestIndex(evals, E) && @warn("Identification via overlap contradicts eigenvalues")
end
end
last_ψ = evecs[:, i] |> normalized
push!(ψs, last_ψ)
push!(Es, evals[i]) push!(Es, evals[i])
push!(ψs, evecs[:, i])
end end
if epoch % 1000 == 0 if epoch % 1000 == 0