Skip to content

Commit

Permalink
Use QUBODrivers
Browse files Browse the repository at this point in the history
  • Loading branch information
pedromxavier committed Apr 9, 2023
1 parent 4badb2e commit 9770ca2
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 59 deletions.
16 changes: 6 additions & 10 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
name = "QiskitOpt"
uuid = "81b20daf-e62b-4502-a0d1-aa084de80e33"
authors = [
"pedromxavier <[email protected]>",
"pedroripper <[email protected]>",
]
name = "QiskitOpt"
uuid = "81b20daf-e62b-4502-a0d1-aa084de80e33"
authors = ["pedromxavier <[email protected]>", "pedroripper <[email protected]>"]
version = "0.1.0"

[deps]
Anneal = "e4d9eb7f-b088-426e-aeb5-1c0dae3d8abb"
PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
QUBODrivers = "a3f166f7-2cd3-47b6-9e1e-6fbfe0449eb0"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[compat]
Anneal = "0.6"
PythonCall = "0.9"
julia = "1.6"
julia = "1.6"
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# QiskitOpt.jl
[![DOI](https://zenodo.org/badge/587349377.svg)](https://zenodo.org/badge/latestdoi/587349377)
[![QUBODRIVERS](https://img.shields.io/badge/Powered%20by-QUBODrivers.jl-%20%234063d8)](https://github.com/psrenergy/QUBODrivers.jl)

IBM Qiskit Optimization Wrapper for JuMP (ft. [Anneal.jl](https://github.com/psrenergy/Anneal.jl))
IBM Qiskit Optimization Wrapper for JuMP

## Installation
```julia
Expand Down
31 changes: 18 additions & 13 deletions src/QAOA.jl
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
module QAOA

using Anneal
using Random
using PythonCall: pyconvert
using ..QiskitOpt:
qiskit,
qiskit_optimization_algorithms,
qiskit_optimization_runtime,
quadratic_program

Anneal.@anew Optimizer begin
import QUBODrivers:
MOI,
QUBODrivers,
QUBOTools,
Sample,
SampleSet,
@setup,
sample

@setup Optimizer begin
name = "IBM Qiskit QAOA"
sense = :min
domain = :bool
Expand All @@ -21,7 +28,7 @@ Anneal.@anew Optimizer begin
end
end

function Anneal.sample(sampler::Optimizer{T}) where {T}
function sample(sampler::Optimizer{T}) where {T}
# -*- Retrieve Attributes - *-
seed = MOI.get(sampler, QAOA.RandomSeed())
num_reads = MOI.get(sampler, QAOA.NumberOfReads())
Expand All @@ -34,10 +41,13 @@ function Anneal.sample(sampler::Optimizer{T}) where {T}
rng = Random.Xoshiro(seed)

# Results vector
samples = Vector{Anneal.Sample{T,Int}}(undef, num_reads)
samples = Vector{Sample{T,Int}}(undef, num_reads)

# Timing Information
time_data = Dict{String,Any}()
metadata = Dict{String,Any}(
"origin" => "IBMQ QAOA @ $(ibm_backend)",
"time" => Dict{String,Any}(),
)

# Connect to IBMQ and get backend
connect(sampler) do client
Expand Down Expand Up @@ -66,20 +76,15 @@ function Anneal.sample(sampler::Optimizer{T}) where {T}
samples[i] = Sample{T}(Ψ[j], Λ[j])
end

time_data["effective"] = pyconvert(
metadata["time"]["effective"] = pyconvert(
Float64,
results.min_eigen_solver_result.optimizer_time,
)

return nothing
end

metadata = Dict{String,Any}(
"origin" => "IBMQ QAOA @ $(ibm_backend)",
"time" => time_data,
)

return Anneal.SampleSet{T}(samples, metadata)
return SampleSet{T}(samples, metadata)
end

function connect(
Expand Down
18 changes: 9 additions & 9 deletions src/QiskitOpt.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
module QiskitOpt

using Anneal
using PythonCall
import QUBODrivers: MOI, QUBODrivers, QUBOTools

# -*- :: Python Qiskit Modules :: -*- #
# :: Python Qiskit Modules ::
const qiskit = PythonCall.pynew()
const qiskit_algorithms = PythonCall.pynew()
const qiskit_optimization = PythonCall.pynew()
Expand All @@ -12,7 +12,7 @@ const qiskit_optimization_runtime = PythonCall.pynew()
const qiskit_utils = PythonCall.pynew()

function __init__()
# -*- Load Python Packages -*- #
# Load Python Packages
PythonCall.pycopy!(qiskit, pyimport("qiskit"))
PythonCall.pycopy!(qiskit_algorithms, pyimport("qiskit.algorithms"))
PythonCall.pycopy!(qiskit_optimization, pyimport("qiskit_optimization"))
Expand All @@ -23,19 +23,19 @@ function __init__()
PythonCall.pycopy!(qiskit_optimization_runtime, pyimport("qiskit_optimization.runtime"))
PythonCall.pycopy!(qiskit_utils, pyimport("qiskit.utils"))

# -*- IBMQ Credentials -*- #
# IBMQ Credentials
IBMQ_API_TOKEN = get(ENV, "IBMQ_API_TOKEN", nothing)

if !isnothing(IBMQ_API_TOKEN)
qiskit.IBMQ.save_account(IBMQ_API_TOKEN)
end
end

function quadratic_program(sampler::Anneal.AbstractSampler{T}) where {T}
# -*- Retrieve Model -*- #
Q, α, β = Anneal.qubo(sampler, Dict)
function quadratic_program(sampler::QUBODrivers.AbstractSampler{T}) where {T}
# Retrieve Model
Q, α, β = QUBODrivers.qubo(sampler, Dict)

# -*- Build Qiskit Model -*- #
# Build Qiskit Model
linear = PythonCall.pydict()
quadratic = PythonCall.pydict()

Expand All @@ -49,7 +49,7 @@ function quadratic_program(sampler::Anneal.AbstractSampler{T}) where {T}

qp = qiskit_optimization.QuadraticProgram()

for v in string.(Anneal.indices(sampler))
for v in string.(QUBOTools.indices(sampler))
qp.binary_var(v)
end

Expand Down
50 changes: 27 additions & 23 deletions src/VQE.jl
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
module VQE

using Random
using Anneal
using PythonCall: pyconvert
using ..QiskitOpt:
qiskit,
qiskit_optimization_algorithms,
qiskit_algorithms,
qiskit_optimization_runtime,
quadratic_program

Anneal.@anew Optimizer begin
import QUBODrivers:
MOI,
QUBODrivers,
QUBOTools,
Sample,
SampleSet,
@setup,
sample

@setup Optimizer begin
name = "VQE @ IBMQ"
sense = :min
domain = :bool
Expand All @@ -26,23 +33,26 @@ Anneal.@anew Optimizer begin
end
end

function Anneal.sample(sampler::Optimizer{T}) where {T}
# -*- Retrieve Attributes - *-
function sample(sampler::Optimizer{T}) where {T}
# Retrieve Attribute
seed = MOI.get(sampler, VQE.RandomSeed())
num_reads = MOI.get(sampler, VQE.NumberOfReads())
ibm_backend = MOI.get(sampler, VQE.IBMBackend())

# -*- Instantiate Random Generator -*- #
# Instantiate Random Generator
rng = Random.Xoshiro(seed)

# -*- Retrieve Model -*- #
# Retrieve Model
qp, α, β = quadratic_program(sampler)

# Results vector
samples = Vector{Anneal.Sample{T,Int}}(undef, num_reads)
samples = Vector{Sample{T,Int}}(undef, num_reads)

# Timing Information
time_data = Dict{String,Any}()
# Extra Information
metadata = Dict{String,Any}(
"origin" => "IBMQ VQE @ $(ibm_backend)",
"time" => Dict{String,Any}(),
)

# Connect to IBMQ and get backend
connect(sampler) do client
Expand Down Expand Up @@ -71,51 +81,45 @@ function Anneal.sample(sampler::Optimizer{T}) where {T}
samples[i] = Sample{T}(Ψ[j], Λ[j])
end

time_data["effective"] = pyconvert(
metadata["time"]["effective"] = pyconvert(
Float64,
results.min_eigen_solver_result.optimizer_time
)

return nothing
end

metadata = Dict{String,Any}(
"origin" => "IBMQ @ $(ibm_backend)",
"time" => time_data,
)


return Anneal.SampleSet{T}(samples, metadata)
return SampleSet{T}(samples, metadata)
end

function connect(
callback::Function,
sampler::Optimizer,
)
# -*- Retrieve Attributes -*- #
# Retrieve Attributes
num_shots = MOI.get(sampler, VQE.NumberOfShots())
max_iter = MOI.get(sampler, VQE.MaximumIterations())
num_reps = MOI.get(sampler, VQE.NumberOfRepetitions())
num_qubits = MOI.get(sampler, MOI.NumberOfVariables())
ibm_backend = MOI.get(sampler, VQE.IBMBackend())
entanglement = MOI.get(sampler, VQE.Entanglement())

# -*- Load Credentials -*- #
# Load Credentials
qiskit.IBMQ.load_account()

# -*- Connect to provider -*- #
# Connect to provider
provider = qiskit.IBMQ.get_provider()
backend = provider.get_backend(ibm_backend)
SPSA = qiskit_algorithms.optimizers.SPSA(maxiter = max_iter)

# -*- Setup Ansatz -*- #
# Setup Ansatz
ansatz = qiskit.circuit.library.EfficientSU2(
num_qubits = num_qubits,
reps = num_reps,
entanglement = entanglement,
)

# -*- Setup VQE Client -*- #
# Setup VQE Client
client = qiskit_optimization_runtime.VQEClient(
provider = provider,
backend = backend,
Expand Down
6 changes: 3 additions & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using QiskitOpt
using QiskitOpt: QUBODrivers, QAOA, VQE

QiskitOpt.QAOA.test(; examples=true)
QiskitOpt.VQE.test(; examples=true)
QUBODrivers.test(QAOA.Optimizer)
QUBODrivers.test(VQE.Optimizer)

0 comments on commit 9770ca2

Please sign in to comment.