qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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 +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -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 +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -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 +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -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 +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -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 +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -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 +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -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 +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -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 +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -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/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -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 +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -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 +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -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 +29 -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 +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -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 +511 -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 +869 -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 +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -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 +1239 -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 +857 -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 +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -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/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- 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/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/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -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 +61 -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 +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -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 +61 -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 +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -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 +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -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 +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -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 +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -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 +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -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 +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -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 +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -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/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -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 +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -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 +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -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 +397 -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 +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -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 +61 -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 +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -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 +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -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 +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -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 +195 -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-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,30 @@
|
|
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
|
+
"""
|
14
|
+
Exception for errors raised by the Basic Provider.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from qiskit.exceptions import QiskitError
|
18
|
+
|
19
|
+
|
20
|
+
class BasicProviderError(QiskitError):
|
21
|
+
"""Base class for errors raised by the Basic Provider."""
|
22
|
+
|
23
|
+
def __init__(self, *message):
|
24
|
+
"""Set the error message."""
|
25
|
+
super().__init__(*message)
|
26
|
+
self.message = " ".join(message)
|
27
|
+
|
28
|
+
def __str__(self):
|
29
|
+
"""Return the message."""
|
30
|
+
return repr(self.message)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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
|
+
"""Exceptions for errors raised while handling Backends and Jobs."""
|
14
|
+
|
15
|
+
from qiskit.exceptions import QiskitError
|
16
|
+
|
17
|
+
|
18
|
+
class JobError(QiskitError):
|
19
|
+
"""Base class for errors raised by Jobs."""
|
20
|
+
|
21
|
+
pass
|
22
|
+
|
23
|
+
|
24
|
+
class JobTimeoutError(JobError):
|
25
|
+
"""Base class for timeout errors raised by jobs."""
|
26
|
+
|
27
|
+
pass
|
28
|
+
|
29
|
+
|
30
|
+
class QiskitBackendNotFoundError(QiskitError):
|
31
|
+
"""Base class for errors raised while looking for a backend."""
|
32
|
+
|
33
|
+
pass
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 2024.
|
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
|
+
"""
|
14
|
+
======================================================
|
15
|
+
Fake Provider (:mod:`qiskit.providers.fake_provider`)
|
16
|
+
======================================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.providers.fake_provider
|
19
|
+
|
20
|
+
Overview
|
21
|
+
========
|
22
|
+
|
23
|
+
The fake provider module in Qiskit contains fake (simulated) backend classes
|
24
|
+
useful for testing the transpiler and other backend-facing functionality.
|
25
|
+
|
26
|
+
Example Usage
|
27
|
+
-------------
|
28
|
+
|
29
|
+
Here is an example of using a simulated backend for transpilation and running.
|
30
|
+
|
31
|
+
.. plot::
|
32
|
+
:alt: Output from the previous code.
|
33
|
+
:include-source:
|
34
|
+
|
35
|
+
from qiskit import QuantumCircuit, transpile
|
36
|
+
from qiskit.providers.fake_provider import GenericBackendV2
|
37
|
+
from qiskit.visualization import plot_histogram
|
38
|
+
|
39
|
+
# Generate a 5-qubit simulated backend
|
40
|
+
backend = GenericBackendV2(num_qubits=5)
|
41
|
+
|
42
|
+
# Create a simple circuit
|
43
|
+
circuit = QuantumCircuit(3)
|
44
|
+
circuit.h(0)
|
45
|
+
circuit.cx(0,1)
|
46
|
+
circuit.cx(0,2)
|
47
|
+
circuit.measure_all()
|
48
|
+
circuit.draw('mpl')
|
49
|
+
|
50
|
+
# Transpile the ideal circuit to a circuit that can be directly executed by the backend
|
51
|
+
transpiled_circuit = transpile(circuit, backend)
|
52
|
+
transpiled_circuit.draw('mpl')
|
53
|
+
|
54
|
+
# Run the transpiled circuit using the simulated backend
|
55
|
+
job = backend.run(transpiled_circuit)
|
56
|
+
counts = job.result().get_counts()
|
57
|
+
plot_histogram(counts)
|
58
|
+
|
59
|
+
|
60
|
+
V2 Simulated Backends
|
61
|
+
=====================
|
62
|
+
|
63
|
+
.. autosummary::
|
64
|
+
:toctree: ../stubs/
|
65
|
+
|
66
|
+
GenericBackendV2
|
67
|
+
|
68
|
+
"""
|
69
|
+
from .generic_backend_v2 import GenericBackendV2
|
@@ -0,0 +1,376 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
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
|
+
"""Generic BackendV2 class that with a simulated ``run``."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import warnings
|
17
|
+
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit.circuit import QuantumCircuit, Instruction
|
21
|
+
from qiskit.circuit.controlflow import (
|
22
|
+
BoxOp,
|
23
|
+
IfElseOp,
|
24
|
+
WhileLoopOp,
|
25
|
+
ForLoopOp,
|
26
|
+
SwitchCaseOp,
|
27
|
+
BreakLoopOp,
|
28
|
+
ContinueLoopOp,
|
29
|
+
)
|
30
|
+
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
|
31
|
+
from qiskit.exceptions import QiskitError
|
32
|
+
from qiskit.transpiler import CouplingMap, Target, InstructionProperties, QubitProperties
|
33
|
+
from qiskit.providers import Options
|
34
|
+
from qiskit.providers.basic_provider import BasicSimulator
|
35
|
+
from qiskit.providers.backend import BackendV2
|
36
|
+
from qiskit.utils import optionals as _optionals
|
37
|
+
|
38
|
+
# Noise default values/ranges for duration and error of supported
|
39
|
+
# instructions. There are two possible formats:
|
40
|
+
# - (min_duration, max_duration, min_error, max_error),
|
41
|
+
# if the defaults are ranges.
|
42
|
+
# - (duration, error), if the defaults are fixed values.
|
43
|
+
_NOISE_DEFAULTS = {
|
44
|
+
"cx": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
|
45
|
+
"ecr": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
|
46
|
+
"cz": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
|
47
|
+
"id": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
|
48
|
+
"rz": (0.0, 0.0),
|
49
|
+
"sx": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
|
50
|
+
"x": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
|
51
|
+
"measure": (6.99966e-07, 1.500054e-06, 1e-5, 5e-3),
|
52
|
+
"delay": (None, None),
|
53
|
+
"reset": (None, None),
|
54
|
+
}
|
55
|
+
|
56
|
+
# Fallback values for gates with unknown noise default ranges.
|
57
|
+
_NOISE_DEFAULTS_FALLBACK = {
|
58
|
+
"1-q": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
|
59
|
+
"multi-q": (7.992e-08, 8.99988e-07, 5e-3),
|
60
|
+
}
|
61
|
+
|
62
|
+
# Ranges to sample qubit properties from.
|
63
|
+
_QUBIT_PROPERTIES = {
|
64
|
+
"dt": 0.222e-9,
|
65
|
+
"t1": (100e-6, 200e-6),
|
66
|
+
"t2": (100e-6, 200e-6),
|
67
|
+
"frequency": (5e9, 5.5e9),
|
68
|
+
}
|
69
|
+
|
70
|
+
|
71
|
+
class GenericBackendV2(BackendV2):
|
72
|
+
"""Generic :class:`~.BackendV2` implementation with a configurable constructor. This class will
|
73
|
+
return a :class:`~.BackendV2` instance that runs on a local simulator (in the spirit of fake
|
74
|
+
backends) and contains all the necessary information to test backend-interfacing components, such
|
75
|
+
as the transpiler. A :class:`.GenericBackendV2` instance can be constructed from as little as a
|
76
|
+
specified ``num_qubits``, but users can additionally configure the basis gates, coupling map,
|
77
|
+
ability to run dynamic circuits (control flow instructions) and dtm.
|
78
|
+
The remainder of the backend properties are generated by randomly sampling
|
79
|
+
from default ranges extracted from historical IBM backend data. The seed for this random
|
80
|
+
generation can be fixed to ensure the reproducibility of the backend output.
|
81
|
+
This backend only supports gates in the standard library, if you need a more flexible backend,
|
82
|
+
there is always the option to directly instantiate a :class:`.Target` object to use for
|
83
|
+
transpilation.
|
84
|
+
"""
|
85
|
+
|
86
|
+
def __init__(
|
87
|
+
self,
|
88
|
+
num_qubits: int,
|
89
|
+
basis_gates: list[str] | None = None,
|
90
|
+
*,
|
91
|
+
coupling_map: list[list[int]] | CouplingMap | None = None,
|
92
|
+
control_flow: bool = False,
|
93
|
+
dtm: float | None = None,
|
94
|
+
dt: float | None = None,
|
95
|
+
seed: int | None = None,
|
96
|
+
noise_info: bool = True,
|
97
|
+
):
|
98
|
+
"""
|
99
|
+
Args:
|
100
|
+
num_qubits: Number of qubits that will be used to construct the backend's target.
|
101
|
+
Note that, while there is no limit in the size of the target that can be
|
102
|
+
constructed, this backend runs on local noisy simulators, and these might
|
103
|
+
present limitations in the number of qubits that can be simulated.
|
104
|
+
|
105
|
+
basis_gates: List of basis gate names to be supported by
|
106
|
+
the target. These must be part of the standard qiskit circuit library.
|
107
|
+
The default set of basis gates is ``["id", "rz", "sx", "x", "cx"]``
|
108
|
+
The ``"reset"``, ``"delay"``, and ``"measure"`` instructions are
|
109
|
+
always supported by default, even if not specified via ``basis_gates``.
|
110
|
+
|
111
|
+
coupling_map: Optional coupling map
|
112
|
+
for the backend. Multiple formats are supported:
|
113
|
+
|
114
|
+
#. :class:`~.CouplingMap` instance
|
115
|
+
#. List, must be given as an edge list representing the two qubit interactions
|
116
|
+
supported by the backend, for example:
|
117
|
+
``[[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]``
|
118
|
+
|
119
|
+
If ``coupling_map`` is specified, it must match the number of qubits
|
120
|
+
specified in ``num_qubits``. If ``coupling_map`` is not specified,
|
121
|
+
a fully connected coupling map will be generated with ``num_qubits``
|
122
|
+
qubits.
|
123
|
+
|
124
|
+
control_flow: Flag to enable control flow directives on the target
|
125
|
+
(defaults to False).
|
126
|
+
|
127
|
+
dtm: System time resolution of output signals in nanoseconds.
|
128
|
+
None by default.
|
129
|
+
|
130
|
+
dt: System time resolution of input signals in nanoseconds.
|
131
|
+
None by default.
|
132
|
+
|
133
|
+
seed: Optional seed for generation of default values.
|
134
|
+
|
135
|
+
noise_info: If true, associates gates and qubits with default noise information.
|
136
|
+
"""
|
137
|
+
|
138
|
+
super().__init__(
|
139
|
+
provider=None,
|
140
|
+
name=f"generic_backend_{num_qubits}q",
|
141
|
+
description=f"This is a device with {num_qubits} qubits and generic settings.",
|
142
|
+
backend_version="",
|
143
|
+
)
|
144
|
+
|
145
|
+
self._sim = None
|
146
|
+
self._rng = np.random.default_rng(seed=seed)
|
147
|
+
self._dtm = dtm
|
148
|
+
self._dt = dt
|
149
|
+
self._num_qubits = num_qubits
|
150
|
+
self._control_flow = control_flow
|
151
|
+
self._supported_gates = get_standard_gate_name_mapping()
|
152
|
+
self._noise_info = noise_info
|
153
|
+
|
154
|
+
if coupling_map is None:
|
155
|
+
self._coupling_map = CouplingMap().from_full(num_qubits)
|
156
|
+
else:
|
157
|
+
if isinstance(coupling_map, CouplingMap):
|
158
|
+
self._coupling_map = coupling_map
|
159
|
+
else:
|
160
|
+
self._coupling_map = CouplingMap(coupling_map)
|
161
|
+
|
162
|
+
if num_qubits != self._coupling_map.size():
|
163
|
+
raise QiskitError(
|
164
|
+
f"The number of qubits (got {num_qubits}) must match "
|
165
|
+
f"the size of the provided coupling map (got {self._coupling_map.size()})."
|
166
|
+
)
|
167
|
+
|
168
|
+
self._basis_gates = (
|
169
|
+
basis_gates if basis_gates is not None else ["cx", "id", "rz", "sx", "x"]
|
170
|
+
)
|
171
|
+
for name in ["reset", "delay", "measure"]:
|
172
|
+
if name not in self._basis_gates:
|
173
|
+
self._basis_gates.append(name)
|
174
|
+
|
175
|
+
self._build_generic_target()
|
176
|
+
|
177
|
+
@property
|
178
|
+
def target(self):
|
179
|
+
return self._target
|
180
|
+
|
181
|
+
@property
|
182
|
+
def max_circuits(self):
|
183
|
+
return None
|
184
|
+
|
185
|
+
@property
|
186
|
+
def dtm(self) -> float:
|
187
|
+
"""Return the system time resolution of output signals"""
|
188
|
+
# converting `dtm` from nanoseconds to seconds
|
189
|
+
return self._dtm * 1e-9 if self._dtm is not None else None
|
190
|
+
|
191
|
+
@property
|
192
|
+
def meas_map(self) -> list[list[int]]:
|
193
|
+
return self._target.concurrent_measurements
|
194
|
+
|
195
|
+
def _get_noise_defaults(self, name: str, num_qubits: int) -> tuple:
|
196
|
+
"""Return noise default values/ranges for duration and error of supported
|
197
|
+
instructions. There are two possible formats:
|
198
|
+
- (min_duration, max_duration, min_error, max_error),
|
199
|
+
if the defaults are ranges.
|
200
|
+
- (duration, error), if the defaults are fixed values.
|
201
|
+
"""
|
202
|
+
if name in _NOISE_DEFAULTS:
|
203
|
+
return _NOISE_DEFAULTS[name]
|
204
|
+
if num_qubits == 1:
|
205
|
+
return _NOISE_DEFAULTS_FALLBACK["1-q"]
|
206
|
+
return _NOISE_DEFAULTS_FALLBACK["multi-q"]
|
207
|
+
|
208
|
+
def _build_generic_target(self):
|
209
|
+
"""This method generates a :class:`~.Target` instance with
|
210
|
+
default qubit and instruction properties.
|
211
|
+
"""
|
212
|
+
# the qubit properties are sampled from default ranges
|
213
|
+
properties = _QUBIT_PROPERTIES
|
214
|
+
if not self._noise_info:
|
215
|
+
self._target = Target(
|
216
|
+
description=f"Generic Target with {self._num_qubits} qubits",
|
217
|
+
num_qubits=self._num_qubits,
|
218
|
+
dt=properties["dt"] if self._dt is None else self._dt,
|
219
|
+
qubit_properties=None,
|
220
|
+
concurrent_measurements=[list(range(self._num_qubits))],
|
221
|
+
)
|
222
|
+
else:
|
223
|
+
self._target = Target(
|
224
|
+
description=f"Generic Target with {self._num_qubits} qubits",
|
225
|
+
num_qubits=self._num_qubits,
|
226
|
+
dt=properties["dt"] if self._dt is None else self._dt,
|
227
|
+
qubit_properties=[
|
228
|
+
QubitProperties(
|
229
|
+
t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
|
230
|
+
t2=self._rng.uniform(properties["t2"][0], properties["t2"][1]),
|
231
|
+
frequency=self._rng.uniform(
|
232
|
+
properties["frequency"][0], properties["frequency"][1]
|
233
|
+
),
|
234
|
+
)
|
235
|
+
for _ in range(self._num_qubits)
|
236
|
+
],
|
237
|
+
concurrent_measurements=[list(range(self._num_qubits))],
|
238
|
+
)
|
239
|
+
|
240
|
+
# Iterate over gates, generate noise params from defaults,
|
241
|
+
# and add instructions and noise information to the target.
|
242
|
+
for name in self._basis_gates:
|
243
|
+
if name not in self._supported_gates:
|
244
|
+
raise QiskitError(
|
245
|
+
f"Provided basis gate {name} is not an instruction "
|
246
|
+
f"in the standard qiskit circuit library."
|
247
|
+
)
|
248
|
+
gate = self._supported_gates[name]
|
249
|
+
if self.num_qubits < gate.num_qubits:
|
250
|
+
raise QiskitError(
|
251
|
+
f"Provided basis gate {name} needs more qubits than {self.num_qubits}, "
|
252
|
+
f"which is the size of the backend."
|
253
|
+
)
|
254
|
+
if self._noise_info:
|
255
|
+
noise_params = self._get_noise_defaults(name, gate.num_qubits)
|
256
|
+
self._add_noisy_instruction_to_target(gate, noise_params)
|
257
|
+
else:
|
258
|
+
qarg_set = self._coupling_map if gate.num_qubits > 1 else range(self.num_qubits)
|
259
|
+
props = {(qarg,) if isinstance(qarg, int) else qarg: None for qarg in qarg_set}
|
260
|
+
self._target.add_instruction(gate, properties=props, name=name)
|
261
|
+
|
262
|
+
if self._control_flow:
|
263
|
+
self._target.add_instruction(IfElseOp, name="if_else")
|
264
|
+
self._target.add_instruction(WhileLoopOp, name="while_loop")
|
265
|
+
self._target.add_instruction(ForLoopOp, name="for_loop")
|
266
|
+
self._target.add_instruction(SwitchCaseOp, name="switch_case")
|
267
|
+
self._target.add_instruction(BreakLoopOp, name="break")
|
268
|
+
self._target.add_instruction(ContinueLoopOp, name="continue")
|
269
|
+
self._target.add_instruction(BoxOp, name="box")
|
270
|
+
|
271
|
+
def _add_noisy_instruction_to_target(
|
272
|
+
self,
|
273
|
+
instruction: Instruction,
|
274
|
+
noise_params: tuple[float, ...] | None,
|
275
|
+
) -> None:
|
276
|
+
"""Add instruction properties to target for specified instruction.
|
277
|
+
|
278
|
+
Args:
|
279
|
+
instruction: Instance of instruction to be added to the target
|
280
|
+
noise_params: Error and duration noise values/ranges to
|
281
|
+
include in instruction properties.
|
282
|
+
"""
|
283
|
+
qarg_set = self._coupling_map if instruction.num_qubits > 1 else range(self.num_qubits)
|
284
|
+
props = {}
|
285
|
+
for qarg in qarg_set:
|
286
|
+
try:
|
287
|
+
qargs = tuple(qarg)
|
288
|
+
except TypeError:
|
289
|
+
qargs = (qarg,)
|
290
|
+
duration, error = (
|
291
|
+
noise_params
|
292
|
+
if len(noise_params) == 2
|
293
|
+
else (
|
294
|
+
self._rng.uniform(*noise_params[:2]),
|
295
|
+
self._rng.uniform(*noise_params[2:]),
|
296
|
+
)
|
297
|
+
)
|
298
|
+
|
299
|
+
if duration is not None and len(noise_params) > 2:
|
300
|
+
# Ensure exact conversion of duration from seconds to dt
|
301
|
+
dt = _QUBIT_PROPERTIES["dt"]
|
302
|
+
rounded_duration = round(duration / dt) * dt
|
303
|
+
# Clamp rounded duration to be between min and max values
|
304
|
+
duration = max(noise_params[0], min(rounded_duration, noise_params[1]))
|
305
|
+
props.update({qargs: InstructionProperties(duration, error)})
|
306
|
+
|
307
|
+
self._target.add_instruction(instruction, props)
|
308
|
+
|
309
|
+
def run(self, run_input, **options):
|
310
|
+
"""Run on the backend using a simulator.
|
311
|
+
|
312
|
+
This method runs circuit jobs (an individual or a list of :class:`~.QuantumCircuit`
|
313
|
+
) using :class:`~.BasicSimulator` or Aer simulator and returns a
|
314
|
+
:class:`~qiskit.providers.Job` object.
|
315
|
+
|
316
|
+
If qiskit-aer is installed, jobs will be run using the ``AerSimulator`` with
|
317
|
+
noise model of the backend. Otherwise, jobs will be run using the
|
318
|
+
``BasicSimulator`` simulator without noise.
|
319
|
+
|
320
|
+
Args:
|
321
|
+
run_input (QuantumCircuit or list): An
|
322
|
+
individual or a list of :class:`~qiskit.circuit.QuantumCircuit`
|
323
|
+
objects to run on the backend.
|
324
|
+
options: Any kwarg options to pass to the backend for running the
|
325
|
+
config. If a key is also present in the options
|
326
|
+
attribute/object, then the expectation is that the value
|
327
|
+
specified will be used instead of what's set in the options
|
328
|
+
object.
|
329
|
+
|
330
|
+
Returns:
|
331
|
+
Job: The job object for the run
|
332
|
+
|
333
|
+
Raises:
|
334
|
+
QiskitError: If input is not :class:`~qiskit.circuit.QuantumCircuit` or a list of
|
335
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects.
|
336
|
+
"""
|
337
|
+
circuits = run_input
|
338
|
+
if not isinstance(circuits, QuantumCircuit) and (
|
339
|
+
not isinstance(circuits, list)
|
340
|
+
or not all(isinstance(x, QuantumCircuit) for x in circuits)
|
341
|
+
):
|
342
|
+
raise QiskitError(
|
343
|
+
f"Invalid input object {circuits}, must be either a "
|
344
|
+
"QuantumCircuit or a list of QuantumCircuit objects"
|
345
|
+
)
|
346
|
+
|
347
|
+
if not _optionals.HAS_AER:
|
348
|
+
warnings.warn("Aer not found using BasicSimulator and no noise", RuntimeWarning)
|
349
|
+
if self._sim is None:
|
350
|
+
self._setup_sim()
|
351
|
+
self._sim._options = self._options
|
352
|
+
job = self._sim.run(circuits, **options)
|
353
|
+
return job
|
354
|
+
|
355
|
+
def _setup_sim(self) -> None:
|
356
|
+
if _optionals.HAS_AER:
|
357
|
+
from qiskit_aer import AerSimulator
|
358
|
+
from qiskit_aer.noise import NoiseModel
|
359
|
+
|
360
|
+
self._sim = AerSimulator()
|
361
|
+
noise_model = NoiseModel.from_backend(self)
|
362
|
+
self._sim.set_options(noise_model=noise_model)
|
363
|
+
# Update backend default too to avoid overwriting
|
364
|
+
# it when run() is called
|
365
|
+
self.set_options(noise_model=noise_model)
|
366
|
+
else:
|
367
|
+
self._sim = BasicSimulator()
|
368
|
+
|
369
|
+
@classmethod
|
370
|
+
def _default_options(cls) -> Options:
|
371
|
+
if _optionals.HAS_AER:
|
372
|
+
from qiskit_aer import AerSimulator
|
373
|
+
|
374
|
+
return AerSimulator._default_options()
|
375
|
+
else:
|
376
|
+
return BasicSimulator._default_options()
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
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
|
+
"""
|
14
|
+
Utils for test backends.
|
15
|
+
"""
|
qiskit/providers/job.py
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
"""Job abstract interface."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import time
|
18
|
+
from abc import ABC, abstractmethod
|
19
|
+
from typing import Callable, Optional, TYPE_CHECKING
|
20
|
+
|
21
|
+
from qiskit.exceptions import QiskitError
|
22
|
+
from qiskit.providers.backend import Backend
|
23
|
+
from qiskit.providers.exceptions import JobTimeoutError
|
24
|
+
from qiskit.providers.jobstatus import JOB_FINAL_STATES, JobStatus
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from qiskit.result import Result
|
28
|
+
|
29
|
+
|
30
|
+
class Job:
|
31
|
+
"""Base common type for all versioned Job abstract classes.
|
32
|
+
|
33
|
+
Note this class should not be inherited from directly, it is intended
|
34
|
+
to be used for type checking. When implementing a provider you should use
|
35
|
+
the versioned abstract classes as the parent class and not this class
|
36
|
+
directly.
|
37
|
+
"""
|
38
|
+
|
39
|
+
version = 0
|
40
|
+
|
41
|
+
|
42
|
+
class JobV1(Job, ABC):
|
43
|
+
"""Class to handle jobs
|
44
|
+
|
45
|
+
This first version of the Backend abstract class is written to be mostly
|
46
|
+
backwards compatible with the legacy providers interface. This was done to ease
|
47
|
+
the transition for users and provider maintainers to the new versioned providers. Expect,
|
48
|
+
future versions of this abstract class to change the data model and
|
49
|
+
interface.
|
50
|
+
"""
|
51
|
+
|
52
|
+
version = 1
|
53
|
+
_async = True
|
54
|
+
|
55
|
+
def __init__(self, backend: Optional[Backend], job_id: str, **kwargs) -> None:
|
56
|
+
"""Initializes the asynchronous job.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
backend: the backend used to run the job.
|
60
|
+
job_id: a unique id in the context of the backend used to run
|
61
|
+
the job.
|
62
|
+
kwargs: Any key value metadata to associate with this job.
|
63
|
+
"""
|
64
|
+
self._job_id = job_id
|
65
|
+
self._backend = backend
|
66
|
+
self.metadata = kwargs
|
67
|
+
|
68
|
+
def job_id(self) -> str:
|
69
|
+
"""Return a unique id identifying the job."""
|
70
|
+
return self._job_id
|
71
|
+
|
72
|
+
def backend(self) -> Backend:
|
73
|
+
"""Return the backend where this job was executed."""
|
74
|
+
if self._backend is None:
|
75
|
+
raise QiskitError("The job does not have any backend.")
|
76
|
+
return self._backend
|
77
|
+
|
78
|
+
def done(self) -> bool:
|
79
|
+
"""Return whether the job has successfully run."""
|
80
|
+
return self.status() == JobStatus.DONE
|
81
|
+
|
82
|
+
def running(self) -> bool:
|
83
|
+
"""Return whether the job is actively running."""
|
84
|
+
return self.status() == JobStatus.RUNNING
|
85
|
+
|
86
|
+
def cancelled(self) -> bool:
|
87
|
+
"""Return whether the job has been cancelled."""
|
88
|
+
return self.status() == JobStatus.CANCELLED
|
89
|
+
|
90
|
+
def in_final_state(self) -> bool:
|
91
|
+
"""Return whether the job is in a final job state such as ``DONE`` or ``ERROR``."""
|
92
|
+
return self.status() in JOB_FINAL_STATES
|
93
|
+
|
94
|
+
def wait_for_final_state(
|
95
|
+
self, timeout: Optional[float] = None, wait: float = 5, callback: Optional[Callable] = None
|
96
|
+
) -> None:
|
97
|
+
"""Poll the job status until it progresses to a final state such as ``DONE`` or ``ERROR``.
|
98
|
+
|
99
|
+
Args:
|
100
|
+
timeout: Seconds to wait for the job. If ``None``, wait indefinitely.
|
101
|
+
wait: Seconds between queries.
|
102
|
+
callback: Callback function invoked after each query.
|
103
|
+
The following positional arguments are provided to the callback function:
|
104
|
+
|
105
|
+
* job_id: Job ID
|
106
|
+
* job_status: Status of the job from the last query
|
107
|
+
* job: This BaseJob instance
|
108
|
+
|
109
|
+
Note: different subclass might provide different arguments to
|
110
|
+
the callback function.
|
111
|
+
|
112
|
+
Raises:
|
113
|
+
JobTimeoutError: If the job does not reach a final state before the
|
114
|
+
specified timeout.
|
115
|
+
"""
|
116
|
+
if not self._async:
|
117
|
+
return
|
118
|
+
start_time = time.time()
|
119
|
+
status = self.status()
|
120
|
+
while status not in JOB_FINAL_STATES:
|
121
|
+
elapsed_time = time.time() - start_time
|
122
|
+
if timeout is not None and elapsed_time >= timeout:
|
123
|
+
raise JobTimeoutError(f"Timeout while waiting for job {self.job_id()}.")
|
124
|
+
if callback:
|
125
|
+
callback(self.job_id(), status, self)
|
126
|
+
time.sleep(wait)
|
127
|
+
status = self.status()
|
128
|
+
return
|
129
|
+
|
130
|
+
@abstractmethod
|
131
|
+
def submit(self):
|
132
|
+
"""Submit the job to the backend for execution."""
|
133
|
+
pass
|
134
|
+
|
135
|
+
@abstractmethod
|
136
|
+
def result(self) -> Result:
|
137
|
+
"""Return the results of the job."""
|
138
|
+
pass
|
139
|
+
|
140
|
+
def cancel(self):
|
141
|
+
"""Attempt to cancel the job."""
|
142
|
+
raise NotImplementedError
|
143
|
+
|
144
|
+
@abstractmethod
|
145
|
+
def status(self) -> JobStatus:
|
146
|
+
"""Return the status of the job, among the values of ``JobStatus``."""
|
147
|
+
pass
|