Skip to content
Draft
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
8 changes: 4 additions & 4 deletions examples/Benchmark_1.jl
Original file line number Diff line number Diff line change
Expand Up @@ -130,22 +130,22 @@ display([M.basis.polynomials for M in ν.sub_moment_matrices])

# Now let's define a function for our common use case.

function f(L, d=1, consecutive=false; symmetry=true)
function f(L, d=1, consecutive=false; kws...)
@show L
println("***")
@show d
bound, gram, ν = @time hamiltonian_energy(
L,
2d,
solver,
solver;
consecutive=consecutive,
symmetry=symmetry,
kws...,
)
@show bound
for M in ν.sub_moment_matrices
display(round.(M.basis.polynomials, digits=6))
end
println("E/N = ", bound / L)
println("E/N = ", bound / (4L))
println("------------------------------------")
end

Expand Down
39 changes: 36 additions & 3 deletions src/sos.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ export optimizer_with_attributes, MOI, MOIU, NoSparsity, MonomialSparsity, Chord

export energy

function all_odd(mono::SpinMonomial)
return all(0:2) do index
isodd(count(v -> v.index == index, values(mono.variable)))
end
end

"""
energy(H, maxdegree, solver;
cone=NonnegPolyInnerCone{SumOfSquares.COI.HermitianPositiveSemidefiniteConeTriangle}(),
Expand All @@ -25,6 +31,7 @@ function energy(H, maxdegree, solver;
sparsity=MonomialSparsity(),
non_sparse=SumOfSquares.Certificate.MaxDegree(cone, MonomialBasis, maxdegree),
certificate=sparsity isa NoSparsity ? non_sparse : SumOfSquares.Certificate.SparseIdeal(sparsity, non_sparse),
odd_sym=false,
kws...
)
model = MOI.instantiate(solver, with_bridge_type=Float64)
Expand All @@ -36,14 +43,40 @@ function energy(H, maxdegree, solver;
MOI.Bridges.add_bridge(model, SumOfSquares.COI.Bridges.Constraint.SplitZeroBridge{Float64})
γ = MOI.SingleVariable(MOI.add_variable(model))
poly = convert(SpinPolynomial{Complex{Float64}}, H) - (1.0 + 0.0im) * γ
c = SumOfSquares.add_constraint(model, poly, SOSCone(); ideal_certificate=certificate, kws...)
if odd_sym
gram_basis = SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.GramBasis(), poly)
MCT = SumOfSquares.COI.HermitianPositiveSemidefiniteConeTriangle
g, Q, cQ = SumOfSquares.add_gram_matrix(model, MCT, gram_basis, Complex{Float64})
q = MA.operate!(-, poly, g)
for t in MP.terms(q)
MOI.add_constraint(model, MOIU.operate(vcat, Complex{Float64}, MP.coefficient(t)), MOI.Zeros(1))
end
else
c = SumOfSquares.add_constraint(model, poly, cone; ideal_certificate=certificate, kws...)
end
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
MOI.set(model, MOI.ObjectiveFunction{MOI.SingleVariable}(), γ)
MOI.optimize!(model)
if MOI.get(model, MOI.TerminationStatus()) != MOI.OPTIMAL
@warn("Termination status: $(MOI.get(model, MOI.TerminationStatus())), $(MOI.get(model, MOI.RawStatusString()))")
end
gram = MOI.get(model, SumOfSquares.GramMatrixAttribute(), c)
ν = MOI.get(model, SumOfSquares.MomentMatrixAttribute(), c)
if odd_sym

gram = SumOfSquares.Bridges.Constraint._gram(Q -> MOI.get(model, MOI.VariablePrimal(), Q),
Q, gram_basis, Complex{Float64}, MCT)
ν = if cQ isa Vector{<:MOI.ConstraintIndex}
SumOfSquares.build_moment_matrix(gram_basis) do i
MOI.get(model, MOI.ConstraintDual(), cQ[i])
end
else
SOS.build_moment_matrix(
MOI.get(model, MOI.ConstraintDual(), cQ),
gram_basis,
)
end
else
gram = MOI.get(model, SumOfSquares.GramMatrixAttribute(), c)
ν = MOI.get(model, SumOfSquares.MomentMatrixAttribute(), c)
end
MOI.get(model, MOI.ObjectiveValue()), gram, ν
end