4
4
Dates,
5
5
Combinatorics,
6
6
LinearAlgebra,
7
+ JSON3,
7
8
StaticArrays,
8
9
StatsBase,
9
10
UUIDs,
@@ -145,11 +146,7 @@ function _generate_results(
145
146
) where {D<: AbstractSimulator }
146
147
result_values = map (result_type -> calculate (result_type, simulator), result_types)
147
148
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)]
153
150
end
154
151
155
152
_translate_result_type (r:: IR.Amplitude ) = Amplitude (r. states)
@@ -202,8 +199,10 @@ parsing and the qubit count of the circuit.
202
199
"""
203
200
function _prepare_program (circuit_ir:: OpenQasmProgram , inputs:: Dict{String, <:Any} , shots:: Int )
204
201
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)
207
206
if shots > 0
208
207
_verify_openqasm_shots_observables (circuit, n_qubits)
209
208
basis_rotation_instructions! (circuit)
@@ -381,6 +380,68 @@ function simulate(simulator::AbstractSimulator,
381
380
return results
382
381
end
383
382
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
+
384
445
include (" result_types.jl" )
385
446
include (" properties.jl" )
386
447
include (" sv_simulator.jl" )
@@ -699,6 +760,7 @@ include("dm_simulator.jl")
699
760
#pragma braket result probability
700
761
#pragma braket result expectation x(q[0])
701
762
#pragma braket result variance x(q[0]) @ y(q[1])
763
+ #pragma braket result variance y(q[0])
702
764
"""
703
765
shots_results_qasm = """
704
766
OPENQASM 3.0;
@@ -714,48 +776,58 @@ include("dm_simulator.jl")
714
776
simulator = StateVectorSimulator (5 , 0 )
715
777
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), custom_qasm, nothing )
716
778
simulate (simulator, oq3_program, 100 )
779
+ simulate (" braket_sv_v2" , custom_qasm, " {}" , 100 )
717
780
718
781
simulator = DensityMatrixSimulator (2 , 0 )
719
782
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), noise_qasm, nothing )
720
783
simulate (simulator, oq3_program, 100 )
721
784
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 )
722
787
723
788
simulator = StateVectorSimulator (3 , 0 )
724
789
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), unitary_qasm, nothing )
725
790
simulate (simulator, oq3_program, 100 )
726
791
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 )
727
794
728
795
simulator = StateVectorSimulator (6 , 0 )
729
796
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), sv_adder_qasm, Dict (" a_in" => 3 , " b_in" => 7 ))
730
797
simulate (simulator, oq3_program, 0 )
731
-
798
+ simulate (" braket_sv_v2" , sv_adder_qasm, " {\" a_in\" :3,\" b_in\" :7}" , 100 )
799
+
732
800
simulator = StateVectorSimulator (16 , 0 )
733
801
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), grcs_16_qasm, nothing )
734
802
simulate (simulator, oq3_program, 0 )
803
+ simulate (" braket_sv_v2" , grcs_16_qasm, " {}" , 0 )
735
804
736
805
simulator = StateVectorSimulator (2 , 0 )
737
806
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), vqe_qasm, nothing )
738
807
simulate (simulator, oq3_program, 100 )
808
+ simulate (" braket_sv_v2" , vqe_qasm, " {}" , 100 )
739
809
740
810
sv_simulator = StateVectorSimulator (3 , 0 )
741
811
dm_simulator = DensityMatrixSimulator (3 , 0 )
742
812
oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), all_gates_qasm, Dict (" theta" => 0.665 ))
743
813
simulate (sv_simulator, oq3_program, 100 )
744
814
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 )
745
817
746
818
sv_simulator = StateVectorSimulator (2 , 0 )
747
819
dm_simulator = DensityMatrixSimulator (2 , 0 )
748
820
sv_oq3_program = OpenQasmProgram (braketSchemaHeader (" braket.ir.openqasm.program" , " 1" ), sv_exact_results_qasm, nothing )
749
821
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 )
754
826
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 )
759
831
end
760
832
end
761
833
end # module BraketSimulator
0 commit comments