Skip to content

Commit 5376e4e

Browse files
committed
nice
1 parent 0387ac5 commit 5376e4e

30 files changed

+235
-615
lines changed

src/Backends/Qiskit/IBMBackend.jl

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,7 @@ function MQC.execute(backend::IBMBackend; shots=1)
5151
println("Job ID: $(job.job_id())")
5252
end
5353

54-
function execute(circuit::MQC.Circuit, backend::IBMBackend; verbose::Bool=true)
55-
verbose && print("Transpiling circuit to Qiskit...")
56-
qc = MQC.translate(QuantumCircuit, circuit)
57-
verbose && println("")
5854

59-
verbose && print("Transpiling circuit to backend...")
60-
transpile!(qc, backend)
61-
verbose && println("")
62-
63-
verbose && print("Initializing sampler...")
64-
sampler = Sampler(backend)
65-
verbose && println("")
66-
67-
verbose && print("Submitting job...")
68-
job = run(sampler, qc)
69-
verbose && println("")
70-
71-
verbose && println("Job ID: $(job.job_id())")
72-
end
7355

7456
function isSimulator(::IBMBackend)
7557
return false

src/Backends/Qiskit/QuantumCircuit.jl

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,4 @@ function nQubits(circuit::Circuit)
2525
return circuit.num_qubits
2626
end
2727

28-
function depth(operation::MQC.Operation, ::Type{Circuit})
29-
throw(ArgumentError("depth in Qiskit is not implemented for $(typeof(operation)). Please implement this method for your custom operation."))
30-
end
3128

32-
function translate(::Type{Circuit}, circuit::MQC.CompiledCircuit)
33-
_checkinit_qiskit()
34-
total_qubits = circuit.n_qubits + circuit.n_ancilla
35-
qc = Circuit(total_qubits, total_qubits)
36-
for i in 1:MQC.depth(circuit)
37-
operation, position, ancilla = circuit[i]
38-
apply!(qc, MQC.getOperationByIndex(circuit, operation), position, ancilla)
39-
end
40-
return qc
41-
end

src/Backends/Qiskit/Result.jl

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,26 @@
88
# end
99
# end
1010

11-
struct QiskitResult #<: MQC.Result
12-
measurementOutcomes::Matrix{Bool}
13-
# measuredQubits::Vector{Vector{Int64}}
14-
nativeResult::PythonCall.Py
15-
16-
function QiskitResult(nativeResult::PythonCall.Py, circuit::MQC.CompiledCircuit)
17-
_checkinit_qiskit()
18-
# nMeasurements = MQC.nMeasurements(circuit)
19-
bitstrings = PythonCall.pyconvert(Vector{String}, nativeResult.data.c.get_bitstrings())
20-
measurementOutcomes = hcat(map(s -> [c == '1' for c in reverse(s)], bitstrings)...)
21-
22-
23-
# measuredQubits = zeros(Int, nMeasurements)
24-
new(measurementOutcomes, nativeResult)
25-
end
26-
end
27-
28-
function Base.show(io::IO, ::MIME"text/plain", obj::QiskitResult)
29-
print(io, obj.measurementOutcomes)
30-
end
11+
# struct QiskitResult #<: MQC.Result
12+
# measurementOutcomes::Matrix{Bool}
13+
# # measuredQubits::Vector{Vector{Int64}}
14+
# nativeResult::PythonCall.Py
15+
16+
# function QiskitResult(nativeResult::PythonCall.Py, circuit::MQC.CompiledCircuit)
17+
# _checkinit_qiskit()
18+
# # nMeasurements = MQC.nMeasurements(circuit)
19+
# bitstrings = PythonCall.pyconvert(Vector{String}, nativeResult.data.c.get_bitstrings())
20+
# measurementOutcomes = hcat(map(s -> [c == '1' for c in reverse(s)], bitstrings)...)
21+
22+
23+
# # measuredQubits = zeros(Int, nMeasurements)
24+
# new(measurementOutcomes, nativeResult)
25+
# end
26+
# end
27+
28+
# function Base.show(io::IO, ::MIME"text/plain", obj::QiskitResult)
29+
# print(io, obj.measurementOutcomes)
30+
# end
3131

3232

3333
# function QiskitResult(Backend::Type{AerSimulator}, python_interface::PythonCall.Py)

src/Backends/Qiskit/Simulation.jl

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -95,28 +95,3 @@ function MQC.execute(backend::AerSimulator; shots=1)
9595
return nativeResult
9696
end
9797

98-
function MQC.execute(circuit::MQC.CompiledCircuit, backend::AerSimulator; shots=1024)
99-
verbose = false
100-
verbose && print("Transpiling circuit to Qiskit...")
101-
qc = translate(Circuit, circuit)
102-
verbose && println("")
103-
104-
verbose && print("Transpiling circuit to backend...")
105-
transpile!(qc, backend)
106-
verbose && println("")
107-
108-
verbose && print("Initializing sampler...")
109-
sampler = Sampler(backend)
110-
verbose && println("")
111-
112-
verbose && print("Simulating circuit...")
113-
job = run(sampler, qc; shots)
114-
115-
116-
nativeResult = job.result()[0]
117-
verbose && println("")
118-
result = QiskitResult(nativeResult, circuit)
119-
120-
# verbose && println("Job ID: $(job.job_id())")
121-
return result
122-
end

src/Backends/QuantumClifford/Simulation.jl

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,52 @@ struct TableauSimulator <: MonitoredQuantumCircuits.Simulator
88
state::QC.MixedDestabilizer{QC.Tableau{Vector{UInt8},Matrix{UInt64}}}
99
operator::QC.PauliOperator{Array{UInt8,0},Vector{UInt64}}
1010
measurements::BitVector
11-
function TableauSimulator(qubits::Integer; mixed=true, basis=:Z)
11+
measured_qubits::Vector{Int64}
12+
ancillas::Int64
13+
function TableauSimulator(qubits::Integer; ancillas=0, mixed=true, basis=:Z)
1214
if mixed
1315
state = QC.MixedDestabilizer(zero(QC.Stabilizer, qubits))
1416
operator = QC.zero(QC.PauliOperator, qubits)
15-
new(state, operator, falses(0))
17+
new(state, operator, falses(0), Int64[], ancillas)
1618
else
1719
state = QC.MixedDestabilizer(one(QC.Stabilizer, qubits; basis))
1820
operator = QC.zero(QC.PauliOperator, qubits)
19-
new(state, operator, falses(0))
21+
new(state, operator, falses(0), Int64[], ancillas)
2022
end
2123
end
2224
end
2325
function setInitialState!(sim::TableauSimulator, state::QC.MixedDestabilizer)
24-
sim.initial_state.tab.phases .= state.tab.phases
25-
sim.initial_state.tab.xzs .= state.tab.xzs
26-
sim.initial_state.rank = state.rank
26+
sim.state.tab.phases .= state.tab.phases
27+
sim.state.tab.xzs .= state.tab.xzs
28+
sim.state.rank = state.rank
29+
end
30+
function aux(backend::TableauSimulator)
31+
return backend.state.tab.nqubits + backend.ancillas + 1
32+
end
33+
34+
function MonitoredQuantumCircuits.reset!(backend::TableauSimulator; mixed=true, basis=:Z)
35+
qubits = backend.state.tab.nqubits
36+
#? maybe this can be done in place
37+
if mixed
38+
state = QC.MixedDestabilizer(zero(QC.Stabilizer, qubits))
39+
else
40+
state = QC.MixedDestabilizer(one(QC.Stabilizer, qubits; basis))
41+
end
42+
setInitialState!(backend, state)
43+
empty!(backend.measurements)
44+
empty!(backend.measured_qubits)
45+
return backend
46+
end
47+
48+
function Base.show(io::IO, backend::TableauSimulator)
49+
println(io, "TableauSimulator Backend powerd by QuantumClifford.jl")
50+
println(io, "Number of qubits: ", backend.state.tab.nqubits)
51+
println(io, "Number of ancillas: ", backend.ancillas)
52+
if !isempty(backend.measurements)
53+
println(io, "Recorded measurements: ", length(backend.measurements))
54+
else
55+
println(io, "No measurements recorded.")
56+
end
2757
end
2858

2959
"""
@@ -49,10 +79,10 @@ function MonitoredQuantumCircuits.execute(simulator::TableauSimulator)
4979
return simulator.state, simulator.measurements
5080
end
5181

52-
function MonitoredQuantumCircuits.executeParallel(circuit::MonitoredQuantumCircuits.CompiledCircuit, simulator::TableauSimulator; samples=1)
53-
MPI, rank, size = MonitoredQuantumCircuits.get_mpi_ref()
54-
Threads.@threads for i in 1:samples÷size
55-
MonitoredQuantumCircuits.execute(circuit, simulator)
82+
# function MonitoredQuantumCircuits.executeParallel(circuit::MonitoredQuantumCircuits.CompiledCircuit, simulator::TableauSimulator; samples=1)
83+
# MPI, rank, size = MonitoredQuantumCircuits.get_mpi_ref()
84+
# Threads.@threads for i in 1:samples÷size
85+
# MonitoredQuantumCircuits.execute(circuit, simulator)
5686

57-
end
58-
end
87+
# end
88+
# end

src/Backends/QuantumClifford/operations/Measure_X.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function MonitoredQuantumCircuits.apply!(
1818
_, res = QC.projectXrand!(backend.state, p)
1919
res = Bool(res/2)
2020
push!(backend.measurements, res)
21+
push!(backend.measured_qubits, p)
2122
else
2223
QC.projectX!(backend.state, p; keep_result)
2324
res = false

src/Backends/QuantumClifford/operations/Measure_Y.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function MonitoredQuantumCircuits.apply!(
1818
_, res = QC.projectYrand!(backend.state, p)
1919
res = Bool(res/2)
2020
push!(backend.measurements, res)
21+
push!(backend.measured_qubits, p)
2122
else
2223
QC.projectY!(backend.state, p; keep_result)
2324
res = false

src/Backends/QuantumClifford/operations/Measure_Z.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function MonitoredQuantumCircuits.apply!(
1818
_, res = QC.projectZrand!(backend.state, p)
1919
res = Bool(res/2)
2020
push!(backend.measurements, res)
21+
push!(backend.measured_qubits, p)
2122
else
2223
QC.projectZ!(backend.state, p; keep_result)
2324
res = false

src/Backends/QuantumClifford/operations/Pauli.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ function MonitoredQuantumCircuits.apply!(
2222
P::MonitoredQuantumCircuits.NPauli{N},
2323
p::Vararg{Int,N};
2424
keep_result=true,
25+
ancilla=aux(backend), # Default to the number of qubits + ancillas + 1
2526
kwargs...) where N
2627

2728
options = ((true, false), (true, true), (false, true))
@@ -35,6 +36,7 @@ function MonitoredQuantumCircuits.apply!(
3536
_, res = QC.projectrand!(backend.state, operator)
3637
res = Bool(res/2)
3738
push!(backend.measurements, res)
39+
push!(backend.measured_qubits, ancilla)
3840
else
3941
QC.project!(backend.state, operator)
4042
res = false

src/Backends/QuantumClifford/operations/XX.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ function MonitoredQuantumCircuits.apply!(
55
p1::Integer,
66
p2::Integer;
77
keep_result=true,
8+
ancilla=aux(backend), # Default to the number of qubits + ancillas + 1
89
kwargs...)
910

1011
if keep_result
1112
_, res = projectXXrand!(backend.state, p1, p2)
1213
res = Bool(res/2)
1314
push!(backend.measurements, res)
15+
push!(backend.measured_qubits, ancilla)
1416
else
1517
projectXX!(backend.state, p1,p2; keep_result)
1618
res = false

0 commit comments

Comments
 (0)