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,109 @@
|
|
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
|
+
"""Pass manager for optimization level 2, providing medium optimization.
|
14
|
+
|
15
|
+
Level 2 pass manager: medium optimization by noise adaptive qubit mapping and
|
16
|
+
gate cancellation using commutativity rules.
|
17
|
+
"""
|
18
|
+
from __future__ import annotations
|
19
|
+
from qiskit.transpiler.passmanager_config import PassManagerConfig
|
20
|
+
from qiskit.transpiler.passmanager import StagedPassManager
|
21
|
+
from qiskit.transpiler.preset_passmanagers import common
|
22
|
+
from qiskit.transpiler.preset_passmanagers.plugin import (
|
23
|
+
PassManagerStagePluginManager,
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
def level_2_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassManager:
|
28
|
+
"""Level 2 pass manager: medium optimization by initial layout selection and
|
29
|
+
gate cancellation using commutativity rules.
|
30
|
+
|
31
|
+
This pass manager applies the user-given initial layout. If none is given, a search
|
32
|
+
for a perfect layout (i.e. one that satisfies all 2-qubit interactions) is conducted.
|
33
|
+
If no such layout is found, qubits are laid out on the most densely connected subset
|
34
|
+
which also exhibits the best gate fidelities.
|
35
|
+
|
36
|
+
The pass manager then transforms the circuit to match the coupling constraints.
|
37
|
+
It is then unrolled to the basis, and any flipped cx directions are fixed.
|
38
|
+
Finally, optimizations in the form of commutative gate cancellation and redundant
|
39
|
+
reset removal are performed.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
pass_manager_config: configuration of the pass manager.
|
43
|
+
|
44
|
+
Returns:
|
45
|
+
a level 2 pass manager.
|
46
|
+
|
47
|
+
Raises:
|
48
|
+
TranspilerError: if the passmanager config is invalid.
|
49
|
+
"""
|
50
|
+
plugin_manager = PassManagerStagePluginManager()
|
51
|
+
basis_gates = pass_manager_config.basis_gates
|
52
|
+
coupling_map = pass_manager_config.coupling_map
|
53
|
+
initial_layout = pass_manager_config.initial_layout
|
54
|
+
init_method = pass_manager_config.init_method or "default"
|
55
|
+
layout_method = pass_manager_config.layout_method or "default"
|
56
|
+
routing_method = pass_manager_config.routing_method or "default"
|
57
|
+
translation_method = pass_manager_config.translation_method or "default"
|
58
|
+
optimization_method = pass_manager_config.optimization_method or "default"
|
59
|
+
scheduling_method = pass_manager_config.scheduling_method or "default"
|
60
|
+
target = pass_manager_config.target
|
61
|
+
|
62
|
+
# Choose routing pass
|
63
|
+
routing_pm = plugin_manager.get_passmanager_stage(
|
64
|
+
"routing", routing_method, pass_manager_config, optimization_level=2
|
65
|
+
)
|
66
|
+
|
67
|
+
# Build pass manager
|
68
|
+
if coupling_map or initial_layout:
|
69
|
+
layout = plugin_manager.get_passmanager_stage(
|
70
|
+
"layout", layout_method, pass_manager_config, optimization_level=2
|
71
|
+
)
|
72
|
+
routing = routing_pm
|
73
|
+
else:
|
74
|
+
layout = None
|
75
|
+
routing = None
|
76
|
+
translation = plugin_manager.get_passmanager_stage(
|
77
|
+
"translation", translation_method, pass_manager_config, optimization_level=2
|
78
|
+
)
|
79
|
+
|
80
|
+
optimization = plugin_manager.get_passmanager_stage(
|
81
|
+
"optimization", optimization_method, pass_manager_config, optimization_level=2
|
82
|
+
)
|
83
|
+
|
84
|
+
sched = plugin_manager.get_passmanager_stage(
|
85
|
+
"scheduling", scheduling_method, pass_manager_config, optimization_level=2
|
86
|
+
)
|
87
|
+
|
88
|
+
pre_init = common.generate_control_flow_options_check(
|
89
|
+
layout_method=layout_method,
|
90
|
+
routing_method=routing_method,
|
91
|
+
translation_method=translation_method,
|
92
|
+
optimization_method=optimization_method,
|
93
|
+
scheduling_method=scheduling_method,
|
94
|
+
basis_gates=basis_gates,
|
95
|
+
target=target,
|
96
|
+
)
|
97
|
+
init = plugin_manager.get_passmanager_stage(
|
98
|
+
"init", init_method, pass_manager_config, optimization_level=2
|
99
|
+
)
|
100
|
+
|
101
|
+
return StagedPassManager(
|
102
|
+
pre_init=pre_init,
|
103
|
+
init=init,
|
104
|
+
layout=layout,
|
105
|
+
routing=routing,
|
106
|
+
translation=translation,
|
107
|
+
optimization=optimization,
|
108
|
+
scheduling=sched,
|
109
|
+
)
|
@@ -0,0 +1,110 @@
|
|
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
|
+
"""Pass manager for optimization level 3, providing heavy optimization.
|
14
|
+
|
15
|
+
Level 3 pass manager: heavy optimization by noise adaptive qubit mapping and
|
16
|
+
gate cancellation using commutativity rules and unitary synthesis.
|
17
|
+
"""
|
18
|
+
from __future__ import annotations
|
19
|
+
from qiskit.transpiler.passmanager_config import PassManagerConfig
|
20
|
+
from qiskit.transpiler.passmanager import StagedPassManager
|
21
|
+
from qiskit.transpiler.preset_passmanagers import common
|
22
|
+
from qiskit.transpiler.preset_passmanagers.plugin import (
|
23
|
+
PassManagerStagePluginManager,
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
def level_3_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassManager:
|
28
|
+
"""Level 3 pass manager: heavy optimization by noise adaptive qubit mapping and
|
29
|
+
gate cancellation using commutativity rules and unitary synthesis.
|
30
|
+
|
31
|
+
This pass manager applies the user-given initial layout. If none is given, a search
|
32
|
+
for a perfect layout (i.e. one that satisfies all 2-qubit interactions) is conducted.
|
33
|
+
If no such layout is found, and device calibration information is available, the
|
34
|
+
circuit is mapped to the qubits with best readouts and to CX gates with highest fidelity.
|
35
|
+
|
36
|
+
The pass manager then transforms the circuit to match the coupling constraints.
|
37
|
+
It is then unrolled to the basis, and any flipped cx directions are fixed.
|
38
|
+
Finally, optimizations in the form of commutative gate cancellation, resynthesis
|
39
|
+
of two-qubit unitary blocks, redundant reset removal and final layout improvements are
|
40
|
+
performed.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
pass_manager_config: configuration of the pass manager.
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
a level 3 pass manager.
|
47
|
+
|
48
|
+
Raises:
|
49
|
+
TranspilerError: if the passmanager config is invalid.
|
50
|
+
"""
|
51
|
+
plugin_manager = PassManagerStagePluginManager()
|
52
|
+
basis_gates = pass_manager_config.basis_gates
|
53
|
+
coupling_map = pass_manager_config.coupling_map
|
54
|
+
initial_layout = pass_manager_config.initial_layout
|
55
|
+
init_method = pass_manager_config.init_method or "default"
|
56
|
+
layout_method = pass_manager_config.layout_method or "default"
|
57
|
+
routing_method = pass_manager_config.routing_method or "default"
|
58
|
+
translation_method = pass_manager_config.translation_method or "default"
|
59
|
+
optimization_method = pass_manager_config.optimization_method or "default"
|
60
|
+
scheduling_method = pass_manager_config.scheduling_method or "default"
|
61
|
+
target = pass_manager_config.target
|
62
|
+
|
63
|
+
# Choose routing pass
|
64
|
+
routing_pm = plugin_manager.get_passmanager_stage(
|
65
|
+
"routing", routing_method, pass_manager_config, optimization_level=3
|
66
|
+
)
|
67
|
+
|
68
|
+
# Build pass manager
|
69
|
+
pre_init = common.generate_control_flow_options_check(
|
70
|
+
layout_method=layout_method,
|
71
|
+
routing_method=routing_method,
|
72
|
+
translation_method=translation_method,
|
73
|
+
optimization_method=optimization_method,
|
74
|
+
scheduling_method=scheduling_method,
|
75
|
+
basis_gates=basis_gates,
|
76
|
+
target=target,
|
77
|
+
)
|
78
|
+
init = plugin_manager.get_passmanager_stage(
|
79
|
+
"init", init_method, pass_manager_config, optimization_level=3
|
80
|
+
)
|
81
|
+
if coupling_map or initial_layout:
|
82
|
+
layout = plugin_manager.get_passmanager_stage(
|
83
|
+
"layout", layout_method, pass_manager_config, optimization_level=3
|
84
|
+
)
|
85
|
+
routing = routing_pm
|
86
|
+
else:
|
87
|
+
layout = None
|
88
|
+
routing = None
|
89
|
+
|
90
|
+
translation = plugin_manager.get_passmanager_stage(
|
91
|
+
"translation", translation_method, pass_manager_config, optimization_level=3
|
92
|
+
)
|
93
|
+
|
94
|
+
optimization = plugin_manager.get_passmanager_stage(
|
95
|
+
"optimization", optimization_method, pass_manager_config, optimization_level=3
|
96
|
+
)
|
97
|
+
|
98
|
+
sched = plugin_manager.get_passmanager_stage(
|
99
|
+
"scheduling", scheduling_method, pass_manager_config, optimization_level=3
|
100
|
+
)
|
101
|
+
|
102
|
+
return StagedPassManager(
|
103
|
+
pre_init=pre_init,
|
104
|
+
init=init,
|
105
|
+
layout=layout,
|
106
|
+
routing=routing,
|
107
|
+
translation=translation,
|
108
|
+
optimization=optimization,
|
109
|
+
scheduling=sched,
|
110
|
+
)
|
@@ -0,0 +1,346 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
.. _transpiler-preset-stage-plugins:
|
15
|
+
|
16
|
+
=======================================================================================
|
17
|
+
Transpiler Stage Plugin Interface (:mod:`qiskit.transpiler.preset_passmanagers.plugin`)
|
18
|
+
=======================================================================================
|
19
|
+
|
20
|
+
.. currentmodule:: qiskit.transpiler.preset_passmanagers.plugin
|
21
|
+
|
22
|
+
This module defines the plugin interface for providing custom stage
|
23
|
+
implementations for the preset pass managers and the :func:`~.transpile`
|
24
|
+
function. This enables external Python packages to provide
|
25
|
+
:class:`~.PassManager` objects that can be used for each named stage.
|
26
|
+
|
27
|
+
The plugin interfaces are built using setuptools
|
28
|
+
`entry points <https://setuptools.readthedocs.io/en/latest/userguide/entry_point.html>`__
|
29
|
+
which enable packages external to Qiskit to advertise they include a transpiler stage(s).
|
30
|
+
|
31
|
+
For details on how to instead write plugins for transpiler synthesis methods,
|
32
|
+
see :mod:`qiskit.transpiler.passes.synthesis.plugin`.
|
33
|
+
|
34
|
+
|
35
|
+
.. _stage_table:
|
36
|
+
|
37
|
+
Plugin Stages
|
38
|
+
=============
|
39
|
+
|
40
|
+
There are six stages in the preset pass managers, all of which actively
|
41
|
+
load external plugins using corresponding entry points. The following table summarizes
|
42
|
+
each stage. For more details on the description and expectations of each stage, follow the link
|
43
|
+
in the stages' names to the full documentation.
|
44
|
+
|
45
|
+
.. list-table:: Stages
|
46
|
+
:header-rows: 1
|
47
|
+
|
48
|
+
* - Stage Name
|
49
|
+
- Entry Point
|
50
|
+
- Reserved Names
|
51
|
+
- Summary
|
52
|
+
|
53
|
+
* - :ref:`init <transpiler-preset-stage-init>`
|
54
|
+
- ``qiskit.transpiler.init``
|
55
|
+
- ``default``
|
56
|
+
- High-level, logical optimizations on abstract circuits, and reduction of multi-qubit
|
57
|
+
operations to one- and two-qubit operations.
|
58
|
+
|
59
|
+
* - :ref:`layout <transpiler-preset-stage-layout>`
|
60
|
+
- ``qiskit.transpiler.layout``
|
61
|
+
- ``trivial``, ``dense``, ``sabre``, ``default``
|
62
|
+
- Choose an initial mapping of virtual qubits to physical qubits, including expansion of the
|
63
|
+
circuit to include explicit ancillas. This stage is sometimes combined with ``routing``.
|
64
|
+
|
65
|
+
* - :ref:`routing <transpiler-preset-stage-routing>`
|
66
|
+
- ``qiskit.transpiler.routing``
|
67
|
+
- ``default``, ``basic``, ``stochastic``, ``lookahead``, ``sabre``
|
68
|
+
- Insert gates into the circuit to ensure it matches the connectivity constraints of the
|
69
|
+
:class:`.Target`. The inserted gates do not need to be in the target ISA yet, so are often
|
70
|
+
just output as ``swap`` instructions. This stage is sometimes subsumed by ``layout``.
|
71
|
+
|
72
|
+
* - :ref:`translation <transpiler-preset-stage-translation>`
|
73
|
+
- ``qiskit.transpiler.translation``
|
74
|
+
- ``default``, ``translator``, ``synthesis``
|
75
|
+
- Rewrite all gates outside the target ISA to use only gates within the ISA.
|
76
|
+
|
77
|
+
* - :ref:`optimization <transpiler-preset-stage-optimization>`
|
78
|
+
- ``qiskit.transpiler.optimization``
|
79
|
+
- ``default``
|
80
|
+
- Low-level, physical-circuit-aware optimizations. Unlike ``init``, the ``optimization`` stage
|
81
|
+
acts at the level of a physical circuit.
|
82
|
+
|
83
|
+
* - :ref:`scheduling <transpiler-preset-stage-scheduling>`
|
84
|
+
- ``qiskit.transpiler.scheduling``
|
85
|
+
- ``alap``, ``asap``, ``default``
|
86
|
+
- Insert :class:`~.circuit.Delay` instructions to make the wall-clock timing of the circuit
|
87
|
+
fully explicit.
|
88
|
+
|
89
|
+
|
90
|
+
Writing Plugins
|
91
|
+
===============
|
92
|
+
|
93
|
+
To write a pass manager stage plugin there are 2 main steps. The first step is
|
94
|
+
to create a subclass of the abstract plugin class
|
95
|
+
:class:`~.PassManagerStagePlugin` which is used to define how the :class:`~.PassManager`
|
96
|
+
for the stage will be constructed. For example, to create a ``layout`` stage plugin that just
|
97
|
+
runs :class:`~.VF2Layout` (with increasing amount of trials, depending on the optimization level)
|
98
|
+
and falls back to using :class:`~.TrivialLayout` if
|
99
|
+
:class:`~VF2Layout` is unable to find a perfect layout::
|
100
|
+
|
101
|
+
from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin
|
102
|
+
from qiskit.transpiler.preset_passmanagers import common
|
103
|
+
from qiskit.transpiler import PassManager
|
104
|
+
from qiskit.transpiler.passes import VF2Layout, TrivialLayout
|
105
|
+
from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
|
106
|
+
|
107
|
+
|
108
|
+
def _vf2_match_not_found(property_set):
|
109
|
+
return property_set["layout"] is None or (
|
110
|
+
property_set["VF2Layout_stop_reason"] is not None
|
111
|
+
and property_set["VF2Layout_stop_reason"] is not VF2LayoutStopReason.SOLUTION_FOUND
|
112
|
+
|
113
|
+
|
114
|
+
class VF2LayoutPlugin(PassManagerStagePlugin):
|
115
|
+
|
116
|
+
def pass_manager(self, pass_manager_config, optimization_level):
|
117
|
+
layout_pm = PassManager(
|
118
|
+
[
|
119
|
+
VF2Layout(
|
120
|
+
coupling_map=pass_manager_config.coupling_map,
|
121
|
+
properties=pass_manager_config.backend_properties,
|
122
|
+
max_trials=optimization_level * 10 + 1
|
123
|
+
target=pass_manager_config.target
|
124
|
+
)
|
125
|
+
]
|
126
|
+
)
|
127
|
+
layout_pm.append(
|
128
|
+
TrivialLayout(pass_manager_config.coupling_map),
|
129
|
+
condition=_vf2_match_not_found,
|
130
|
+
)
|
131
|
+
layout_pm += common.generate_embed_passmanager(pass_manager_config.coupling_map)
|
132
|
+
return layout_pm
|
133
|
+
|
134
|
+
The second step is to expose the :class:`~.PassManagerStagePlugin`
|
135
|
+
subclass as a setuptools entry point in the package metadata. This can be done
|
136
|
+
an ``entry-points`` table in ``pyproject.toml`` for the plugin package with the necessary entry
|
137
|
+
points under the appropriate namespace for the stage your plugin is for. You can see the list of
|
138
|
+
stages, entry points, and expectations from the stage in :ref:`stage_table`. For example,
|
139
|
+
continuing from the example plugin above:
|
140
|
+
|
141
|
+
.. code-block:: toml
|
142
|
+
|
143
|
+
[project.entry-points."qiskit.transpiler.layout"]
|
144
|
+
"vf2" = "qiskit_plugin_pkg.module.plugin:VF2LayoutPlugin"
|
145
|
+
|
146
|
+
There isn't a limit to the number of plugins a single package can include as long as each plugin has
|
147
|
+
a unique name. So a single package can expose multiple plugins if necessary. Refer to
|
148
|
+
:ref:`stage_table` for a list of reserved names for each stage.
|
149
|
+
|
150
|
+
Plugin API
|
151
|
+
==========
|
152
|
+
|
153
|
+
.. autosummary::
|
154
|
+
:toctree: ../stubs/
|
155
|
+
|
156
|
+
PassManagerStagePlugin
|
157
|
+
PassManagerStagePluginManager
|
158
|
+
|
159
|
+
.. autofunction:: list_stage_plugins
|
160
|
+
.. autofunction:: passmanager_stage_plugins
|
161
|
+
"""
|
162
|
+
|
163
|
+
import abc
|
164
|
+
from typing import List, Optional, Dict
|
165
|
+
|
166
|
+
import stevedore
|
167
|
+
|
168
|
+
from qiskit.transpiler.passmanager import PassManager
|
169
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
170
|
+
from qiskit.transpiler.passmanager_config import PassManagerConfig
|
171
|
+
|
172
|
+
|
173
|
+
class PassManagerStagePlugin(abc.ABC):
|
174
|
+
"""A ``PassManagerStagePlugin`` is a plugin interface object for using custom
|
175
|
+
stages in :func:`~.transpile`.
|
176
|
+
|
177
|
+
A ``PassManagerStagePlugin`` object can be added to an external package and
|
178
|
+
integrated into the :func:`~.transpile` function with an entry point. This
|
179
|
+
will enable users to use the output of :meth:`.pass_manager` to implement
|
180
|
+
a stage in the compilation process.
|
181
|
+
"""
|
182
|
+
|
183
|
+
@abc.abstractmethod
|
184
|
+
def pass_manager(
|
185
|
+
self, pass_manager_config: PassManagerConfig, optimization_level: Optional[int] = None
|
186
|
+
) -> PassManager:
|
187
|
+
"""This method is designed to return a :class:`~.PassManager` for the stage this implements
|
188
|
+
|
189
|
+
Args:
|
190
|
+
pass_manager_config: A configuration object that defines all the target device
|
191
|
+
specifications and any user specified options to :func:`~.transpile` or
|
192
|
+
:func:`~.generate_preset_pass_manager`
|
193
|
+
optimization_level: The optimization level of the transpilation, if set this
|
194
|
+
should be used to set values for any tunable parameters to trade off runtime
|
195
|
+
for potential optimization. Valid values should be ``0``, ``1``, ``2``, or ``3``
|
196
|
+
and the higher the number the more optimization is expected.
|
197
|
+
"""
|
198
|
+
pass
|
199
|
+
|
200
|
+
|
201
|
+
class PassManagerStagePluginManager:
|
202
|
+
"""Manager class for preset pass manager stage plugins."""
|
203
|
+
|
204
|
+
def __init__(self):
|
205
|
+
super().__init__()
|
206
|
+
self.init_plugins = stevedore.ExtensionManager(
|
207
|
+
"qiskit.transpiler.init", invoke_on_load=True, propagate_map_exceptions=True
|
208
|
+
)
|
209
|
+
self.layout_plugins = stevedore.ExtensionManager(
|
210
|
+
"qiskit.transpiler.layout", invoke_on_load=True, propagate_map_exceptions=True
|
211
|
+
)
|
212
|
+
self.routing_plugins = stevedore.ExtensionManager(
|
213
|
+
"qiskit.transpiler.routing", invoke_on_load=True, propagate_map_exceptions=True
|
214
|
+
)
|
215
|
+
self.translation_plugins = stevedore.ExtensionManager(
|
216
|
+
"qiskit.transpiler.translation", invoke_on_load=True, propagate_map_exceptions=True
|
217
|
+
)
|
218
|
+
self.optimization_plugins = stevedore.ExtensionManager(
|
219
|
+
"qiskit.transpiler.optimization", invoke_on_load=True, propagate_map_exceptions=True
|
220
|
+
)
|
221
|
+
self.scheduling_plugins = stevedore.ExtensionManager(
|
222
|
+
"qiskit.transpiler.scheduling", invoke_on_load=True, propagate_map_exceptions=True
|
223
|
+
)
|
224
|
+
|
225
|
+
def get_passmanager_stage(
|
226
|
+
self,
|
227
|
+
stage_name: str,
|
228
|
+
plugin_name: str,
|
229
|
+
pm_config: PassManagerConfig,
|
230
|
+
optimization_level=None,
|
231
|
+
) -> PassManager:
|
232
|
+
"""Get a stage"""
|
233
|
+
if stage_name == "init":
|
234
|
+
return self._build_pm(
|
235
|
+
self.init_plugins, stage_name, plugin_name, pm_config, optimization_level
|
236
|
+
)
|
237
|
+
elif stage_name == "layout":
|
238
|
+
return self._build_pm(
|
239
|
+
self.layout_plugins, stage_name, plugin_name, pm_config, optimization_level
|
240
|
+
)
|
241
|
+
elif stage_name == "routing":
|
242
|
+
return self._build_pm(
|
243
|
+
self.routing_plugins, stage_name, plugin_name, pm_config, optimization_level
|
244
|
+
)
|
245
|
+
elif stage_name == "translation":
|
246
|
+
return self._build_pm(
|
247
|
+
self.translation_plugins, stage_name, plugin_name, pm_config, optimization_level
|
248
|
+
)
|
249
|
+
elif stage_name == "optimization":
|
250
|
+
return self._build_pm(
|
251
|
+
self.optimization_plugins, stage_name, plugin_name, pm_config, optimization_level
|
252
|
+
)
|
253
|
+
elif stage_name == "scheduling":
|
254
|
+
return self._build_pm(
|
255
|
+
self.scheduling_plugins, stage_name, plugin_name, pm_config, optimization_level
|
256
|
+
)
|
257
|
+
else:
|
258
|
+
raise TranspilerError(f"Invalid stage name: {stage_name}")
|
259
|
+
|
260
|
+
def _build_pm(
|
261
|
+
self,
|
262
|
+
stage_obj: stevedore.ExtensionManager,
|
263
|
+
stage_name: str,
|
264
|
+
plugin_name: str,
|
265
|
+
pm_config: PassManagerConfig,
|
266
|
+
optimization_level: Optional[int] = None,
|
267
|
+
):
|
268
|
+
if plugin_name not in stage_obj:
|
269
|
+
raise TranspilerError(f"Invalid plugin name {plugin_name} for stage {stage_name}")
|
270
|
+
plugin_obj = stage_obj[plugin_name]
|
271
|
+
return plugin_obj.obj.pass_manager(pm_config, optimization_level)
|
272
|
+
|
273
|
+
|
274
|
+
def list_stage_plugins(stage_name: str) -> List[str]:
|
275
|
+
"""Get a list of installed plugins for a stage.
|
276
|
+
|
277
|
+
Args:
|
278
|
+
stage_name: The stage name to get the plugin names for
|
279
|
+
|
280
|
+
Returns:
|
281
|
+
plugins: The list of installed plugin names for the specified stages
|
282
|
+
|
283
|
+
Raises:
|
284
|
+
TranspilerError: If an invalid stage name is specified.
|
285
|
+
"""
|
286
|
+
plugin_mgr = PassManagerStagePluginManager()
|
287
|
+
if stage_name == "init":
|
288
|
+
return plugin_mgr.init_plugins.names()
|
289
|
+
elif stage_name == "layout":
|
290
|
+
return plugin_mgr.layout_plugins.names()
|
291
|
+
elif stage_name == "routing":
|
292
|
+
return plugin_mgr.routing_plugins.names()
|
293
|
+
elif stage_name == "translation":
|
294
|
+
return plugin_mgr.translation_plugins.names()
|
295
|
+
elif stage_name == "optimization":
|
296
|
+
return plugin_mgr.optimization_plugins.names()
|
297
|
+
elif stage_name == "scheduling":
|
298
|
+
return plugin_mgr.scheduling_plugins.names()
|
299
|
+
else:
|
300
|
+
raise TranspilerError(f"Invalid stage name: {stage_name}")
|
301
|
+
|
302
|
+
|
303
|
+
def passmanager_stage_plugins(stage: str) -> Dict[str, PassManagerStagePlugin]:
|
304
|
+
"""Return a dict with, for each stage name, the class type of the plugin.
|
305
|
+
|
306
|
+
This function is useful for getting more information about a plugin:
|
307
|
+
|
308
|
+
.. plot::
|
309
|
+
:include-source:
|
310
|
+
:nofigs:
|
311
|
+
|
312
|
+
from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins
|
313
|
+
routing_plugins = passmanager_stage_plugins('routing')
|
314
|
+
basic_plugin = routing_plugins['basic']
|
315
|
+
help(basic_plugin)
|
316
|
+
|
317
|
+
.. code-block:: text
|
318
|
+
|
319
|
+
Help on BasicSwapPassManager in module ...preset_passmanagers.builtin_plugins object:
|
320
|
+
|
321
|
+
class BasicSwapPassManager(...preset_passmanagers.plugin.PassManagerStagePlugin)
|
322
|
+
| Plugin class for routing stage with :class:`~.BasicSwap`
|
323
|
+
|
|
324
|
+
| Method resolution order:
|
325
|
+
| BasicSwapPassManager
|
326
|
+
| ...preset_passmanagers.plugin.PassManagerStagePlugin
|
327
|
+
| abc.ABC
|
328
|
+
| builtins.object
|
329
|
+
...
|
330
|
+
|
331
|
+
Args:
|
332
|
+
stage: The stage name to get
|
333
|
+
|
334
|
+
Returns:
|
335
|
+
dict: the key is the name of the plugin and the value is the class type for each.
|
336
|
+
|
337
|
+
Raises:
|
338
|
+
TranspilerError: If an invalid stage name is specified.
|
339
|
+
"""
|
340
|
+
plugin_mgr = PassManagerStagePluginManager()
|
341
|
+
try:
|
342
|
+
manager = getattr(plugin_mgr, f"{stage}_plugins")
|
343
|
+
except AttributeError as exc:
|
344
|
+
raise TranspilerError(f"Passmanager stage {stage} not found") from exc
|
345
|
+
|
346
|
+
return {name: manager[name].obj for name in manager.names()}
|