qiskit 2.0.3__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 +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -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 +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -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 +163 -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 +157 -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 +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -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 +316 -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 +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -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 +198 -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 +217 -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 +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -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 +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -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 +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -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 +193 -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 +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -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 +188 -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 +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -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 +81 -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 +374 -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 +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +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 +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +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 +23 -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 +558 -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 +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/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/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +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 +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -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 +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_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 +639 -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 +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -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 +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -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 +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -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 +1963 -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 +313 -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 +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -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 +354 -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 +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -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/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.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,672 @@
|
|
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
|
+
"""Common preset passmanager generators."""
|
15
|
+
|
16
|
+
import collections
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
|
20
|
+
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
21
|
+
|
22
|
+
from qiskit.passmanager.flow_controllers import ConditionalController
|
23
|
+
from qiskit.transpiler.passmanager import PassManager
|
24
|
+
from qiskit.transpiler.passes import Error
|
25
|
+
from qiskit.transpiler.passes import BasisTranslator
|
26
|
+
from qiskit.transpiler.passes import Unroll3qOrMore
|
27
|
+
from qiskit.transpiler.passes import ConsolidateBlocks
|
28
|
+
from qiskit.transpiler.passes import Collect1qRuns
|
29
|
+
from qiskit.transpiler.passes import Collect2qBlocks
|
30
|
+
from qiskit.transpiler.passes import UnitarySynthesis
|
31
|
+
from qiskit.transpiler.passes import HighLevelSynthesis
|
32
|
+
from qiskit.transpiler.passes import CheckMap
|
33
|
+
from qiskit.transpiler.passes import GateDirection
|
34
|
+
from qiskit.transpiler.passes import BarrierBeforeFinalMeasurements
|
35
|
+
from qiskit.transpiler.passes import CheckGateDirection
|
36
|
+
from qiskit.transpiler.passes import TimeUnitConversion
|
37
|
+
from qiskit.transpiler.passes import ALAPScheduleAnalysis
|
38
|
+
from qiskit.transpiler.passes import ASAPScheduleAnalysis
|
39
|
+
from qiskit.transpiler.passes import FullAncillaAllocation
|
40
|
+
from qiskit.transpiler.passes import EnlargeWithAncilla
|
41
|
+
from qiskit.transpiler.passes import ApplyLayout
|
42
|
+
from qiskit.transpiler.passes import RemoveResetInZeroState
|
43
|
+
from qiskit.transpiler.passes import FilterOpNodes
|
44
|
+
from qiskit.transpiler.passes import PadDelay
|
45
|
+
from qiskit.transpiler.passes import InstructionDurationCheck
|
46
|
+
from qiskit.transpiler.passes import ConstrainedReschedule
|
47
|
+
from qiskit.transpiler.passes import ContainsInstruction
|
48
|
+
from qiskit.transpiler.passes import VF2PostLayout
|
49
|
+
from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
|
50
|
+
from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayoutStopReason
|
51
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
52
|
+
from qiskit.transpiler.layout import Layout
|
53
|
+
from qiskit.utils import deprecate_func
|
54
|
+
|
55
|
+
|
56
|
+
_ControlFlowState = collections.namedtuple("_ControlFlowState", ("working", "not_working"))
|
57
|
+
|
58
|
+
# Any method neither known good nor known bad (i.e. not a Terra-internal pass) is passed through
|
59
|
+
# without error, since it is being supplied by a plugin and we don't have any knowledge of these.
|
60
|
+
_CONTROL_FLOW_STATES = {
|
61
|
+
"layout_method": _ControlFlowState(
|
62
|
+
working={"default", "trivial", "dense", "sabre"}, not_working=set()
|
63
|
+
),
|
64
|
+
"routing_method": _ControlFlowState(
|
65
|
+
working={"default", "none", "stochastic", "sabre"}, not_working={"lookahead", "basic"}
|
66
|
+
),
|
67
|
+
"translation_method": _ControlFlowState(
|
68
|
+
working={"default", "translator", "synthesis"},
|
69
|
+
not_working=set(),
|
70
|
+
),
|
71
|
+
"optimization_method": _ControlFlowState(working={"default"}, not_working=set()),
|
72
|
+
"scheduling_method": _ControlFlowState(working=set(), not_working={"alap", "asap"}),
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
def _has_control_flow(property_set):
|
77
|
+
return any(property_set[f"contains_{x}"] for x in CONTROL_FLOW_OP_NAMES)
|
78
|
+
|
79
|
+
|
80
|
+
def _without_control_flow(property_set):
|
81
|
+
return not any(property_set[f"contains_{x}"] for x in CONTROL_FLOW_OP_NAMES)
|
82
|
+
|
83
|
+
|
84
|
+
class _InvalidControlFlowForBackend:
|
85
|
+
# Explicitly stateful closure to allow pickling.
|
86
|
+
|
87
|
+
def __init__(self, basis_gates=(), target=None):
|
88
|
+
if target is not None and len(target.operation_names) > 0:
|
89
|
+
self.unsupported = [op for op in CONTROL_FLOW_OP_NAMES if op not in target]
|
90
|
+
elif basis_gates is not None and len(basis_gates) > 0:
|
91
|
+
basis_gates = set(basis_gates)
|
92
|
+
self.unsupported = [op for op in CONTROL_FLOW_OP_NAMES if op not in basis_gates]
|
93
|
+
else:
|
94
|
+
# Pass manager without basis gates or target; assume everything's valid.
|
95
|
+
self.unsupported = []
|
96
|
+
|
97
|
+
def message(self, property_set):
|
98
|
+
"""Create an error message for the given property set."""
|
99
|
+
fails = [x for x in self.unsupported if property_set[f"contains_{x}"]]
|
100
|
+
if len(fails) == 1:
|
101
|
+
return f"The control-flow construct '{fails[0]}' is not supported by the backend."
|
102
|
+
return (
|
103
|
+
f"The control-flow constructs [{', '.join(repr(op) for op in fails)}]"
|
104
|
+
" are not supported by the backend."
|
105
|
+
)
|
106
|
+
|
107
|
+
def condition(self, property_set):
|
108
|
+
"""Checkable condition for the given property set."""
|
109
|
+
return any(property_set[f"contains_{x}"] for x in self.unsupported)
|
110
|
+
|
111
|
+
|
112
|
+
def generate_control_flow_options_check(
|
113
|
+
layout_method=None,
|
114
|
+
routing_method=None,
|
115
|
+
translation_method=None,
|
116
|
+
optimization_method=None,
|
117
|
+
scheduling_method=None,
|
118
|
+
basis_gates=(),
|
119
|
+
target=None,
|
120
|
+
):
|
121
|
+
"""Generate a pass manager that, when run on a DAG that contains control flow, fails with an
|
122
|
+
error message explaining the invalid options, and what could be used instead.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
PassManager: a pass manager that populates the ``contains_x`` properties for each of the
|
126
|
+
control-flow operations, and raises an error if any of the given options do not support
|
127
|
+
control flow, but a circuit with control flow is given.
|
128
|
+
"""
|
129
|
+
bad_options = []
|
130
|
+
message = "Some options cannot be used with control flow."
|
131
|
+
for stage, given in [
|
132
|
+
("layout", layout_method),
|
133
|
+
("routing", routing_method),
|
134
|
+
("translation", translation_method),
|
135
|
+
("optimization", optimization_method),
|
136
|
+
("scheduling", scheduling_method),
|
137
|
+
]:
|
138
|
+
option = stage + "_method"
|
139
|
+
method_states = _CONTROL_FLOW_STATES[option]
|
140
|
+
if given is not None and given in method_states.not_working:
|
141
|
+
if method_states.working:
|
142
|
+
message += (
|
143
|
+
f" Got {option}='{given}', but valid values are {list(method_states.working)}."
|
144
|
+
)
|
145
|
+
else:
|
146
|
+
message += (
|
147
|
+
f" Got {option}='{given}', but the entire {stage} stage is not supported."
|
148
|
+
)
|
149
|
+
bad_options.append(option)
|
150
|
+
out = PassManager()
|
151
|
+
out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
|
152
|
+
if bad_options:
|
153
|
+
out.append(ConditionalController(Error(message), condition=_has_control_flow))
|
154
|
+
backend_control = _InvalidControlFlowForBackend(basis_gates, target)
|
155
|
+
out.append(
|
156
|
+
ConditionalController(Error(backend_control.message), condition=backend_control.condition)
|
157
|
+
)
|
158
|
+
return out
|
159
|
+
|
160
|
+
|
161
|
+
def generate_error_on_control_flow(message):
|
162
|
+
"""Get a pass manager that always raises an error if control flow is present in a given
|
163
|
+
circuit."""
|
164
|
+
out = PassManager()
|
165
|
+
out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
|
166
|
+
out.append(ConditionalController(Error(message), condition=_has_control_flow))
|
167
|
+
return out
|
168
|
+
|
169
|
+
|
170
|
+
def if_has_control_flow_else(if_present, if_absent):
|
171
|
+
"""Generate a pass manager that will run the passes in ``if_present`` if the given circuit
|
172
|
+
has control-flow operations in it, and those in ``if_absent`` if it doesn't."""
|
173
|
+
if isinstance(if_present, PassManager):
|
174
|
+
if_present = if_present.to_flow_controller()
|
175
|
+
if isinstance(if_absent, PassManager):
|
176
|
+
if_absent = if_absent.to_flow_controller()
|
177
|
+
out = PassManager()
|
178
|
+
out.append(ContainsInstruction(CONTROL_FLOW_OP_NAMES, recurse=False))
|
179
|
+
out.append(ConditionalController(if_present, condition=_has_control_flow))
|
180
|
+
out.append(ConditionalController(if_absent, condition=_without_control_flow))
|
181
|
+
return out
|
182
|
+
|
183
|
+
|
184
|
+
def generate_unroll_3q(
|
185
|
+
target,
|
186
|
+
basis_gates=None,
|
187
|
+
approximation_degree=None,
|
188
|
+
unitary_synthesis_method="default",
|
189
|
+
unitary_synthesis_plugin_config=None,
|
190
|
+
hls_config=None,
|
191
|
+
qubits_initially_zero=True,
|
192
|
+
):
|
193
|
+
"""Generate an unroll >3q :class:`~qiskit.transpiler.PassManager`
|
194
|
+
|
195
|
+
Args:
|
196
|
+
target (Target): the :class:`~.Target` object representing the backend
|
197
|
+
basis_gates (list): A list of str gate names that represent the basis
|
198
|
+
gates on the backend target
|
199
|
+
approximation_degree (Optional[float]): The heuristic approximation degree to
|
200
|
+
use. Can be between 0 and 1.
|
201
|
+
unitary_synthesis_method (str): The unitary synthesis method to use. You can see
|
202
|
+
a list of installed plugins with :func:`.unitary_synthesis_plugin_names`.
|
203
|
+
unitary_synthesis_plugin_config (dict): The optional dictionary plugin
|
204
|
+
configuration, this is plugin specific refer to the specified plugin's
|
205
|
+
documentation for how to use.
|
206
|
+
hls_config (HLSConfig): An optional configuration class to use for
|
207
|
+
:class:`~qiskit.transpiler.passes.HighLevelSynthesis` pass.
|
208
|
+
Specifies how to synthesize various high-level objects.
|
209
|
+
qubits_initially_zero (bool): Indicates whether the input circuit is
|
210
|
+
zero-initialized.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
PassManager: The unroll 3q or more pass manager
|
214
|
+
"""
|
215
|
+
unroll_3q = PassManager()
|
216
|
+
unroll_3q.append(
|
217
|
+
UnitarySynthesis(
|
218
|
+
basis_gates,
|
219
|
+
approximation_degree=approximation_degree,
|
220
|
+
method=unitary_synthesis_method,
|
221
|
+
min_qubits=3,
|
222
|
+
plugin_config=unitary_synthesis_plugin_config,
|
223
|
+
target=target,
|
224
|
+
)
|
225
|
+
)
|
226
|
+
unroll_3q.append(
|
227
|
+
HighLevelSynthesis(
|
228
|
+
hls_config=hls_config,
|
229
|
+
coupling_map=None,
|
230
|
+
target=target,
|
231
|
+
use_qubit_indices=False,
|
232
|
+
equivalence_library=sel,
|
233
|
+
basis_gates=basis_gates,
|
234
|
+
min_qubits=3,
|
235
|
+
qubits_initially_zero=qubits_initially_zero,
|
236
|
+
)
|
237
|
+
)
|
238
|
+
# If there are no target instructions revert to using unroll3qormore so
|
239
|
+
# routing works.
|
240
|
+
if basis_gates is None and target is None:
|
241
|
+
unroll_3q.append(Unroll3qOrMore(target, basis_gates))
|
242
|
+
else:
|
243
|
+
unroll_3q.append(BasisTranslator(sel, basis_gates, target=target, min_qubits=3))
|
244
|
+
return unroll_3q
|
245
|
+
|
246
|
+
|
247
|
+
def generate_embed_passmanager(coupling_map):
|
248
|
+
"""Generate a layout embedding :class:`~qiskit.transpiler.PassManager`
|
249
|
+
|
250
|
+
This is used to generate a :class:`~qiskit.transpiler.PassManager` object
|
251
|
+
that can be used to expand and apply an initial layout to a circuit
|
252
|
+
|
253
|
+
Args:
|
254
|
+
coupling_map (Union[CouplingMap, Target): The coupling map for the backend to embed
|
255
|
+
the circuit to.
|
256
|
+
Returns:
|
257
|
+
PassManager: The embedding passmanager that assumes the layout property
|
258
|
+
set has been set in earlier stages
|
259
|
+
"""
|
260
|
+
return PassManager([FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), ApplyLayout()])
|
261
|
+
|
262
|
+
|
263
|
+
def _layout_not_perfect(property_set):
|
264
|
+
"""Return ``True`` if the first attempt at layout has been checked and found to be imperfect.
|
265
|
+
In this case, perfection means "does not require any swap routing"."""
|
266
|
+
return property_set["is_swap_mapped"] is not None and not property_set["is_swap_mapped"]
|
267
|
+
|
268
|
+
|
269
|
+
def _apply_post_layout_condition(property_set):
|
270
|
+
# if VF2 Post layout found a solution we need to re-apply the better
|
271
|
+
# layout. Otherwise we can skip apply layout.
|
272
|
+
return (
|
273
|
+
property_set["VF2PostLayout_stop_reason"] is not None
|
274
|
+
and property_set["VF2PostLayout_stop_reason"] is VF2PostLayoutStopReason.SOLUTION_FOUND
|
275
|
+
)
|
276
|
+
|
277
|
+
|
278
|
+
def generate_routing_passmanager(
|
279
|
+
routing_pass,
|
280
|
+
target,
|
281
|
+
coupling_map=None,
|
282
|
+
vf2_call_limit=None,
|
283
|
+
seed_transpiler=-1,
|
284
|
+
check_trivial=False,
|
285
|
+
use_barrier_before_measurement=True,
|
286
|
+
vf2_max_trials=None,
|
287
|
+
):
|
288
|
+
"""Generate a routing :class:`~qiskit.transpiler.PassManager`
|
289
|
+
|
290
|
+
Args:
|
291
|
+
routing_pass (TransformationPass): The pass which will perform the
|
292
|
+
routing
|
293
|
+
target (Target): the :class:`~.Target` object representing the backend
|
294
|
+
coupling_map (CouplingMap): The coupling map of the backend to route
|
295
|
+
for
|
296
|
+
vf2_call_limit (int): The internal call limit for the vf2 post layout
|
297
|
+
pass. If this is ``None`` or ``0`` the vf2 post layout will not be
|
298
|
+
run.
|
299
|
+
seed_transpiler (int): Sets random seed for the stochastic parts of
|
300
|
+
the transpiler. This is currently only used for :class:`.VF2PostLayout` and the
|
301
|
+
default value of ``-1`` is strongly recommended (which is no randomization).
|
302
|
+
If a value of ``None`` is provided this will seed from system
|
303
|
+
entropy.
|
304
|
+
check_trivial (bool): If set to true this will condition running the
|
305
|
+
:class:`~.VF2PostLayout` pass after routing on whether a trivial
|
306
|
+
layout was tried and was found to not be perfect. This is only
|
307
|
+
needed if the constructed pass manager runs :class:`~.TrivialLayout`
|
308
|
+
as a first layout attempt and uses it if it's a perfect layout
|
309
|
+
(as is the case with preset pass manager level 1).
|
310
|
+
use_barrier_before_measurement (bool): If true (the default) the
|
311
|
+
:class:`~.BarrierBeforeFinalMeasurements` transpiler pass will be run prior to the
|
312
|
+
specified pass in the ``routing_pass`` argument.
|
313
|
+
vf2_max_trials (int): The maximum number of trials to run VF2 when
|
314
|
+
evaluating the vf2 post layout
|
315
|
+
pass. If this is ``None`` or ``0`` the vf2 post layout will not be run.
|
316
|
+
Returns:
|
317
|
+
PassManager: The routing pass manager
|
318
|
+
"""
|
319
|
+
|
320
|
+
def _run_post_layout_condition(property_set):
|
321
|
+
# If we check trivial layout and the found trivial layout was not perfect also
|
322
|
+
# ensure VF2 initial layout was not used before running vf2 post layout
|
323
|
+
if not check_trivial or _layout_not_perfect(property_set):
|
324
|
+
vf2_stop_reason = property_set["VF2Layout_stop_reason"]
|
325
|
+
if vf2_stop_reason is None or vf2_stop_reason != VF2LayoutStopReason.SOLUTION_FOUND:
|
326
|
+
return True
|
327
|
+
return False
|
328
|
+
|
329
|
+
routing = PassManager()
|
330
|
+
if target is not None:
|
331
|
+
routing.append(CheckMap(target, property_set_field="routing_not_needed"))
|
332
|
+
else:
|
333
|
+
routing.append(CheckMap(coupling_map, property_set_field="routing_not_needed"))
|
334
|
+
|
335
|
+
def _swap_condition(property_set):
|
336
|
+
return not property_set["routing_not_needed"]
|
337
|
+
|
338
|
+
if use_barrier_before_measurement:
|
339
|
+
routing.append(
|
340
|
+
ConditionalController(
|
341
|
+
[
|
342
|
+
BarrierBeforeFinalMeasurements(
|
343
|
+
label="qiskit.transpiler.internal.routing.protection.barrier"
|
344
|
+
),
|
345
|
+
routing_pass,
|
346
|
+
],
|
347
|
+
condition=_swap_condition,
|
348
|
+
)
|
349
|
+
)
|
350
|
+
else:
|
351
|
+
routing.append(ConditionalController(routing_pass, condition=_swap_condition))
|
352
|
+
|
353
|
+
is_vf2_fully_bounded = vf2_call_limit and vf2_max_trials
|
354
|
+
if target is not None and is_vf2_fully_bounded:
|
355
|
+
routing.append(
|
356
|
+
ConditionalController(
|
357
|
+
VF2PostLayout(
|
358
|
+
target,
|
359
|
+
seed=seed_transpiler,
|
360
|
+
call_limit=vf2_call_limit,
|
361
|
+
max_trials=vf2_max_trials,
|
362
|
+
strict_direction=False,
|
363
|
+
),
|
364
|
+
condition=_run_post_layout_condition,
|
365
|
+
)
|
366
|
+
)
|
367
|
+
routing.append(ConditionalController(ApplyLayout(), condition=_apply_post_layout_condition))
|
368
|
+
|
369
|
+
def filter_fn(node):
|
370
|
+
return node.label != "qiskit.transpiler.internal.routing.protection.barrier"
|
371
|
+
|
372
|
+
routing.append([FilterOpNodes(filter_fn)])
|
373
|
+
|
374
|
+
return routing
|
375
|
+
|
376
|
+
|
377
|
+
@deprecate_func(
|
378
|
+
since="2.0",
|
379
|
+
additional_msg=(
|
380
|
+
"Translation plugins are now required to respect ISA directionality,"
|
381
|
+
" so typically no replacement is necessary."
|
382
|
+
),
|
383
|
+
removal_timeline="in Qiskit 3.0",
|
384
|
+
)
|
385
|
+
def generate_pre_op_passmanager(target=None, coupling_map=None, remove_reset_in_zero=False):
|
386
|
+
"""Generate a pre-optimization loop :class:`~qiskit.transpiler.PassManager`
|
387
|
+
|
388
|
+
This pass manager will check to ensure that directionality from the coupling
|
389
|
+
map is respected.
|
390
|
+
|
391
|
+
Args:
|
392
|
+
target (Target): the :class:`~.Target` object representing the backend
|
393
|
+
coupling_map (CouplingMap): The coupling map to use
|
394
|
+
remove_reset_in_zero (bool): If ``True`` include the remove reset in
|
395
|
+
zero pass in the generated PassManager
|
396
|
+
Returns:
|
397
|
+
PassManager: The pass manager
|
398
|
+
|
399
|
+
"""
|
400
|
+
pre_opt = PassManager()
|
401
|
+
if coupling_map:
|
402
|
+
pre_opt.append(CheckGateDirection(coupling_map, target=target))
|
403
|
+
|
404
|
+
def _direction_condition(property_set):
|
405
|
+
return not property_set["is_direction_mapped"]
|
406
|
+
|
407
|
+
pre_opt.append(
|
408
|
+
ConditionalController(
|
409
|
+
[GateDirection(coupling_map, target=target)],
|
410
|
+
condition=_direction_condition,
|
411
|
+
)
|
412
|
+
)
|
413
|
+
if remove_reset_in_zero:
|
414
|
+
pre_opt.append(RemoveResetInZeroState())
|
415
|
+
return pre_opt
|
416
|
+
|
417
|
+
|
418
|
+
def generate_translation_passmanager(
|
419
|
+
target,
|
420
|
+
basis_gates=None,
|
421
|
+
method="translator",
|
422
|
+
approximation_degree=None,
|
423
|
+
coupling_map=None,
|
424
|
+
unitary_synthesis_method="default",
|
425
|
+
unitary_synthesis_plugin_config=None,
|
426
|
+
hls_config=None,
|
427
|
+
qubits_initially_zero=True,
|
428
|
+
):
|
429
|
+
"""Generate a basis translation :class:`~qiskit.transpiler.PassManager`
|
430
|
+
|
431
|
+
Args:
|
432
|
+
target (Target): the :class:`~.Target` object representing the backend
|
433
|
+
basis_gates (list): A list of str gate names that represent the basis
|
434
|
+
gates on the backend target
|
435
|
+
method (str): The basis translation method to use
|
436
|
+
approximation_degree (Optional[float]): The heuristic approximation degree to
|
437
|
+
use. Can be between 0 and 1.
|
438
|
+
coupling_map (CouplingMap): the coupling map of the backend
|
439
|
+
in case synthesis is done on a physical circuit. The
|
440
|
+
directionality of the coupling_map will be taken into
|
441
|
+
account if pulse_optimize is True/None and natural_direction
|
442
|
+
is True/None.
|
443
|
+
unitary_synthesis_plugin_config (dict): The optional dictionary plugin
|
444
|
+
configuration, this is plugin specific refer to the specified plugin's
|
445
|
+
documentation for how to use.
|
446
|
+
unitary_synthesis_method (str): The unitary synthesis method to use. You can
|
447
|
+
see a list of installed plugins with :func:`.unitary_synthesis_plugin_names`.
|
448
|
+
hls_config (HLSConfig): An optional configuration class to use for
|
449
|
+
:class:`~qiskit.transpiler.passes.HighLevelSynthesis` pass.
|
450
|
+
Specifies how to synthesize various high-level objects.
|
451
|
+
qubits_initially_zero (bool): Indicates whether the input circuit is
|
452
|
+
zero-initialized.
|
453
|
+
|
454
|
+
Returns:
|
455
|
+
PassManager: The basis translation pass manager
|
456
|
+
|
457
|
+
Raises:
|
458
|
+
TranspilerError: If the ``method`` kwarg is not a valid value
|
459
|
+
"""
|
460
|
+
if basis_gates is None and target is None:
|
461
|
+
return PassManager([])
|
462
|
+
|
463
|
+
if method == "translator":
|
464
|
+
translator = BasisTranslator(sel, basis_gates, target)
|
465
|
+
unroll = [
|
466
|
+
# Use unitary synthesis for basis aware decomposition of
|
467
|
+
# UnitaryGates before custom unrolling
|
468
|
+
UnitarySynthesis(
|
469
|
+
basis_gates,
|
470
|
+
approximation_degree=approximation_degree,
|
471
|
+
coupling_map=coupling_map,
|
472
|
+
plugin_config=unitary_synthesis_plugin_config,
|
473
|
+
method=unitary_synthesis_method,
|
474
|
+
target=target,
|
475
|
+
),
|
476
|
+
HighLevelSynthesis(
|
477
|
+
hls_config=hls_config,
|
478
|
+
coupling_map=coupling_map,
|
479
|
+
target=target,
|
480
|
+
use_qubit_indices=True,
|
481
|
+
equivalence_library=sel,
|
482
|
+
basis_gates=basis_gates,
|
483
|
+
qubits_initially_zero=qubits_initially_zero,
|
484
|
+
),
|
485
|
+
translator,
|
486
|
+
]
|
487
|
+
fix_1q = [translator]
|
488
|
+
elif method == "synthesis":
|
489
|
+
unroll = [
|
490
|
+
# # Use unitary synthesis for basis aware decomposition of
|
491
|
+
# UnitaryGates > 2q before collection
|
492
|
+
UnitarySynthesis(
|
493
|
+
basis_gates,
|
494
|
+
approximation_degree=approximation_degree,
|
495
|
+
coupling_map=coupling_map,
|
496
|
+
plugin_config=unitary_synthesis_plugin_config,
|
497
|
+
method=unitary_synthesis_method,
|
498
|
+
min_qubits=3,
|
499
|
+
target=target,
|
500
|
+
),
|
501
|
+
HighLevelSynthesis(
|
502
|
+
hls_config=hls_config,
|
503
|
+
coupling_map=coupling_map,
|
504
|
+
target=target,
|
505
|
+
use_qubit_indices=True,
|
506
|
+
basis_gates=basis_gates,
|
507
|
+
min_qubits=3,
|
508
|
+
qubits_initially_zero=qubits_initially_zero,
|
509
|
+
),
|
510
|
+
Unroll3qOrMore(target=target, basis_gates=basis_gates),
|
511
|
+
Collect2qBlocks(),
|
512
|
+
Collect1qRuns(),
|
513
|
+
ConsolidateBlocks(
|
514
|
+
basis_gates=basis_gates, target=target, approximation_degree=approximation_degree
|
515
|
+
),
|
516
|
+
UnitarySynthesis(
|
517
|
+
basis_gates=basis_gates,
|
518
|
+
approximation_degree=approximation_degree,
|
519
|
+
coupling_map=coupling_map,
|
520
|
+
plugin_config=unitary_synthesis_plugin_config,
|
521
|
+
method=unitary_synthesis_method,
|
522
|
+
target=target,
|
523
|
+
),
|
524
|
+
HighLevelSynthesis(
|
525
|
+
hls_config=hls_config,
|
526
|
+
coupling_map=coupling_map,
|
527
|
+
target=target,
|
528
|
+
use_qubit_indices=True,
|
529
|
+
basis_gates=basis_gates,
|
530
|
+
qubits_initially_zero=qubits_initially_zero,
|
531
|
+
),
|
532
|
+
]
|
533
|
+
fix_1q = [
|
534
|
+
Collect1qRuns(),
|
535
|
+
ConsolidateBlocks(
|
536
|
+
basis_gates=basis_gates, target=target, approximation_degree=approximation_degree
|
537
|
+
),
|
538
|
+
UnitarySynthesis(
|
539
|
+
basis_gates=basis_gates,
|
540
|
+
approximation_degree=approximation_degree,
|
541
|
+
coupling_map=coupling_map,
|
542
|
+
plugin_config=unitary_synthesis_plugin_config,
|
543
|
+
method=unitary_synthesis_method,
|
544
|
+
target=target,
|
545
|
+
),
|
546
|
+
]
|
547
|
+
else:
|
548
|
+
raise TranspilerError(f"Invalid translation method {method}.")
|
549
|
+
# Our built-ins don't 100% guarantee that 2q gate direction is respected, so we might need to
|
550
|
+
# run a little bit of fix up on them. `GateDirection` doesn't guarantee that 1q gates are
|
551
|
+
# ISA safe after it runs, so we need another run too.
|
552
|
+
if (coupling_map and not coupling_map.is_symmetric) or (
|
553
|
+
target is not None and target.get_non_global_operation_names(strict_direction=True)
|
554
|
+
):
|
555
|
+
unroll.append(CheckGateDirection(coupling_map, target=target))
|
556
|
+
|
557
|
+
def _direction_condition(property_set):
|
558
|
+
return not property_set["is_direction_mapped"]
|
559
|
+
|
560
|
+
unroll.append(
|
561
|
+
ConditionalController(
|
562
|
+
[GateDirection(coupling_map, target=target)] + fix_1q,
|
563
|
+
condition=_direction_condition,
|
564
|
+
)
|
565
|
+
)
|
566
|
+
return PassManager(unroll)
|
567
|
+
|
568
|
+
|
569
|
+
def generate_scheduling(instruction_durations, scheduling_method, timing_constraints, target=None):
|
570
|
+
"""Generate a post optimization scheduling :class:`~qiskit.transpiler.PassManager`
|
571
|
+
|
572
|
+
Args:
|
573
|
+
instruction_durations (dict): The dictionary of instruction durations
|
574
|
+
scheduling_method (str): The scheduling method to use, can either be
|
575
|
+
``'asap'``/``'as_soon_as_possible'`` or
|
576
|
+
``'alap'``/``'as_late_as_possible'``
|
577
|
+
timing_constraints (TimingConstraints): Hardware time alignment restrictions.
|
578
|
+
target (Target): The :class:`~.Target` object representing the backend
|
579
|
+
|
580
|
+
Returns:
|
581
|
+
PassManager: The scheduling pass manager
|
582
|
+
|
583
|
+
Raises:
|
584
|
+
TranspilerError: If the ``scheduling_method`` kwarg is not a valid value
|
585
|
+
"""
|
586
|
+
scheduling = PassManager()
|
587
|
+
if scheduling_method:
|
588
|
+
# Do scheduling after unit conversion.
|
589
|
+
scheduler = {
|
590
|
+
"alap": ALAPScheduleAnalysis,
|
591
|
+
"as_late_as_possible": ALAPScheduleAnalysis,
|
592
|
+
"asap": ASAPScheduleAnalysis,
|
593
|
+
"as_soon_as_possible": ASAPScheduleAnalysis,
|
594
|
+
}
|
595
|
+
scheduling.append(TimeUnitConversion(instruction_durations, target=target))
|
596
|
+
try:
|
597
|
+
scheduling.append(scheduler[scheduling_method](instruction_durations, target=target))
|
598
|
+
except KeyError as ex:
|
599
|
+
raise TranspilerError(f"Invalid scheduling method {scheduling_method}.") from ex
|
600
|
+
elif instruction_durations:
|
601
|
+
# No scheduling. But do unit conversion for delays.
|
602
|
+
def _contains_delay(property_set):
|
603
|
+
return property_set["contains_delay"]
|
604
|
+
|
605
|
+
scheduling.append(ContainsInstruction("delay"))
|
606
|
+
scheduling.append(
|
607
|
+
ConditionalController(
|
608
|
+
TimeUnitConversion(instruction_durations, target=target), condition=_contains_delay
|
609
|
+
)
|
610
|
+
)
|
611
|
+
if (
|
612
|
+
timing_constraints.granularity != 1
|
613
|
+
or timing_constraints.min_length != 1
|
614
|
+
or timing_constraints.acquire_alignment != 1
|
615
|
+
or timing_constraints.pulse_alignment != 1
|
616
|
+
):
|
617
|
+
# Run alignment analysis regardless of scheduling.
|
618
|
+
|
619
|
+
def _require_alignment(property_set):
|
620
|
+
return property_set["reschedule_required"]
|
621
|
+
|
622
|
+
scheduling.append(
|
623
|
+
InstructionDurationCheck(
|
624
|
+
acquire_alignment=timing_constraints.acquire_alignment,
|
625
|
+
pulse_alignment=timing_constraints.pulse_alignment,
|
626
|
+
target=target,
|
627
|
+
)
|
628
|
+
)
|
629
|
+
scheduling.append(
|
630
|
+
ConditionalController(
|
631
|
+
ConstrainedReschedule(
|
632
|
+
acquire_alignment=timing_constraints.acquire_alignment,
|
633
|
+
pulse_alignment=timing_constraints.pulse_alignment,
|
634
|
+
target=target,
|
635
|
+
),
|
636
|
+
condition=_require_alignment,
|
637
|
+
)
|
638
|
+
)
|
639
|
+
if scheduling_method:
|
640
|
+
# Call padding pass if circuit is scheduled
|
641
|
+
scheduling.append(PadDelay(target=target, durations=instruction_durations))
|
642
|
+
|
643
|
+
return scheduling
|
644
|
+
|
645
|
+
|
646
|
+
VF2Limits = collections.namedtuple("VF2Limits", ("call_limit", "max_trials"))
|
647
|
+
|
648
|
+
|
649
|
+
def get_vf2_limits(
|
650
|
+
optimization_level: int,
|
651
|
+
layout_method: Optional[str] = None,
|
652
|
+
initial_layout: Optional[Layout] = None,
|
653
|
+
) -> VF2Limits:
|
654
|
+
"""Get the VF2 limits for VF2-based layout passes.
|
655
|
+
|
656
|
+
Returns:
|
657
|
+
VF2Limits: An namedtuple with optional elements
|
658
|
+
``call_limit`` and ``max_trials``.
|
659
|
+
"""
|
660
|
+
limits = VF2Limits(None, None)
|
661
|
+
if layout_method is None and initial_layout is None:
|
662
|
+
if optimization_level in {1, 2}:
|
663
|
+
limits = VF2Limits(
|
664
|
+
int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2
|
665
|
+
2500, # Limits layout scoring to < 600ms on ~400 qubit devices
|
666
|
+
)
|
667
|
+
elif optimization_level == 3:
|
668
|
+
limits = VF2Limits(
|
669
|
+
int(3e7), # Set call limit to ~60 sec with rustworkx 0.10.2
|
670
|
+
250000, # Limits layout scoring to < 60 sec on ~400 qubit devices
|
671
|
+
)
|
672
|
+
return limits
|