qiskit 1.3.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 -0
- qiskit/__init__.py +146 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +50 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +215 -0
- qiskit/circuit/library/graph_state.py +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +262 -0
- qiskit/circuit/library/standard_gates/z.py +348 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +173 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +667 -0
- qiskit/providers/backend_compat.py +472 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +821 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +305 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1988 -0
- qiskit/pulse/library/waveform.py +136 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -0
- qiskit/pulse/utils.py +149 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +897 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +475 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +865 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +845 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1290 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +312 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
- qiskit/transpiler/passes/optimization/__init__.py +43 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +86 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1319 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +727 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +308 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +458 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,821 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Contains a (slow) Python simulator.
|
14
|
+
|
15
|
+
It simulates a quantum circuit (an experiment) that has been compiled
|
16
|
+
to run on the simulator. It is exponential in the number of qubits.
|
17
|
+
|
18
|
+
The simulator is run using
|
19
|
+
|
20
|
+
.. code-block:: python
|
21
|
+
|
22
|
+
BasicSimulator().run(run_input)
|
23
|
+
|
24
|
+
Where the input is a :class:`.QuantumCircuit` object and the output is a
|
25
|
+
:class:`.BasicProviderJob` object,
|
26
|
+
which can later be queried for the Result object. The result will contain a 'memory' data
|
27
|
+
field, which is a result of measurements for each shot.
|
28
|
+
"""
|
29
|
+
|
30
|
+
from __future__ import annotations
|
31
|
+
|
32
|
+
import math
|
33
|
+
import uuid
|
34
|
+
import time
|
35
|
+
import logging
|
36
|
+
import warnings
|
37
|
+
|
38
|
+
from collections import Counter
|
39
|
+
import numpy as np
|
40
|
+
|
41
|
+
from qiskit.circuit import QuantumCircuit
|
42
|
+
from qiskit.circuit.library import UnitaryGate
|
43
|
+
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping, GlobalPhaseGate
|
44
|
+
from qiskit.providers import Provider
|
45
|
+
from qiskit.providers.backend import BackendV2
|
46
|
+
from qiskit.providers.models.backendconfiguration import BackendConfiguration
|
47
|
+
from qiskit.providers.options import Options
|
48
|
+
from qiskit.qobj import QasmQobj, QasmQobjConfig, QasmQobjExperiment
|
49
|
+
from qiskit.result import Result
|
50
|
+
from qiskit.transpiler import Target
|
51
|
+
from qiskit.utils.deprecation import deprecate_func
|
52
|
+
|
53
|
+
from .basic_provider_job import BasicProviderJob
|
54
|
+
from .basic_provider_tools import single_gate_matrix
|
55
|
+
from .basic_provider_tools import (
|
56
|
+
SINGLE_QUBIT_GATES,
|
57
|
+
TWO_QUBIT_GATES,
|
58
|
+
TWO_QUBIT_GATES_WITH_PARAMETERS,
|
59
|
+
THREE_QUBIT_GATES,
|
60
|
+
)
|
61
|
+
from .basic_provider_tools import einsum_vecmul_index
|
62
|
+
from .exceptions import BasicProviderError
|
63
|
+
|
64
|
+
logger = logging.getLogger(__name__)
|
65
|
+
|
66
|
+
|
67
|
+
class BasicSimulator(BackendV2):
|
68
|
+
"""Python implementation of a basic (non-efficient) quantum simulator."""
|
69
|
+
|
70
|
+
# Formerly calculated as `int(log2(local_hardware_info()["memory"]*(1024**3)/16))`.
|
71
|
+
# After the removal of `local_hardware_info()`, it's hardcoded to 24 qubits,
|
72
|
+
# which matches the ~268 MB of required memory.
|
73
|
+
MAX_QUBITS_MEMORY = 24
|
74
|
+
|
75
|
+
def __init__(
|
76
|
+
self,
|
77
|
+
provider: Provider | None = None,
|
78
|
+
target: Target | None = None,
|
79
|
+
**fields,
|
80
|
+
) -> None:
|
81
|
+
"""
|
82
|
+
Args:
|
83
|
+
provider: An optional backwards reference to the
|
84
|
+
:class:`~qiskit.providers.Provider` object that the backend
|
85
|
+
is from.
|
86
|
+
target: An optional target to configure the simulator.
|
87
|
+
fields: kwargs for the values to use to override the default
|
88
|
+
options.
|
89
|
+
|
90
|
+
Raises:
|
91
|
+
AttributeError: If a field is specified that's outside the backend's
|
92
|
+
options.
|
93
|
+
"""
|
94
|
+
|
95
|
+
super().__init__(
|
96
|
+
provider=provider,
|
97
|
+
name="basic_simulator",
|
98
|
+
description="A python simulator for quantum experiments",
|
99
|
+
backend_version="0.1",
|
100
|
+
**fields,
|
101
|
+
)
|
102
|
+
|
103
|
+
self._target = target
|
104
|
+
self._configuration = None
|
105
|
+
|
106
|
+
# Internal simulator variables
|
107
|
+
self._local_random = None
|
108
|
+
self._classical_memory = 0
|
109
|
+
self._classical_register = 0
|
110
|
+
self._statevector = 0
|
111
|
+
self._number_of_cmembits = 0
|
112
|
+
self._number_of_qubits = 0
|
113
|
+
self._shots = 0
|
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
|
118
|
+
self._sample_measure = False
|
119
|
+
|
120
|
+
@property
|
121
|
+
def max_circuits(self) -> None:
|
122
|
+
return None
|
123
|
+
|
124
|
+
@property
|
125
|
+
def target(self) -> Target:
|
126
|
+
if not self._target:
|
127
|
+
self._target = self._build_basic_target()
|
128
|
+
return self._target
|
129
|
+
|
130
|
+
def _build_basic_target(self) -> Target:
|
131
|
+
"""Helper method that returns a minimal target with a basis gate set but
|
132
|
+
no coupling map, instruction properties or calibrations.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
The configured target.
|
136
|
+
"""
|
137
|
+
# Set num_qubits to None to signal the transpiler not to
|
138
|
+
# resize the circuit to fit a specific (potentially too large)
|
139
|
+
# number of qubits. The number of qubits in the circuits given to the
|
140
|
+
# `run` method will determine the size of the simulated statevector.
|
141
|
+
target = Target(
|
142
|
+
description="Basic Target",
|
143
|
+
num_qubits=None,
|
144
|
+
)
|
145
|
+
basis_gates = [
|
146
|
+
"ccx",
|
147
|
+
"ccz",
|
148
|
+
"ch",
|
149
|
+
"cp",
|
150
|
+
"crx",
|
151
|
+
"cry",
|
152
|
+
"crz",
|
153
|
+
"cs",
|
154
|
+
"csdg",
|
155
|
+
"cswap",
|
156
|
+
"csx",
|
157
|
+
"cu",
|
158
|
+
"cu1",
|
159
|
+
"cu3",
|
160
|
+
"cx",
|
161
|
+
"cy",
|
162
|
+
"cz",
|
163
|
+
"dcx",
|
164
|
+
"delay",
|
165
|
+
"ecr",
|
166
|
+
"global_phase",
|
167
|
+
"h",
|
168
|
+
"id",
|
169
|
+
"iswap",
|
170
|
+
"measure",
|
171
|
+
"p",
|
172
|
+
"r",
|
173
|
+
"rccx",
|
174
|
+
"reset",
|
175
|
+
"rx",
|
176
|
+
"rxx",
|
177
|
+
"ry",
|
178
|
+
"ryy",
|
179
|
+
"rz",
|
180
|
+
"rzx",
|
181
|
+
"rzz",
|
182
|
+
"s",
|
183
|
+
"sdg",
|
184
|
+
"swap",
|
185
|
+
"sx",
|
186
|
+
"sxdg",
|
187
|
+
"t",
|
188
|
+
"tdg",
|
189
|
+
"u",
|
190
|
+
"u1",
|
191
|
+
"u2",
|
192
|
+
"u3",
|
193
|
+
"unitary",
|
194
|
+
"x",
|
195
|
+
"xx_minus_yy",
|
196
|
+
"xx_plus_yy",
|
197
|
+
"y",
|
198
|
+
"z",
|
199
|
+
]
|
200
|
+
inst_mapping = get_standard_gate_name_mapping()
|
201
|
+
for name in basis_gates:
|
202
|
+
if name in inst_mapping:
|
203
|
+
instruction = inst_mapping[name]
|
204
|
+
target.add_instruction(instruction, properties=None, name=name)
|
205
|
+
elif name == "unitary":
|
206
|
+
# This is a placeholder for a UnitaryGate instance,
|
207
|
+
# to signal the transpiler not to decompose unitaries
|
208
|
+
# in the circuit.
|
209
|
+
target.add_instruction(UnitaryGate, name="unitary")
|
210
|
+
else:
|
211
|
+
raise BasicProviderError(
|
212
|
+
f"Gate is not a valid basis gate for this simulator: {name}"
|
213
|
+
)
|
214
|
+
return target
|
215
|
+
|
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
|
+
@classmethod
|
277
|
+
def _default_options(cls) -> Options:
|
278
|
+
return Options(
|
279
|
+
shots=1024,
|
280
|
+
memory=False,
|
281
|
+
initial_statevector=None,
|
282
|
+
chop_threshold=1e-15,
|
283
|
+
allow_sample_measuring=True,
|
284
|
+
seed_simulator=None,
|
285
|
+
parameter_binds=None,
|
286
|
+
)
|
287
|
+
|
288
|
+
def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
|
289
|
+
"""Apply an N-qubit unitary matrix.
|
290
|
+
|
291
|
+
Args:
|
292
|
+
gate (matrix_like): an N-qubit unitary matrix
|
293
|
+
qubits (list): the list of N-qubits.
|
294
|
+
"""
|
295
|
+
# Get the number of qubits
|
296
|
+
num_qubits = len(qubits)
|
297
|
+
# Compute einsum index string for 1-qubit matrix multiplication
|
298
|
+
indexes = einsum_vecmul_index(qubits, self._number_of_qubits)
|
299
|
+
# Convert to complex rank-2N tensor
|
300
|
+
gate_tensor = np.reshape(np.array(gate, dtype=complex), num_qubits * [2, 2])
|
301
|
+
# Apply matrix multiplication
|
302
|
+
self._statevector = np.einsum(
|
303
|
+
indexes, gate_tensor, self._statevector, dtype=complex, casting="no"
|
304
|
+
)
|
305
|
+
|
306
|
+
def _get_measure_outcome(self, qubit: int) -> tuple[str, int]:
|
307
|
+
"""Simulate the outcome of measurement of a qubit.
|
308
|
+
|
309
|
+
Args:
|
310
|
+
qubit: the qubit to measure
|
311
|
+
|
312
|
+
Return:
|
313
|
+
pair (outcome, probability) where outcome is '0' or '1' and
|
314
|
+
probability is the probability of the returned outcome.
|
315
|
+
"""
|
316
|
+
# Axis for numpy.sum to compute probabilities
|
317
|
+
axis = list(range(self._number_of_qubits))
|
318
|
+
axis.remove(self._number_of_qubits - 1 - qubit)
|
319
|
+
probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
|
320
|
+
# Compute einsum index string for 1-qubit matrix multiplication
|
321
|
+
random_number = self._local_random.random()
|
322
|
+
if random_number < probabilities[0]:
|
323
|
+
return "0", probabilities[0]
|
324
|
+
# Else outcome was '1'
|
325
|
+
return "1", probabilities[1]
|
326
|
+
|
327
|
+
def _add_sample_measure(
|
328
|
+
self, measure_params: list[list[int, int]], num_samples: int
|
329
|
+
) -> list[hex]:
|
330
|
+
"""Generate memory samples from current statevector.
|
331
|
+
|
332
|
+
Args:
|
333
|
+
measure_params: List of (qubit, cmembit) values for
|
334
|
+
measure instructions to sample.
|
335
|
+
num_samples: The number of memory samples to generate.
|
336
|
+
|
337
|
+
Returns:
|
338
|
+
A list of memory values in hex format.
|
339
|
+
"""
|
340
|
+
# Get unique qubits that are actually measured and sort in
|
341
|
+
# ascending order
|
342
|
+
measured_qubits = sorted({qubit for qubit, cmembit in measure_params})
|
343
|
+
num_measured = len(measured_qubits)
|
344
|
+
# We use the axis kwarg for numpy.sum to compute probabilities
|
345
|
+
# this sums over all non-measured qubits to return a vector
|
346
|
+
# of measure probabilities for the measured qubits
|
347
|
+
axis = list(range(self._number_of_qubits))
|
348
|
+
for qubit in reversed(measured_qubits):
|
349
|
+
# Remove from largest qubit to smallest so list position is correct
|
350
|
+
# with respect to position from end of the list
|
351
|
+
axis.remove(self._number_of_qubits - 1 - qubit)
|
352
|
+
probabilities = np.reshape(
|
353
|
+
np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis)), 2**num_measured
|
354
|
+
)
|
355
|
+
# Generate samples on measured qubits as ints with qubit
|
356
|
+
# position in the bit-string for each int given by the qubit
|
357
|
+
# position in the sorted measured_qubits list
|
358
|
+
samples = self._local_random.choice(range(2**num_measured), num_samples, p=probabilities)
|
359
|
+
# Convert the ints to bitstrings
|
360
|
+
memory = []
|
361
|
+
for sample in samples:
|
362
|
+
classical_memory = self._classical_memory
|
363
|
+
for qubit, cmembit in measure_params:
|
364
|
+
pos = measured_qubits.index(qubit)
|
365
|
+
qubit_outcome = int((sample & (1 << pos)) >> pos)
|
366
|
+
membit = 1 << cmembit
|
367
|
+
classical_memory = (classical_memory & (~membit)) | (qubit_outcome << cmembit)
|
368
|
+
value = bin(classical_memory)[2:]
|
369
|
+
memory.append(hex(int(value, 2)))
|
370
|
+
return memory
|
371
|
+
|
372
|
+
def _add_measure(self, qubit: int, cmembit: int, cregbit: int | None = None) -> None:
|
373
|
+
"""Apply a measure instruction to a qubit.
|
374
|
+
|
375
|
+
Args:
|
376
|
+
qubit: qubit is the qubit measured.
|
377
|
+
cmembit: is the classical memory bit to store outcome in.
|
378
|
+
cregbit: is the classical register bit to store outcome in.
|
379
|
+
"""
|
380
|
+
# get measure outcome
|
381
|
+
outcome, probability = self._get_measure_outcome(qubit)
|
382
|
+
# update classical state
|
383
|
+
membit = 1 << cmembit
|
384
|
+
self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
|
385
|
+
|
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
|
+
# update quantum state
|
393
|
+
if outcome == "0":
|
394
|
+
update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
|
395
|
+
else:
|
396
|
+
update_diag = [[0, 0], [0, 1 / math.sqrt(probability)]]
|
397
|
+
# update classical state
|
398
|
+
self._add_unitary(update_diag, [qubit])
|
399
|
+
|
400
|
+
def _add_reset(self, qubit: int) -> None:
|
401
|
+
"""Apply a reset instruction to a qubit.
|
402
|
+
|
403
|
+
Args:
|
404
|
+
qubit: the qubit being rest
|
405
|
+
|
406
|
+
This is done by doing a simulating a measurement
|
407
|
+
outcome and projecting onto the outcome state while
|
408
|
+
renormalizing.
|
409
|
+
"""
|
410
|
+
# get measure outcome
|
411
|
+
outcome, probability = self._get_measure_outcome(qubit)
|
412
|
+
# update quantum state
|
413
|
+
if outcome == "0":
|
414
|
+
update = [[1 / math.sqrt(probability), 0], [0, 0]]
|
415
|
+
self._add_unitary(update, [qubit])
|
416
|
+
else:
|
417
|
+
update = [[0, 1 / math.sqrt(probability)], [0, 0]]
|
418
|
+
self._add_unitary(update, [qubit])
|
419
|
+
|
420
|
+
def _validate_initial_statevector(self) -> None:
|
421
|
+
"""Validate an initial statevector"""
|
422
|
+
# If the initial statevector isn't set we don't need to validate
|
423
|
+
if self._initial_statevector is None:
|
424
|
+
return
|
425
|
+
# Check statevector is correct length for number of qubits
|
426
|
+
length = len(self._initial_statevector)
|
427
|
+
required_dim = 2**self._number_of_qubits
|
428
|
+
if length != required_dim:
|
429
|
+
raise BasicProviderError(
|
430
|
+
f"initial statevector is incorrect length: {length} != {required_dim}"
|
431
|
+
)
|
432
|
+
|
433
|
+
def _set_options(
|
434
|
+
self, qobj_config: QasmQobjConfig | None = None, backend_options: dict | None = None
|
435
|
+
) -> None:
|
436
|
+
"""Set the backend options for all experiments in a qobj"""
|
437
|
+
# Reset default options
|
438
|
+
self._initial_statevector = self.options.get("initial_statevector")
|
439
|
+
self._chop_threshold = self.options.get("chop_threshold")
|
440
|
+
if "backend_options" in backend_options and backend_options["backend_options"]:
|
441
|
+
backend_options = backend_options["backend_options"]
|
442
|
+
|
443
|
+
# Check for custom initial statevector in backend_options first,
|
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)
|
454
|
+
if self._initial_statevector is not None:
|
455
|
+
# Check the initial statevector is normalized
|
456
|
+
norm = np.linalg.norm(self._initial_statevector)
|
457
|
+
if round(norm, 12) != 1:
|
458
|
+
raise BasicProviderError(f"initial statevector is not normalized: norm {norm} != 1")
|
459
|
+
# Check for custom chop threshold
|
460
|
+
# Replace with custom options
|
461
|
+
if "chop_threshold" in backend_options:
|
462
|
+
self._chop_threshold = backend_options["chop_threshold"]
|
463
|
+
elif hasattr(qobj_config, "chop_threshold"):
|
464
|
+
self._chop_threshold = qobj_config.chop_threshold
|
465
|
+
|
466
|
+
def _initialize_statevector(self) -> None:
|
467
|
+
"""Set the initial statevector for simulation"""
|
468
|
+
if self._initial_statevector is None:
|
469
|
+
# Set to default state of all qubits in |0>
|
470
|
+
self._statevector = np.zeros(2**self._number_of_qubits, dtype=complex)
|
471
|
+
self._statevector[0] = 1
|
472
|
+
else:
|
473
|
+
self._statevector = self._initial_statevector.copy()
|
474
|
+
# Reshape to rank-N tensor
|
475
|
+
self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
|
476
|
+
|
477
|
+
def _validate_measure_sampling(self, experiment: QasmQobjExperiment) -> None:
|
478
|
+
"""Determine if measure sampling is allowed for an experiment
|
479
|
+
|
480
|
+
Args:
|
481
|
+
experiment: a qobj experiment.
|
482
|
+
"""
|
483
|
+
# If shots=1 we should disable measure sampling.
|
484
|
+
# This is also required for statevector simulator to return the
|
485
|
+
# correct final statevector without silently dropping final measurements.
|
486
|
+
if self._shots <= 1:
|
487
|
+
self._sample_measure = False
|
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:
|
499
|
+
# If circuit contains reset operations we cannot sample
|
500
|
+
if instruction.name == "reset":
|
501
|
+
self._sample_measure = False
|
502
|
+
return
|
503
|
+
# If circuit contains a measure option then we can
|
504
|
+
# sample only if all following operations are measures
|
505
|
+
if measure_flag:
|
506
|
+
# If we find a non-measure instruction
|
507
|
+
# we cannot do measure sampling
|
508
|
+
if instruction.name not in ["measure", "barrier", "id", "u0"]:
|
509
|
+
self._sample_measure = False
|
510
|
+
return
|
511
|
+
elif instruction.name == "measure":
|
512
|
+
measure_flag = True
|
513
|
+
# If we made it to the end of the circuit without returning
|
514
|
+
# measure sampling is allowed
|
515
|
+
self._sample_measure = True
|
516
|
+
|
517
|
+
def run(
|
518
|
+
self, run_input: QuantumCircuit | list[QuantumCircuit], **backend_options
|
519
|
+
) -> BasicProviderJob:
|
520
|
+
"""Run on the backend.
|
521
|
+
|
522
|
+
Args:
|
523
|
+
run_input: payload of the experiment
|
524
|
+
backend_options: backend options
|
525
|
+
|
526
|
+
Returns:
|
527
|
+
BasicProviderJob: derived from BaseJob
|
528
|
+
|
529
|
+
Additional Information:
|
530
|
+
backend_options: Is a dict of options for the backend. It may contain
|
531
|
+
* "initial_statevector": vector_like
|
532
|
+
|
533
|
+
The "initial_statevector" option specifies a custom initial
|
534
|
+
initial statevector for the simulator to be used instead of the all
|
535
|
+
zero state. This size of this vector must be correct for the number
|
536
|
+
of qubits in ``run_input`` parameter.
|
537
|
+
|
538
|
+
Example::
|
539
|
+
|
540
|
+
backend_options = {
|
541
|
+
"initial_statevector": np.array([1, 0, 0, 1j]) / math.sqrt(2),
|
542
|
+
}
|
543
|
+
"""
|
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
|
+
out_options = {}
|
549
|
+
for key, value in backend_options.items():
|
550
|
+
if not hasattr(self.options, key):
|
551
|
+
warnings.warn(
|
552
|
+
f"Option {key} is not used by this backend", UserWarning, stacklevel=2
|
553
|
+
)
|
554
|
+
else:
|
555
|
+
out_options[key] = value
|
556
|
+
qobj = _assemble(run_input, self, **out_options)
|
557
|
+
qobj_options = qobj.config
|
558
|
+
self._set_options(qobj_config=qobj_options, backend_options=backend_options)
|
559
|
+
job_id = str(uuid.uuid4())
|
560
|
+
job = BasicProviderJob(self, job_id, self._run_job(job_id, qobj))
|
561
|
+
return job
|
562
|
+
|
563
|
+
def _run_job(self, job_id: str, qobj: QasmQobj) -> Result:
|
564
|
+
"""Run experiments in qobj
|
565
|
+
|
566
|
+
Args:
|
567
|
+
job_id: unique id for the job.
|
568
|
+
qobj: job description
|
569
|
+
|
570
|
+
Returns:
|
571
|
+
Result object
|
572
|
+
"""
|
573
|
+
self._validate(qobj)
|
574
|
+
result_list = []
|
575
|
+
self._shots = qobj.config.shots
|
576
|
+
self._memory = getattr(qobj.config, "memory", False)
|
577
|
+
self._qobj_config = qobj.config
|
578
|
+
start = time.time()
|
579
|
+
for experiment in qobj.experiments:
|
580
|
+
result_list.append(self.run_experiment(experiment))
|
581
|
+
end = time.time()
|
582
|
+
result = {
|
583
|
+
"backend_name": self.name,
|
584
|
+
"backend_version": self.backend_version,
|
585
|
+
"qobj_id": qobj.qobj_id,
|
586
|
+
"job_id": job_id,
|
587
|
+
"results": result_list,
|
588
|
+
"status": "COMPLETED",
|
589
|
+
"success": True,
|
590
|
+
"time_taken": (end - start),
|
591
|
+
"header": qobj.header.to_dict(),
|
592
|
+
}
|
593
|
+
|
594
|
+
return Result.from_dict(result)
|
595
|
+
|
596
|
+
def run_experiment(self, experiment: QasmQobjExperiment) -> dict[str, ...]:
|
597
|
+
"""Run an experiment (circuit) and return a single experiment result.
|
598
|
+
|
599
|
+
Args:
|
600
|
+
experiment: experiment from qobj experiments list
|
601
|
+
|
602
|
+
Returns:
|
603
|
+
A result dictionary which looks something like::
|
604
|
+
|
605
|
+
{
|
606
|
+
"name": name of this experiment (obtained from qobj.experiment header)
|
607
|
+
"seed": random seed used for simulation
|
608
|
+
"shots": number of shots used in the simulation
|
609
|
+
"data":
|
610
|
+
{
|
611
|
+
"counts": {'0x9: 5, ...},
|
612
|
+
"memory": ['0x9', '0xF', '0x1D', ..., '0x9']
|
613
|
+
},
|
614
|
+
"status": status string for the simulation
|
615
|
+
"success": boolean
|
616
|
+
"time_taken": simulation time of this single experiment
|
617
|
+
}
|
618
|
+
Raises:
|
619
|
+
BasicProviderError: if an error occurred.
|
620
|
+
"""
|
621
|
+
start = time.time()
|
622
|
+
self._number_of_qubits = experiment.config.n_qubits
|
623
|
+
self._number_of_cmembits = experiment.config.memory_slots
|
624
|
+
self._statevector = 0
|
625
|
+
self._classical_memory = 0
|
626
|
+
self._classical_register = 0
|
627
|
+
self._sample_measure = False
|
628
|
+
global_phase = experiment.header.global_phase
|
629
|
+
|
630
|
+
# Validate the dimension of initial statevector if set
|
631
|
+
self._validate_initial_statevector()
|
632
|
+
|
633
|
+
# Get the seed looking in circuit, qobj, and then random.
|
634
|
+
if hasattr(experiment.config, "seed_simulator"):
|
635
|
+
seed_simulator = experiment.config.seed_simulator
|
636
|
+
elif hasattr(self._qobj_config, "seed_simulator"):
|
637
|
+
seed_simulator = self._qobj_config.seed_simulator
|
638
|
+
else:
|
639
|
+
# For compatibility on Windows force dyte to be int32
|
640
|
+
# and set the maximum value to be (2 ** 31) - 1
|
641
|
+
seed_simulator = np.random.randint(2147483647, dtype="int32")
|
642
|
+
|
643
|
+
self._local_random = np.random.default_rng(seed=seed_simulator)
|
644
|
+
# Check if measure sampling is supported for current circuit
|
645
|
+
self._validate_measure_sampling(experiment)
|
646
|
+
|
647
|
+
# List of final counts for all shots
|
648
|
+
memory = []
|
649
|
+
# Check if we can sample measurements, if so we only perform 1 shot
|
650
|
+
# and sample all outcomes from the final state vector
|
651
|
+
if self._sample_measure:
|
652
|
+
shots = 1
|
653
|
+
# Store (qubit, cmembit) pairs for all measure ops in circuit to
|
654
|
+
# be sampled
|
655
|
+
measure_sample_ops = []
|
656
|
+
else:
|
657
|
+
shots = self._shots
|
658
|
+
for _ in range(shots):
|
659
|
+
self._initialize_statevector()
|
660
|
+
# apply global_phase
|
661
|
+
self._statevector *= np.exp(1j * global_phase)
|
662
|
+
# Initialize classical memory to all 0
|
663
|
+
self._classical_memory = 0
|
664
|
+
self._classical_register = 0
|
665
|
+
for operation in experiment.instructions:
|
666
|
+
conditional = getattr(operation, "conditional", None)
|
667
|
+
if isinstance(conditional, int):
|
668
|
+
conditional_bit_set = (self._classical_register >> conditional) & 1
|
669
|
+
if not conditional_bit_set:
|
670
|
+
continue
|
671
|
+
elif conditional is not None:
|
672
|
+
mask = int(operation.conditional.mask, 16)
|
673
|
+
if mask > 0:
|
674
|
+
value = self._classical_memory & mask
|
675
|
+
while (mask & 0x1) == 0:
|
676
|
+
mask >>= 1
|
677
|
+
value >>= 1
|
678
|
+
if value != int(operation.conditional.val, 16):
|
679
|
+
continue
|
680
|
+
if operation.name == "unitary":
|
681
|
+
qubits = operation.qubits
|
682
|
+
gate = operation.params[0]
|
683
|
+
self._add_unitary(gate, qubits)
|
684
|
+
elif operation.name in ("id", "u0", "delay"):
|
685
|
+
pass
|
686
|
+
elif operation.name == "global_phase":
|
687
|
+
params = getattr(operation, "params", None)
|
688
|
+
gate = GlobalPhaseGate(*params).to_matrix()
|
689
|
+
self._add_unitary(gate, [])
|
690
|
+
# Check if single qubit gate
|
691
|
+
elif operation.name in SINGLE_QUBIT_GATES:
|
692
|
+
params = getattr(operation, "params", None)
|
693
|
+
qubit = operation.qubits[0]
|
694
|
+
gate = single_gate_matrix(operation.name, params)
|
695
|
+
self._add_unitary(gate, [qubit])
|
696
|
+
elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
|
697
|
+
params = getattr(operation, "params", None)
|
698
|
+
qubit0 = operation.qubits[0]
|
699
|
+
qubit1 = operation.qubits[1]
|
700
|
+
gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
|
701
|
+
self._add_unitary(gate, [qubit0, qubit1])
|
702
|
+
elif operation.name in ("id", "u0"):
|
703
|
+
pass
|
704
|
+
elif operation.name in TWO_QUBIT_GATES:
|
705
|
+
qubit0 = operation.qubits[0]
|
706
|
+
qubit1 = operation.qubits[1]
|
707
|
+
gate = TWO_QUBIT_GATES[operation.name]
|
708
|
+
self._add_unitary(gate, [qubit0, qubit1])
|
709
|
+
elif operation.name in THREE_QUBIT_GATES:
|
710
|
+
qubit0 = operation.qubits[0]
|
711
|
+
qubit1 = operation.qubits[1]
|
712
|
+
qubit2 = operation.qubits[2]
|
713
|
+
gate = THREE_QUBIT_GATES[operation.name]
|
714
|
+
self._add_unitary(gate, [qubit0, qubit1, qubit2])
|
715
|
+
# Check if reset
|
716
|
+
elif operation.name == "reset":
|
717
|
+
qubit = operation.qubits[0]
|
718
|
+
self._add_reset(qubit)
|
719
|
+
# Check if barrier
|
720
|
+
elif operation.name == "barrier":
|
721
|
+
pass
|
722
|
+
# Check if measure
|
723
|
+
elif operation.name == "measure":
|
724
|
+
qubit = operation.qubits[0]
|
725
|
+
cmembit = operation.memory[0]
|
726
|
+
cregbit = operation.register[0] if hasattr(operation, "register") else None
|
727
|
+
|
728
|
+
if self._sample_measure:
|
729
|
+
# If sampling measurements record the qubit and cmembit
|
730
|
+
# for this measurement for later sampling
|
731
|
+
measure_sample_ops.append((qubit, cmembit))
|
732
|
+
else:
|
733
|
+
# If not sampling perform measurement as normal
|
734
|
+
self._add_measure(qubit, cmembit, cregbit)
|
735
|
+
elif operation.name == "bfunc":
|
736
|
+
mask = int(operation.mask, 16)
|
737
|
+
relation = operation.relation
|
738
|
+
val = int(operation.val, 16)
|
739
|
+
|
740
|
+
cregbit = operation.register
|
741
|
+
cmembit = operation.memory if hasattr(operation, "memory") else None
|
742
|
+
|
743
|
+
compared = (self._classical_register & mask) - val
|
744
|
+
|
745
|
+
if relation == "==":
|
746
|
+
outcome = compared == 0
|
747
|
+
elif relation == "!=":
|
748
|
+
outcome = compared != 0
|
749
|
+
elif relation == "<":
|
750
|
+
outcome = compared < 0
|
751
|
+
elif relation == "<=":
|
752
|
+
outcome = compared <= 0
|
753
|
+
elif relation == ">":
|
754
|
+
outcome = compared > 0
|
755
|
+
elif relation == ">=":
|
756
|
+
outcome = compared >= 0
|
757
|
+
else:
|
758
|
+
raise BasicProviderError("Invalid boolean function relation.")
|
759
|
+
|
760
|
+
# Store outcome in register and optionally memory slot
|
761
|
+
regbit = 1 << cregbit
|
762
|
+
self._classical_register = (self._classical_register & (~regbit)) | (
|
763
|
+
int(outcome) << cregbit
|
764
|
+
)
|
765
|
+
if cmembit is not None:
|
766
|
+
membit = 1 << cmembit
|
767
|
+
self._classical_memory = (self._classical_memory & (~membit)) | (
|
768
|
+
int(outcome) << cmembit
|
769
|
+
)
|
770
|
+
else:
|
771
|
+
backend = self.name
|
772
|
+
err_msg = '{0} encountered unrecognized operation "{1}"'
|
773
|
+
raise BasicProviderError(err_msg.format(backend, operation.name))
|
774
|
+
|
775
|
+
# Add final creg data to memory list
|
776
|
+
if self._number_of_cmembits > 0:
|
777
|
+
if self._sample_measure:
|
778
|
+
# If sampling we generate all shot samples from the final statevector
|
779
|
+
memory = self._add_sample_measure(measure_sample_ops, self._shots)
|
780
|
+
else:
|
781
|
+
# Turn classical_memory (int) into bit string and pad zero for unused cmembits
|
782
|
+
outcome = bin(self._classical_memory)[2:]
|
783
|
+
memory.append(hex(int(outcome, 2)))
|
784
|
+
|
785
|
+
# Add data
|
786
|
+
data = {"counts": dict(Counter(memory))}
|
787
|
+
# Optionally add memory list
|
788
|
+
if self._memory:
|
789
|
+
data["memory"] = memory
|
790
|
+
end = time.time()
|
791
|
+
return {
|
792
|
+
"name": experiment.header.name,
|
793
|
+
"seed_simulator": seed_simulator,
|
794
|
+
"shots": self._shots,
|
795
|
+
"data": data,
|
796
|
+
"status": "DONE",
|
797
|
+
"success": True,
|
798
|
+
"time_taken": (end - start),
|
799
|
+
"header": experiment.header.to_dict(),
|
800
|
+
}
|
801
|
+
|
802
|
+
def _validate(self, qobj: QasmQobj) -> None:
|
803
|
+
"""Semantic validations of the qobj which cannot be done via schemas."""
|
804
|
+
n_qubits = qobj.config.n_qubits
|
805
|
+
max_qubits = self.MAX_QUBITS_MEMORY
|
806
|
+
if n_qubits > max_qubits:
|
807
|
+
raise BasicProviderError(
|
808
|
+
f"Number of qubits {n_qubits} is greater than maximum ({max_qubits}) "
|
809
|
+
f'for "{self.name}".'
|
810
|
+
)
|
811
|
+
for experiment in qobj.experiments:
|
812
|
+
name = experiment.header.name
|
813
|
+
if experiment.config.memory_slots == 0:
|
814
|
+
logger.warning(
|
815
|
+
'No classical registers in circuit "%s", counts will be empty.', name
|
816
|
+
)
|
817
|
+
elif "measure" not in [op.name for op in experiment.instructions]:
|
818
|
+
logger.warning(
|
819
|
+
'No measurements in circuit "%s", classical register will remain all zeros.',
|
820
|
+
name,
|
821
|
+
)
|