Delete Julia implementation of PMM
This commit is contained in:
parent
31ec08379a
commit
d158d022dc
|
|
@ -1,71 +0,0 @@
|
||||||
using LinearAlgebra, Random, Plots
|
|
||||||
include("../p_space.jl")
|
|
||||||
|
|
||||||
μ = 0.5
|
|
||||||
V_system(c) = (p, q) -> c*(-5*g0(sqrt(3), p, q) + 2*g0(sqrt(10), p, q)) # ResonanceEC: Eq. (20)
|
|
||||||
|
|
||||||
training_c = range(1.2, 0.9, 9) # original: range(1.35, 0.9, 5)
|
|
||||||
extrapolating_c = range(0.78, 0.45, 7) # original: range(0.75, 0.40, 8)
|
|
||||||
|
|
||||||
# calculate training data
|
|
||||||
data_c = training_c
|
|
||||||
data_E = [quick_pole_E(V_system(c)) for c in data_c]
|
|
||||||
|
|
||||||
# hyperparameters
|
|
||||||
N = 9
|
|
||||||
|
|
||||||
# initialize random Hamiltonians
|
|
||||||
H0 = randn(ComplexF64, N, N)
|
|
||||||
H0 = H0 + transpose(H0) # symmetric
|
|
||||||
H1 = randn(ComplexF64, N, N)
|
|
||||||
H1 = H1 + transpose(H1) # symmetric
|
|
||||||
|
|
||||||
# training
|
|
||||||
Es = ComplexF64[]
|
|
||||||
ψs = Vector{ComplexF64}[]
|
|
||||||
|
|
||||||
lr = 0.05
|
|
||||||
epochs = 100000
|
|
||||||
for epoch in 1:epochs
|
|
||||||
empty!(Es)
|
|
||||||
empty!(ψs)
|
|
||||||
for (c, E) in zip(data_c, data_E)
|
|
||||||
H = H0 + c * H1
|
|
||||||
evals, evecs = eigen(H)
|
|
||||||
i = nearestIndex(evals, E) # TODO: more robust way to identify the eigenvector
|
|
||||||
push!(Es, evals[i])
|
|
||||||
push!(ψs, evecs[:, i])
|
|
||||||
end
|
|
||||||
|
|
||||||
if epoch % 1000 == 0
|
|
||||||
loss = sum(abs2, Es .- data_E)
|
|
||||||
println("Epoch:$epoch/$epochs \t Loss: $loss")
|
|
||||||
end
|
|
||||||
|
|
||||||
# gradient of the loss function
|
|
||||||
function grad(c_order=0)
|
|
||||||
out = zeros(ComplexF64, N, N)
|
|
||||||
for (c, E_target, ψ, E) in zip(data_c, data_E, ψs, Es)
|
|
||||||
out .+= (c^c_order * conj(E - E_target)) .* (ψ * transpose(ψ))
|
|
||||||
end
|
|
||||||
return 2 .* real.(out)
|
|
||||||
end
|
|
||||||
H0 .-= lr .* grad(0) # update H0
|
|
||||||
H1 .-= lr .* grad(1) # update H1
|
|
||||||
end
|
|
||||||
|
|
||||||
# evaluate for all points
|
|
||||||
all_c = vcat(training_c, extrapolating_c)
|
|
||||||
exact_E = [quick_pole_E(V_system(c)) for c in all_c]
|
|
||||||
extrapolated_E = ComplexF64[]
|
|
||||||
for (c, ref) in zip(all_c, exact_E)
|
|
||||||
H = H0 + c * H1
|
|
||||||
evals, evecs = eigen(H)
|
|
||||||
evals = vcat(evals, conj.(evals)) # include complex conjugates
|
|
||||||
push!(extrapolated_E, nearest(evals, ref))
|
|
||||||
end
|
|
||||||
|
|
||||||
# plot results
|
|
||||||
scatter(real.(data_E), imag.(data_E), label="training", title="PMM", xlabel="Re E", ylabel="Im E")
|
|
||||||
scatter!(real.(exact_E), imag.(exact_E), label="exact", m=:+)
|
|
||||||
scatter!(real.(extrapolated_E), imag.(extrapolated_E), label="predicted", m=:x)
|
|
||||||
Loading…
Reference in New Issue