qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +7 -1
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +98 -130
- qiskit/qpy/binary_io/schedules.py +69 -439
- qiskit/qpy/binary_io/value.py +154 -31
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +34 -81
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -17,7 +17,9 @@ to run on the simulator. It is exponential in the number of qubits.
|
|
17
17
|
|
18
18
|
The simulator is run using
|
19
19
|
|
20
|
-
..
|
20
|
+
.. plot::
|
21
|
+
:include-source:
|
22
|
+
:nofigs:
|
21
23
|
|
22
24
|
BasicSimulator().run(run_input)
|
23
25
|
|
@@ -41,14 +43,10 @@ import numpy as np
|
|
41
43
|
from qiskit.circuit import QuantumCircuit
|
42
44
|
from qiskit.circuit.library import UnitaryGate
|
43
45
|
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping, GlobalPhaseGate
|
44
|
-
from qiskit.providers import Provider
|
45
46
|
from qiskit.providers.backend import BackendV2
|
46
|
-
from qiskit.providers.models.backendconfiguration import BackendConfiguration
|
47
47
|
from qiskit.providers.options import Options
|
48
|
-
from qiskit.qobj import QasmQobj, QasmQobjConfig, QasmQobjExperiment
|
49
48
|
from qiskit.result import Result
|
50
49
|
from qiskit.transpiler import Target
|
51
|
-
from qiskit.utils.deprecation import deprecate_func
|
52
50
|
|
53
51
|
from .basic_provider_job import BasicProviderJob
|
54
52
|
from .basic_provider_tools import single_gate_matrix
|
@@ -74,14 +72,13 @@ class BasicSimulator(BackendV2):
|
|
74
72
|
|
75
73
|
def __init__(
|
76
74
|
self,
|
77
|
-
provider
|
75
|
+
provider=None,
|
78
76
|
target: Target | None = None,
|
79
77
|
**fields,
|
80
78
|
) -> None:
|
81
79
|
"""
|
82
80
|
Args:
|
83
|
-
provider: An optional backwards reference to the
|
84
|
-
:class:`~qiskit.providers.Provider` object that the backend
|
81
|
+
provider: An optional backwards reference to the provider object that the backend
|
85
82
|
is from.
|
86
83
|
target: An optional target to configure the simulator.
|
87
84
|
fields: kwargs for the values to use to override the default
|
@@ -95,27 +92,24 @@ class BasicSimulator(BackendV2):
|
|
95
92
|
super().__init__(
|
96
93
|
provider=provider,
|
97
94
|
name="basic_simulator",
|
98
|
-
description="A
|
95
|
+
description="A Python simulator for basic quantum experiments",
|
99
96
|
backend_version="0.1",
|
100
97
|
**fields,
|
101
98
|
)
|
102
99
|
|
103
100
|
self._target = target
|
104
|
-
self._configuration = None
|
105
101
|
|
106
102
|
# Internal simulator variables
|
107
|
-
self._local_random = None
|
108
103
|
self._classical_memory = 0
|
109
|
-
self._classical_register = 0
|
110
104
|
self._statevector = 0
|
111
105
|
self._number_of_cmembits = 0
|
112
106
|
self._number_of_qubits = 0
|
113
|
-
self.
|
114
|
-
self._memory = False
|
115
|
-
self._initial_statevector = self.options.get("initial_statevector")
|
116
|
-
self._chop_threshold = self.options.get("chop_threashold")
|
117
|
-
self._qobj_config = None
|
107
|
+
self._local_rng = None
|
118
108
|
self._sample_measure = False
|
109
|
+
self._shots = self.options.get("shots")
|
110
|
+
self._memory = self.options.get("memory")
|
111
|
+
self._initial_statevector = self.options.get("initial_statevector")
|
112
|
+
self._seed_simulator = self.options.get("seed_simulator")
|
119
113
|
|
120
114
|
@property
|
121
115
|
def max_circuits(self) -> None:
|
@@ -129,7 +123,7 @@ class BasicSimulator(BackendV2):
|
|
129
123
|
|
130
124
|
def _build_basic_target(self) -> Target:
|
131
125
|
"""Helper method that returns a minimal target with a basis gate set but
|
132
|
-
no coupling map
|
126
|
+
no coupling map or instruction properties.
|
133
127
|
|
134
128
|
Returns:
|
135
129
|
The configured target.
|
@@ -213,76 +207,13 @@ class BasicSimulator(BackendV2):
|
|
213
207
|
)
|
214
208
|
return target
|
215
209
|
|
216
|
-
@deprecate_func(
|
217
|
-
since="1.3.0",
|
218
|
-
removal_timeline="in Qiskit 2.0.0",
|
219
|
-
additional_msg="The `BackendConfiguration` class is part of the deprecated `BackendV1` "
|
220
|
-
"workflow, and no longer necessary for `BackendV2`. The individual configuration elements "
|
221
|
-
"can be retrieved directly from the backend or from the contained `Target` instance "
|
222
|
-
"(`backend.target)`).",
|
223
|
-
)
|
224
|
-
def configuration(self) -> BackendConfiguration:
|
225
|
-
"""Return the simulator backend configuration.
|
226
|
-
|
227
|
-
Returns:
|
228
|
-
The configuration for the backend.
|
229
|
-
"""
|
230
|
-
# Note: this is a custom attribute of the BasicSimulator class and
|
231
|
-
# not part of the BackendV2 interface. It has only been added for
|
232
|
-
# compatibility with the `assemble` function (currently used in `run`),
|
233
|
-
# which still relies on legacy BackendV1 attributes. Once the internal
|
234
|
-
# use of `assemble` is resolved, this attribute will no longer be
|
235
|
-
# necessary.
|
236
|
-
|
237
|
-
if self._configuration:
|
238
|
-
return self._configuration
|
239
|
-
|
240
|
-
gates = [
|
241
|
-
{
|
242
|
-
"name": name,
|
243
|
-
"parameters": self.target.operation_from_name(name).params,
|
244
|
-
}
|
245
|
-
for name in self.target.operation_names
|
246
|
-
]
|
247
|
-
|
248
|
-
with warnings.catch_warnings():
|
249
|
-
# TODO Provider models are deprecated
|
250
|
-
# https://github.com/Qiskit/qiskit/issues/12843
|
251
|
-
warnings.filterwarnings(
|
252
|
-
"ignore",
|
253
|
-
category=DeprecationWarning,
|
254
|
-
message=r".+qiskit\.providers\.models\.backendconfiguration\..+",
|
255
|
-
)
|
256
|
-
self._configuration = BackendConfiguration(
|
257
|
-
backend_name=self.name,
|
258
|
-
backend_version=self.backend_version,
|
259
|
-
n_qubits=self.num_qubits,
|
260
|
-
basis_gates=list(self.target.operation_names),
|
261
|
-
gates=gates,
|
262
|
-
local=True,
|
263
|
-
simulator=True,
|
264
|
-
conditional=True,
|
265
|
-
open_pulse=False,
|
266
|
-
memory=True,
|
267
|
-
# This max_shots is used by the assembler, setting it to 0
|
268
|
-
# to maintain the behavior from the previous implementation.
|
269
|
-
# Not related to the actual shots set in the backend options
|
270
|
-
max_shots=0,
|
271
|
-
coupling_map=None,
|
272
|
-
description="A python simulator for quantum experiments",
|
273
|
-
)
|
274
|
-
return self._configuration
|
275
|
-
|
276
210
|
@classmethod
|
277
211
|
def _default_options(cls) -> Options:
|
278
212
|
return Options(
|
279
213
|
shots=1024,
|
280
|
-
memory=
|
214
|
+
memory=True,
|
281
215
|
initial_statevector=None,
|
282
|
-
chop_threshold=1e-15,
|
283
|
-
allow_sample_measuring=True,
|
284
216
|
seed_simulator=None,
|
285
|
-
parameter_binds=None,
|
286
217
|
)
|
287
218
|
|
288
219
|
def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
|
@@ -307,7 +238,7 @@ class BasicSimulator(BackendV2):
|
|
307
238
|
"""Simulate the outcome of measurement of a qubit.
|
308
239
|
|
309
240
|
Args:
|
310
|
-
qubit: the qubit to measure
|
241
|
+
qubit: index indicating the qubit to measure
|
311
242
|
|
312
243
|
Return:
|
313
244
|
pair (outcome, probability) where outcome is '0' or '1' and
|
@@ -318,14 +249,14 @@ class BasicSimulator(BackendV2):
|
|
318
249
|
axis.remove(self._number_of_qubits - 1 - qubit)
|
319
250
|
probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
|
320
251
|
# Compute einsum index string for 1-qubit matrix multiplication
|
321
|
-
random_number = self.
|
252
|
+
random_number = self._local_rng.random()
|
322
253
|
if random_number < probabilities[0]:
|
323
254
|
return "0", probabilities[0]
|
324
255
|
# Else outcome was '1'
|
325
256
|
return "1", probabilities[1]
|
326
257
|
|
327
258
|
def _add_sample_measure(
|
328
|
-
self, measure_params: list[
|
259
|
+
self, measure_params: list[tuple[int, int]], num_samples: int
|
329
260
|
) -> list[hex]:
|
330
261
|
"""Generate memory samples from current statevector.
|
331
262
|
|
@@ -339,7 +270,7 @@ class BasicSimulator(BackendV2):
|
|
339
270
|
"""
|
340
271
|
# Get unique qubits that are actually measured and sort in
|
341
272
|
# ascending order
|
342
|
-
measured_qubits = sorted({qubit for qubit,
|
273
|
+
measured_qubits = sorted({qubit for qubit, _ in measure_params})
|
343
274
|
num_measured = len(measured_qubits)
|
344
275
|
# We use the axis kwarg for numpy.sum to compute probabilities
|
345
276
|
# this sums over all non-measured qubits to return a vector
|
@@ -355,7 +286,7 @@ class BasicSimulator(BackendV2):
|
|
355
286
|
# Generate samples on measured qubits as ints with qubit
|
356
287
|
# position in the bit-string for each int given by the qubit
|
357
288
|
# position in the sorted measured_qubits list
|
358
|
-
samples = self.
|
289
|
+
samples = self._local_rng.choice(range(2**num_measured), num_samples, p=probabilities)
|
359
290
|
# Convert the ints to bitstrings
|
360
291
|
memory = []
|
361
292
|
for sample in samples:
|
@@ -369,13 +300,12 @@ class BasicSimulator(BackendV2):
|
|
369
300
|
memory.append(hex(int(value, 2)))
|
370
301
|
return memory
|
371
302
|
|
372
|
-
def _add_measure(self, qubit: int, cmembit: int
|
303
|
+
def _add_measure(self, qubit: int, cmembit: int) -> None:
|
373
304
|
"""Apply a measure instruction to a qubit.
|
374
305
|
|
375
306
|
Args:
|
376
|
-
qubit:
|
377
|
-
cmembit:
|
378
|
-
cregbit: is the classical register bit to store outcome in.
|
307
|
+
qubit: index of the qubit measured.
|
308
|
+
cmembit: index of the classical memory bit to store outcome in.
|
379
309
|
"""
|
380
310
|
# get measure outcome
|
381
311
|
outcome, probability = self._get_measure_outcome(qubit)
|
@@ -383,12 +313,6 @@ class BasicSimulator(BackendV2):
|
|
383
313
|
membit = 1 << cmembit
|
384
314
|
self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
|
385
315
|
|
386
|
-
if cregbit is not None:
|
387
|
-
regbit = 1 << cregbit
|
388
|
-
self._classical_register = (self._classical_register & (~regbit)) | (
|
389
|
-
int(outcome) << cregbit
|
390
|
-
)
|
391
|
-
|
392
316
|
# update quantum state
|
393
317
|
if outcome == "0":
|
394
318
|
update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
|
@@ -430,38 +354,35 @@ class BasicSimulator(BackendV2):
|
|
430
354
|
f"initial statevector is incorrect length: {length} != {required_dim}"
|
431
355
|
)
|
432
356
|
|
433
|
-
def
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
357
|
+
def _set_run_options(self, run_options: dict | None = None) -> None:
|
358
|
+
"""Set the backend run options for all circuits"""
|
359
|
+
|
360
|
+
# Reset internal variables every time "run" is called using saved options
|
361
|
+
self._shots = self.options.get("shots")
|
362
|
+
self._memory = self.options.get("memory")
|
438
363
|
self._initial_statevector = self.options.get("initial_statevector")
|
439
|
-
self.
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
# then config second
|
445
|
-
if (
|
446
|
-
"initial_statevector" in backend_options
|
447
|
-
and backend_options["initial_statevector"] is not None
|
448
|
-
):
|
449
|
-
self._initial_statevector = np.array(
|
450
|
-
backend_options["initial_statevector"], dtype=complex
|
451
|
-
)
|
452
|
-
elif hasattr(qobj_config, "initial_statevector"):
|
453
|
-
self._initial_statevector = np.array(qobj_config.initial_statevector, dtype=complex)
|
364
|
+
self._seed_simulator = self.options.get("seed_simulator")
|
365
|
+
|
366
|
+
# Apply custom run options
|
367
|
+
if run_options.get("initial_statevector", None) is not None:
|
368
|
+
self._initial_statevector = np.array(run_options["initial_statevector"], dtype=complex)
|
454
369
|
if self._initial_statevector is not None:
|
455
370
|
# Check the initial statevector is normalized
|
456
371
|
norm = np.linalg.norm(self._initial_statevector)
|
457
372
|
if round(norm, 12) != 1:
|
458
|
-
raise BasicProviderError(f"
|
459
|
-
|
460
|
-
|
461
|
-
if "
|
462
|
-
self.
|
463
|
-
elif
|
464
|
-
|
373
|
+
raise BasicProviderError(f"Initial statevector is not normalized: norm {norm} != 1")
|
374
|
+
if "shots" in run_options:
|
375
|
+
self._shots = run_options["shots"]
|
376
|
+
if "seed_simulator" in run_options:
|
377
|
+
self._seed_simulator = run_options["seed_simulator"]
|
378
|
+
elif self._seed_simulator is None:
|
379
|
+
# For compatibility on Windows force dtype to be int32
|
380
|
+
# and set the maximum value to be (2 ** 31) - 1
|
381
|
+
self._seed_simulator = np.random.randint(2147483647, dtype="int32")
|
382
|
+
if "memory" in run_options:
|
383
|
+
self._memory = run_options["memory"]
|
384
|
+
# Set seed for local random number gen.
|
385
|
+
self._local_rng = np.random.default_rng(seed=self._seed_simulator)
|
465
386
|
|
466
387
|
def _initialize_statevector(self) -> None:
|
467
388
|
"""Set the initial statevector for simulation"""
|
@@ -474,28 +395,14 @@ class BasicSimulator(BackendV2):
|
|
474
395
|
# Reshape to rank-N tensor
|
475
396
|
self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
|
476
397
|
|
477
|
-
def _validate_measure_sampling(self,
|
478
|
-
"""Determine if measure sampling is allowed for an experiment
|
479
|
-
|
480
|
-
Args:
|
481
|
-
experiment: a qobj experiment.
|
482
|
-
"""
|
398
|
+
def _validate_measure_sampling(self, circuit: QuantumCircuit) -> None:
|
399
|
+
"""Determine if measure sampling is allowed for an experiment"""
|
400
|
+
measure_flag = False
|
483
401
|
# If shots=1 we should disable measure sampling.
|
484
402
|
# This is also required for statevector simulator to return the
|
485
403
|
# correct final statevector without silently dropping final measurements.
|
486
|
-
if self._shots
|
487
|
-
|
488
|
-
return
|
489
|
-
|
490
|
-
# Check for config flag
|
491
|
-
if hasattr(experiment.config, "allows_measure_sampling"):
|
492
|
-
self._sample_measure = experiment.config.allows_measure_sampling
|
493
|
-
# If flag isn't found do a simple test to see if a circuit contains
|
494
|
-
# no reset instructions, and no gates instructions after
|
495
|
-
# the first measure.
|
496
|
-
else:
|
497
|
-
measure_flag = False
|
498
|
-
for instruction in experiment.instructions:
|
404
|
+
if self._shots > 1:
|
405
|
+
for instruction in circuit.data:
|
499
406
|
# If circuit contains reset operations we cannot sample
|
500
407
|
if instruction.name == "reset":
|
501
408
|
self._sample_measure = False
|
@@ -510,114 +417,112 @@ class BasicSimulator(BackendV2):
|
|
510
417
|
return
|
511
418
|
elif instruction.name == "measure":
|
512
419
|
measure_flag = True
|
513
|
-
|
514
|
-
# measure sampling is allowed
|
515
|
-
self._sample_measure = True
|
420
|
+
self._sample_measure = measure_flag
|
516
421
|
|
517
422
|
def run(
|
518
|
-
self, run_input: QuantumCircuit | list[QuantumCircuit], **
|
423
|
+
self, run_input: QuantumCircuit | list[QuantumCircuit], **run_options
|
519
424
|
) -> BasicProviderJob:
|
520
425
|
"""Run on the backend.
|
521
426
|
|
522
427
|
Args:
|
523
|
-
run_input
|
524
|
-
|
428
|
+
run_input (QuantumCircuit or list): the QuantumCircuit (or list
|
429
|
+
of QuantumCircuit objects) to run
|
430
|
+
run_options (kwargs): additional runtime backend options
|
525
431
|
|
526
432
|
Returns:
|
527
433
|
BasicProviderJob: derived from BaseJob
|
528
434
|
|
529
435
|
Additional Information:
|
530
|
-
|
531
|
-
|
436
|
+
* kwarg options specified in ``run_options`` will temporarily override
|
437
|
+
any set options of the same name for the current run. These may include:
|
438
|
+
|
439
|
+
* "initial_statevector": vector-like. The "initial_statevector"
|
440
|
+
option specifies a custom initial statevector to be used instead
|
441
|
+
of the all-zero state. The size of this vector must correspond to
|
442
|
+
the number of qubits in the ``run_input`` argument.
|
443
|
+
|
444
|
+
* "seed_simulator": int. This is the internal seed for sample
|
445
|
+
generation.
|
532
446
|
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
447
|
+
* "shots": int. Number of shots used in the simulation.
|
448
|
+
|
449
|
+
* "memory": bool. If True, the result will contain the results
|
450
|
+
of every individual shot simulation.
|
537
451
|
|
538
452
|
Example::
|
539
453
|
|
540
|
-
|
541
|
-
|
542
|
-
|
454
|
+
backend.run(
|
455
|
+
circuit_2q,
|
456
|
+
initial_statevector = np.array([1, 0, 0, 1j]) / math.sqrt(2)
|
457
|
+
)
|
543
458
|
"""
|
544
|
-
# TODO: replace assemble with new run flow. If this is not achieved before 2.0,
|
545
|
-
# see removal note on `def _assemble`, L192 of qiskit/compiler/assembler.py
|
546
|
-
from qiskit.compiler.assembler import _assemble
|
547
|
-
|
548
459
|
out_options = {}
|
549
|
-
for key, value in
|
460
|
+
for key, value in run_options.items():
|
550
461
|
if not hasattr(self.options, key):
|
551
462
|
warnings.warn(
|
552
463
|
f"Option {key} is not used by this backend", UserWarning, stacklevel=2
|
553
464
|
)
|
554
465
|
else:
|
555
466
|
out_options[key] = value
|
556
|
-
|
557
|
-
qobj_options = qobj.config
|
558
|
-
self._set_options(qobj_config=qobj_options, backend_options=backend_options)
|
467
|
+
self._set_run_options(run_options=run_options)
|
559
468
|
job_id = str(uuid.uuid4())
|
560
|
-
job = BasicProviderJob(self, job_id, self._run_job(job_id,
|
469
|
+
job = BasicProviderJob(self, job_id, self._run_job(job_id, run_input))
|
561
470
|
return job
|
562
471
|
|
563
|
-
def _run_job(self, job_id: str,
|
564
|
-
"""Run
|
472
|
+
def _run_job(self, job_id: str, run_input) -> Result:
|
473
|
+
"""Run circuits in run_input.
|
565
474
|
|
566
475
|
Args:
|
567
476
|
job_id: unique id for the job.
|
568
|
-
|
477
|
+
run_input: circuits to be run.
|
569
478
|
|
570
479
|
Returns:
|
571
480
|
Result object
|
572
481
|
"""
|
573
|
-
|
482
|
+
if isinstance(run_input, QuantumCircuit):
|
483
|
+
run_input = [run_input]
|
484
|
+
|
485
|
+
self._validate(run_input)
|
574
486
|
result_list = []
|
575
|
-
self._shots = qobj.config.shots
|
576
|
-
self._memory = getattr(qobj.config, "memory", False)
|
577
|
-
self._qobj_config = qobj.config
|
578
487
|
start = time.time()
|
579
|
-
|
580
|
-
|
581
|
-
"ignore",
|
582
|
-
category=DeprecationWarning,
|
583
|
-
message=r".+qiskit\.providers\.basic_provider\.basic_simulator\..+",
|
584
|
-
)
|
585
|
-
for experiment in qobj.experiments:
|
586
|
-
result_list.append(self.run_experiment(experiment))
|
488
|
+
for circuit in run_input:
|
489
|
+
result_list.append(self._run_circuit(circuit))
|
587
490
|
end = time.time()
|
588
491
|
result = {
|
589
492
|
"backend_name": self.name,
|
590
493
|
"backend_version": self.backend_version,
|
591
|
-
"qobj_id": qobj.qobj_id,
|
592
494
|
"job_id": job_id,
|
593
495
|
"results": result_list,
|
594
496
|
"status": "COMPLETED",
|
595
497
|
"success": True,
|
596
498
|
"time_taken": (end - start),
|
597
|
-
"header": qobj.header.to_dict(),
|
598
499
|
}
|
500
|
+
|
599
501
|
return Result.from_dict(result)
|
600
502
|
|
601
|
-
|
602
|
-
|
603
|
-
removal_timeline="in Qiskit 2.0.0",
|
604
|
-
additional_msg="This method takes a `QasmQobjExperiment` as input argument. "
|
605
|
-
"The `Qobj` class and related functionality are part of the deprecated "
|
606
|
-
"`BackendV1` workflow, and no longer necessary for `BackendV2`. Use `run` instead.",
|
607
|
-
)
|
608
|
-
def run_experiment(self, experiment: QasmQobjExperiment) -> dict[str, ...]:
|
609
|
-
"""Run an experiment (circuit) and return a single experiment result.
|
503
|
+
def _run_circuit(self, circuit) -> dict:
|
504
|
+
"""Simulate a single circuit run.
|
610
505
|
|
611
506
|
Args:
|
612
|
-
|
507
|
+
circuit: circuit to be run.
|
613
508
|
|
614
509
|
Returns:
|
615
510
|
A result dictionary which looks something like::
|
616
|
-
|
617
511
|
{
|
618
|
-
"name": name of this experiment
|
512
|
+
"name": name of this experiment
|
619
513
|
"seed": random seed used for simulation
|
620
514
|
"shots": number of shots used in the simulation
|
515
|
+
"header": {
|
516
|
+
"name": "circuit-206",
|
517
|
+
"n_qubits": 3,
|
518
|
+
"qreg_sizes": [['qr', 3]],
|
519
|
+
"creg_sizes": [['cr', 3]],
|
520
|
+
"qubit_labels": [['qr', 0], ['qr', 1], ['qr', 2]],
|
521
|
+
"clbit_labels": [['cr', 0], ['cr', 1], ['cr', 2]],
|
522
|
+
"memory_slots": 3,
|
523
|
+
"global_phase": 0.0,
|
524
|
+
"metadata": {},
|
525
|
+
}
|
621
526
|
"data":
|
622
527
|
{
|
623
528
|
"counts": {'0x9: 5, ...},
|
@@ -631,30 +536,17 @@ class BasicSimulator(BackendV2):
|
|
631
536
|
BasicProviderError: if an error occurred.
|
632
537
|
"""
|
633
538
|
start = time.time()
|
634
|
-
|
635
|
-
self.
|
539
|
+
|
540
|
+
self._number_of_qubits = circuit.num_qubits
|
541
|
+
self._number_of_cmembits = circuit.num_clbits
|
636
542
|
self._statevector = 0
|
637
543
|
self._classical_memory = 0
|
638
|
-
self._classical_register = 0
|
639
|
-
self._sample_measure = False
|
640
|
-
global_phase = experiment.header.global_phase
|
641
544
|
|
642
545
|
# Validate the dimension of initial statevector if set
|
643
546
|
self._validate_initial_statevector()
|
644
547
|
|
645
|
-
# Get the seed looking in circuit, qobj, and then random.
|
646
|
-
if hasattr(experiment.config, "seed_simulator"):
|
647
|
-
seed_simulator = experiment.config.seed_simulator
|
648
|
-
elif hasattr(self._qobj_config, "seed_simulator"):
|
649
|
-
seed_simulator = self._qobj_config.seed_simulator
|
650
|
-
else:
|
651
|
-
# For compatibility on Windows force dyte to be int32
|
652
|
-
# and set the maximum value to be (2 ** 31) - 1
|
653
|
-
seed_simulator = np.random.randint(2147483647, dtype="int32")
|
654
|
-
|
655
|
-
self._local_random = np.random.default_rng(seed=seed_simulator)
|
656
548
|
# Check if measure sampling is supported for current circuit
|
657
|
-
self._validate_measure_sampling(
|
549
|
+
self._validate_measure_sampling(circuit)
|
658
550
|
|
659
551
|
# List of final counts for all shots
|
660
552
|
memory = []
|
@@ -667,31 +559,18 @@ class BasicSimulator(BackendV2):
|
|
667
559
|
measure_sample_ops = []
|
668
560
|
else:
|
669
561
|
shots = self._shots
|
562
|
+
|
670
563
|
for _ in range(shots):
|
671
564
|
self._initialize_statevector()
|
672
565
|
# apply global_phase
|
673
|
-
self._statevector *= np.exp(1j * global_phase)
|
566
|
+
self._statevector *= np.exp(1j * circuit.global_phase)
|
674
567
|
# Initialize classical memory to all 0
|
675
568
|
self._classical_memory = 0
|
676
|
-
|
677
|
-
for operation in
|
678
|
-
conditional = getattr(operation, "conditional", None)
|
679
|
-
if isinstance(conditional, int):
|
680
|
-
conditional_bit_set = (self._classical_register >> conditional) & 1
|
681
|
-
if not conditional_bit_set:
|
682
|
-
continue
|
683
|
-
elif conditional is not None:
|
684
|
-
mask = int(operation.conditional.mask, 16)
|
685
|
-
if mask > 0:
|
686
|
-
value = self._classical_memory & mask
|
687
|
-
while (mask & 0x1) == 0:
|
688
|
-
mask >>= 1
|
689
|
-
value >>= 1
|
690
|
-
if value != int(operation.conditional.val, 16):
|
691
|
-
continue
|
569
|
+
|
570
|
+
for operation in circuit.data:
|
692
571
|
if operation.name == "unitary":
|
693
|
-
qubits = operation.qubits
|
694
|
-
gate = operation.params[0]
|
572
|
+
qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
|
573
|
+
gate = operation.operation.params[0]
|
695
574
|
self._add_unitary(gate, qubits)
|
696
575
|
elif operation.name in ("id", "u0", "delay"):
|
697
576
|
pass
|
@@ -702,83 +581,50 @@ class BasicSimulator(BackendV2):
|
|
702
581
|
# Check if single qubit gate
|
703
582
|
elif operation.name in SINGLE_QUBIT_GATES:
|
704
583
|
params = getattr(operation, "params", None)
|
705
|
-
qubit = operation.qubits[0]
|
584
|
+
qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
|
706
585
|
gate = single_gate_matrix(operation.name, params)
|
707
586
|
self._add_unitary(gate, [qubit])
|
708
587
|
elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
|
709
588
|
params = getattr(operation, "params", None)
|
710
|
-
|
711
|
-
|
589
|
+
qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
|
590
|
+
qubit0 = qubits[0]
|
591
|
+
qubit1 = qubits[1]
|
712
592
|
gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
|
713
593
|
self._add_unitary(gate, [qubit0, qubit1])
|
714
594
|
elif operation.name in ("id", "u0"):
|
715
595
|
pass
|
716
596
|
elif operation.name in TWO_QUBIT_GATES:
|
717
|
-
|
718
|
-
|
597
|
+
qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
|
598
|
+
qubit0 = qubits[0]
|
599
|
+
qubit1 = qubits[1]
|
719
600
|
gate = TWO_QUBIT_GATES[operation.name]
|
720
601
|
self._add_unitary(gate, [qubit0, qubit1])
|
721
602
|
elif operation.name in THREE_QUBIT_GATES:
|
722
|
-
|
723
|
-
|
724
|
-
|
603
|
+
qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
|
604
|
+
qubit0 = qubits[0]
|
605
|
+
qubit1 = qubits[1]
|
606
|
+
qubit2 = qubits[2]
|
725
607
|
gate = THREE_QUBIT_GATES[operation.name]
|
726
608
|
self._add_unitary(gate, [qubit0, qubit1, qubit2])
|
727
609
|
# Check if reset
|
728
610
|
elif operation.name == "reset":
|
729
|
-
|
611
|
+
qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
|
612
|
+
qubit = qubits[0]
|
730
613
|
self._add_reset(qubit)
|
731
614
|
# Check if barrier
|
732
615
|
elif operation.name == "barrier":
|
733
616
|
pass
|
734
617
|
# Check if measure
|
735
618
|
elif operation.name == "measure":
|
736
|
-
qubit = operation.qubits[0]
|
737
|
-
cmembit = operation.
|
738
|
-
cregbit = operation.register[0] if hasattr(operation, "register") else None
|
739
|
-
|
619
|
+
qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
|
620
|
+
cmembit = [circuit.find_bit(bit).index for bit in operation.clbits][0]
|
740
621
|
if self._sample_measure:
|
741
622
|
# If sampling measurements record the qubit and cmembit
|
742
623
|
# for this measurement for later sampling
|
743
624
|
measure_sample_ops.append((qubit, cmembit))
|
744
625
|
else:
|
745
626
|
# If not sampling perform measurement as normal
|
746
|
-
self._add_measure(qubit, cmembit
|
747
|
-
elif operation.name == "bfunc":
|
748
|
-
mask = int(operation.mask, 16)
|
749
|
-
relation = operation.relation
|
750
|
-
val = int(operation.val, 16)
|
751
|
-
|
752
|
-
cregbit = operation.register
|
753
|
-
cmembit = operation.memory if hasattr(operation, "memory") else None
|
754
|
-
|
755
|
-
compared = (self._classical_register & mask) - val
|
756
|
-
|
757
|
-
if relation == "==":
|
758
|
-
outcome = compared == 0
|
759
|
-
elif relation == "!=":
|
760
|
-
outcome = compared != 0
|
761
|
-
elif relation == "<":
|
762
|
-
outcome = compared < 0
|
763
|
-
elif relation == "<=":
|
764
|
-
outcome = compared <= 0
|
765
|
-
elif relation == ">":
|
766
|
-
outcome = compared > 0
|
767
|
-
elif relation == ">=":
|
768
|
-
outcome = compared >= 0
|
769
|
-
else:
|
770
|
-
raise BasicProviderError("Invalid boolean function relation.")
|
771
|
-
|
772
|
-
# Store outcome in register and optionally memory slot
|
773
|
-
regbit = 1 << cregbit
|
774
|
-
self._classical_register = (self._classical_register & (~regbit)) | (
|
775
|
-
int(outcome) << cregbit
|
776
|
-
)
|
777
|
-
if cmembit is not None:
|
778
|
-
membit = 1 << cmembit
|
779
|
-
self._classical_memory = (self._classical_memory & (~membit)) | (
|
780
|
-
int(outcome) << cmembit
|
781
|
-
)
|
627
|
+
self._add_measure(qubit, cmembit)
|
782
628
|
else:
|
783
629
|
backend = self.name
|
784
630
|
err_msg = '{0} encountered unrecognized operation "{1}"'
|
@@ -794,39 +640,53 @@ class BasicSimulator(BackendV2):
|
|
794
640
|
outcome = bin(self._classical_memory)[2:]
|
795
641
|
memory.append(hex(int(outcome, 2)))
|
796
642
|
|
797
|
-
# Add data
|
643
|
+
# Add counts to result data
|
798
644
|
data = {"counts": dict(Counter(memory))}
|
799
|
-
# Optionally add memory list
|
645
|
+
# Optionally, add memory list to result data
|
800
646
|
if self._memory:
|
801
647
|
data["memory"] = memory
|
802
648
|
end = time.time()
|
649
|
+
|
650
|
+
# Define header to be used by Result class to interpret counts
|
651
|
+
header = {
|
652
|
+
"name": circuit.name,
|
653
|
+
"n_qubits": circuit.num_qubits,
|
654
|
+
"qreg_sizes": [[qreg.name, qreg.size] for qreg in circuit.qregs],
|
655
|
+
"creg_sizes": [[creg.name, creg.size] for creg in circuit.cregs],
|
656
|
+
"qubit_labels": [[qreg.name, j] for qreg in circuit.qregs for j in range(qreg.size)],
|
657
|
+
"clbit_labels": [[creg.name, j] for creg in circuit.cregs for j in range(creg.size)],
|
658
|
+
"memory_slots": circuit.num_clbits,
|
659
|
+
"global_phase": circuit.global_phase,
|
660
|
+
"metadata": circuit.metadata if circuit.metadata is not None else {},
|
661
|
+
}
|
662
|
+
# Return result dictionary
|
803
663
|
return {
|
804
|
-
"name":
|
805
|
-
"seed_simulator":
|
664
|
+
"name": circuit.name,
|
665
|
+
"seed_simulator": self._seed_simulator,
|
806
666
|
"shots": self._shots,
|
807
667
|
"data": data,
|
808
668
|
"status": "DONE",
|
809
669
|
"success": True,
|
670
|
+
"header": header,
|
810
671
|
"time_taken": (end - start),
|
811
|
-
"header": experiment.header.to_dict(),
|
812
672
|
}
|
813
673
|
|
814
|
-
def _validate(self,
|
815
|
-
"""Semantic validations of the
|
816
|
-
n_qubits = qobj.config.n_qubits
|
674
|
+
def _validate(self, run_input: list[QuantumCircuit]) -> None:
|
675
|
+
"""Semantic validations of the input."""
|
817
676
|
max_qubits = self.MAX_QUBITS_MEMORY
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
677
|
+
|
678
|
+
for circuit in run_input:
|
679
|
+
if circuit.num_qubits > max_qubits:
|
680
|
+
raise BasicProviderError(
|
681
|
+
f"Number of qubits {circuit.num_qubits} is greater than maximum ({max_qubits}) "
|
682
|
+
f'for "{self.name}".'
|
683
|
+
)
|
684
|
+
name = circuit.name
|
685
|
+
if len(circuit.cregs) == 0:
|
826
686
|
logger.warning(
|
827
687
|
'No classical registers in circuit "%s", counts will be empty.', name
|
828
688
|
)
|
829
|
-
elif "measure" not in [op.name for op in
|
689
|
+
elif "measure" not in [op.name for op in circuit.data]:
|
830
690
|
logger.warning(
|
831
691
|
'No measurements in circuit "%s", classical register will remain all zeros.',
|
832
692
|
name,
|