Skip to content

Commit 23991af

Browse files
authored
change: Remove PythonCall dep and extension (#51)
* change: Remove PythonCall dep and extension
1 parent 944f1fd commit 23991af

16 files changed

+214
-202
lines changed

Project.toml

+3-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
1010
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
1111
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
1212
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
13+
JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
1314
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1415
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
1516
PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
@@ -21,12 +22,9 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
2122

2223
[weakdeps]
2324
Braket = "19504a0f-b47d-4348-9127-acc6cc69ef67"
24-
JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
25-
PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
2625

2726
[extensions]
2827
BraketSimulatorBraketExt = "Braket"
29-
BraketSimulatorPythonExt = ["JSON3", "PythonCall"]
3028

3129
[compat]
3230
AbstractTrees = "=0.4.5"
@@ -43,7 +41,7 @@ LinearAlgebra = "1.6"
4341
Logging = "1.6"
4442
OrderedCollections = "=1.6.3"
4543
PrecompileTools = "=1.2.1"
46-
PythonCall = "=0.9.22"
44+
PythonCall = "=0.9.23"
4745
Random = "1.6"
4846
StaticArrays = "1.9"
4947
StatsBase = "0.34"
@@ -62,4 +60,4 @@ PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
6260
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
6361

6462
[targets]
65-
test = ["Aqua", "Braket", "JSON3", "Test", "Logging", "PythonCall"]
63+
test = ["Aqua", "Braket", "JSON3", "PythonCall", "Test", "Logging"]

coverage.jl

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Coverage
22
# process '*.cov' files
33
coverage = process_folder()
4-
coverage = append!(coverage, process_folder("ext/BraketSimulatorPythonExt/"))
54
coverage = append!(coverage, process_folder("ext/BraketSimulatorBraketExt/"))
65
coverage = merge_coverage_counts(coverage)
76
# Get total coverage for all Julia files
@@ -17,6 +16,11 @@ for fi in readdir("src")
1716
println("Coverage for file $fi: $(get_summary(process_file(joinpath("src", fi))))")
1817
end
1918
end
19+
for fi in readdir("ext/BraketSimulatorBraketExt")
20+
if endswith(fi, ".jl")
21+
println("Coverage for file $fi: $(get_summary(process_file(joinpath("ext/BraketSimulatorBraketExt", fi))))")
22+
end
23+
end
2024

2125
# uncomment this if you have `genhtml` installed
2226
# to generate HTML coverage info

docs/src/circuits.md

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ BraketSimulator.FreeParameter
1515
BraketSimulator.Measure
1616
BraketSimulator.Instruction
1717
BraketSimulator.QubitSet
18-
BraketSimulator.Qubit
1918
BraketSimulator.qubit_count
2019
BraketSimulator.qubits
2120
BraketSimulator.basis_rotation_instructions!

ext/BraketSimulatorPythonExt/BraketSimulatorPythonExt.jl

-48
This file was deleted.

src/BraketSimulator.jl

+88-16
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ using
44
Dates,
55
Combinatorics,
66
LinearAlgebra,
7+
JSON3,
78
StaticArrays,
89
StatsBase,
910
UUIDs,
@@ -145,11 +146,7 @@ function _generate_results(
145146
) where {D<:AbstractSimulator}
146147
result_values = map(result_type -> calculate(result_type, simulator), result_types)
147148
ir_results = map(StructTypes.lower, result_types)
148-
results = map(zip(ir_results, result_values)) do (ir, val)
149-
ir_val = complex_matrix_to_ir(val)
150-
return ResultTypeValue(ir, ir_val)
151-
end
152-
return results
149+
return [ResultTypeValue(ir_results[r_ix], complex_matrix_to_ir(result_values[r_ix])) for r_ix in 1:length(result_values)]
153150
end
154151

155152
_translate_result_type(r::IR.Amplitude) = Amplitude(r.states)
@@ -202,8 +199,10 @@ parsing and the qubit count of the circuit.
202199
"""
203200
function _prepare_program(circuit_ir::OpenQasmProgram, inputs::Dict{String, <:Any}, shots::Int)
204201
ir_inputs = isnothing(circuit_ir.inputs) ? Dict{String, Float64}() : circuit_ir.inputs
205-
circuit = Circuit(circuit_ir.source, merge(ir_inputs, inputs))
206-
n_qubits = qubit_count(circuit)
202+
merged_inputs = merge(ir_inputs, inputs)
203+
src = circuit_ir.source::String
204+
circuit = Quasar.to_circuit(src, merged_inputs)
205+
n_qubits = qubit_count(circuit)
207206
if shots > 0
208207
_verify_openqasm_shots_observables(circuit, n_qubits)
209208
basis_rotation_instructions!(circuit)
@@ -381,6 +380,68 @@ function simulate(simulator::AbstractSimulator,
381380
return results
382381
end
383382

383+
# these functions are for calls from an "external" language
384+
# like Python or Rust, when we're calling this package from a
385+
# separate process and thus don't want to have to IPC large
386+
# blobs of data back and forth/deal with having to serialize
387+
# Julia objects
388+
function create_sim(simulator_id::String, shots::Int)
389+
return if simulator_id == "braket_sv_v2"
390+
StateVectorSimulator(0, shots)
391+
elseif simulator_id == "braket_dm_v2"
392+
DensityMatrixSimulator(0, shots)
393+
end
394+
end
395+
396+
function _mmap_large_result_values(results)
397+
to_mmap = findall(rt->sizeof(rt.value) > 2^20, results.resultTypes)
398+
isempty(to_mmap) && return nothing, nothing
399+
mmap_files = String[]
400+
obj_lengths = Int[]
401+
for r_ix in to_mmap
402+
push!(obj_lengths, length(results.resultTypes[r_ix].value))
403+
tmp_path, io = mktemp()
404+
write(io, results.resultTypes[r_ix].value)
405+
empty!(results.resultTypes[r_ix].value)
406+
close(io)
407+
push!(mmap_files, tmp_path)
408+
end
409+
py_paths = tuple(mmap_files...)
410+
py_lens = tuple(obj_lengths...)
411+
mmap_files = nothing
412+
obj_lengths = nothing
413+
return py_paths, py_lens
414+
end
415+
416+
function BraketSimulator.simulate(simulator_id::String, task_spec::String, py_inputs::String, shots::Int; kwargs...)
417+
inputs = JSON3.read(py_inputs, Dict{String, Any})
418+
jl_spec = BraketSimulator.OpenQasmProgram(BraketSimulator.braketSchemaHeader("braket.ir.openqasm.program", "1"), task_spec, inputs)
419+
simulator = create_sim(simulator_id, shots)
420+
jl_results = simulate(simulator, jl_spec, shots; kwargs...)
421+
py_paths, py_lens = _mmap_large_result_values(jl_results)
422+
py_results = JSON3.write(jl_results)
423+
simulator = nothing
424+
inputs = nothing
425+
jl_spec = nothing
426+
jl_results = nothing
427+
return py_results, py_paths, py_lens
428+
end
429+
function BraketSimulator.simulate(simulator_id::String, task_specs::AbstractVector, py_inputs::String, shots::Int; kwargs...)
430+
inputs = JSON3.read(py_inputs, Vector{Dict{String, Any}})
431+
jl_specs = map(zip(task_specs, inputs)) do (task_spec, input)
432+
BraketSimulator.OpenQasmProgram(BraketSimulator.braketSchemaHeader("braket.ir.openqasm.program", "1"), task_spec, input)
433+
end
434+
simulator = create_sim(simulator_id, shots)
435+
jl_results = simulate(simulator, jl_specs, shots; kwargs...)
436+
paths_and_lens = JSON3.write(map(_mmap_large_result_values, jl_results))
437+
jsons = JSON3.write(jl_results)
438+
simulator = nothing
439+
jl_results = nothing
440+
inputs = nothing
441+
jl_specs = nothing
442+
return jsons, paths_and_lens
443+
end
444+
384445
include("result_types.jl")
385446
include("properties.jl")
386447
include("sv_simulator.jl")
@@ -699,6 +760,7 @@ include("dm_simulator.jl")
699760
#pragma braket result probability
700761
#pragma braket result expectation x(q[0])
701762
#pragma braket result variance x(q[0]) @ y(q[1])
763+
#pragma braket result variance y(q[0])
702764
"""
703765
shots_results_qasm = """
704766
OPENQASM 3.0;
@@ -714,48 +776,58 @@ include("dm_simulator.jl")
714776
simulator = StateVectorSimulator(5, 0)
715777
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), custom_qasm, nothing)
716778
simulate(simulator, oq3_program, 100)
779+
simulate("braket_sv_v2", custom_qasm, "{}", 100)
717780

718781
simulator = DensityMatrixSimulator(2, 0)
719782
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), noise_qasm, nothing)
720783
simulate(simulator, oq3_program, 100)
721784
simulate(simulator, [oq3_program, oq3_program], 100)
785+
simulate("braket_dm_v2", noise_qasm, "{}", 100)
786+
simulate("braket_dm_v2", [noise_qasm, noise_qasm], "[{}, {}]", 100)
722787

723788
simulator = StateVectorSimulator(3, 0)
724789
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), unitary_qasm, nothing)
725790
simulate(simulator, oq3_program, 100)
726791
simulate(simulator, [oq3_program, oq3_program], 100)
792+
simulate("braket_sv_v2", unitary_qasm, "{}", 100)
793+
simulate("braket_sv_v2", [unitary_qasm, unitary_qasm], "[{}, {}]", 100)
727794

728795
simulator = StateVectorSimulator(6, 0)
729796
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), sv_adder_qasm, Dict("a_in"=>3, "b_in"=>7))
730797
simulate(simulator, oq3_program, 0)
731-
798+
simulate("braket_sv_v2", sv_adder_qasm, "{\"a_in\":3,\"b_in\":7}", 100)
799+
732800
simulator = StateVectorSimulator(16, 0)
733801
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), grcs_16_qasm, nothing)
734802
simulate(simulator, oq3_program, 0)
803+
simulate("braket_sv_v2", grcs_16_qasm, "{}", 0)
735804

736805
simulator = StateVectorSimulator(2, 0)
737806
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), vqe_qasm, nothing)
738807
simulate(simulator, oq3_program, 100)
808+
simulate("braket_sv_v2", vqe_qasm, "{}", 100)
739809

740810
sv_simulator = StateVectorSimulator(3, 0)
741811
dm_simulator = DensityMatrixSimulator(3, 0)
742812
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), all_gates_qasm, Dict("theta"=>0.665))
743813
simulate(sv_simulator, oq3_program, 100)
744814
simulate(dm_simulator, oq3_program, 100)
815+
simulate("braket_sv_v2", all_gates_qasm, "{\"theta\":0.665}", 100)
816+
simulate("braket_dm_v2", all_gates_qasm, "{\"theta\":0.665}", 100)
745817

746818
sv_simulator = StateVectorSimulator(2, 0)
747819
dm_simulator = DensityMatrixSimulator(2, 0)
748820
sv_oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), sv_exact_results_qasm, nothing)
749821
dm_oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), dm_exact_results_qasm, nothing)
750-
results = simulate(sv_simulator, sv_oq3_program, 0)
751-
map(StructTypes.lower, results.resultTypes)
752-
results = simulate(dm_simulator, dm_oq3_program, 0)
753-
map(StructTypes.lower, results.resultTypes)
822+
simulate(sv_simulator, sv_oq3_program, 0)
823+
simulate("braket_sv_v2", sv_exact_results_qasm, "{}", 0)
824+
simulate(dm_simulator, dm_oq3_program, 0)
825+
simulate("braket_dm_v2", dm_exact_results_qasm, "{}", 0)
754826
oq3_program = OpenQasmProgram(braketSchemaHeader("braket.ir.openqasm.program", "1"), shots_results_qasm, nothing)
755-
results = simulate(sv_simulator, oq3_program, 10)
756-
map(StructTypes.lower, results.resultTypes)
757-
results = simulate(dm_simulator, oq3_program, 10)
758-
map(StructTypes.lower, results.resultTypes)
827+
simulate(sv_simulator, oq3_program, 10)
828+
simulate(dm_simulator, oq3_program, 10)
829+
simulate("braket_sv_v2", shots_results_qasm, "{}", 10)
830+
simulate("braket_dm_v2", shots_results_qasm, "{}", 10)
759831
end
760832
end
761833
end # module BraketSimulator

0 commit comments

Comments
 (0)