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,1114 @@
|
|
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
|
+
"""Built-in transpiler stage plugins for preset pass managers."""
|
14
|
+
|
15
|
+
import os
|
16
|
+
|
17
|
+
from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayout
|
18
|
+
from qiskit.transpiler.passes.optimization.split_2q_unitaries import Split2QUnitaries
|
19
|
+
from qiskit.transpiler.passmanager import PassManager
|
20
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
21
|
+
from qiskit.transpiler.passes import BasicSwap
|
22
|
+
from qiskit.transpiler.passes import LookaheadSwap
|
23
|
+
from qiskit.transpiler.passes import SabreSwap
|
24
|
+
from qiskit.transpiler.passes import Error
|
25
|
+
from qiskit.transpiler.passes import SetLayout
|
26
|
+
from qiskit.transpiler.passes import VF2Layout
|
27
|
+
from qiskit.transpiler.passes import SabreLayout
|
28
|
+
from qiskit.transpiler.passes import DenseLayout
|
29
|
+
from qiskit.transpiler.passes import TrivialLayout
|
30
|
+
from qiskit.transpiler.passes import CheckMap
|
31
|
+
from qiskit.transpiler.passes import BarrierBeforeFinalMeasurements
|
32
|
+
from qiskit.transpiler.passes import ElidePermutations
|
33
|
+
from qiskit.transpiler.passes import RemoveDiagonalGatesBeforeMeasure
|
34
|
+
from qiskit.transpiler.passes import OptimizeCliffordT
|
35
|
+
from qiskit.transpiler.passes import BasisTranslator
|
36
|
+
from qiskit.transpiler.preset_passmanagers import common
|
37
|
+
from qiskit.transpiler.preset_passmanagers.plugin import (
|
38
|
+
PassManagerStagePlugin,
|
39
|
+
PassManagerStagePluginManager,
|
40
|
+
)
|
41
|
+
from qiskit.transpiler.passes.optimization import (
|
42
|
+
Optimize1qGatesDecomposition,
|
43
|
+
CommutativeCancellation,
|
44
|
+
ConsolidateBlocks,
|
45
|
+
InverseCancellation,
|
46
|
+
RemoveIdentityEquivalent,
|
47
|
+
ContractIdleWiresInControlFlow,
|
48
|
+
)
|
49
|
+
from qiskit.transpiler.passes import Depth, Size, FixedPoint, MinimumPoint
|
50
|
+
from qiskit.transpiler.passes.utils.gates_basis import GatesInBasis
|
51
|
+
from qiskit.transpiler.passes.synthesis.unitary_synthesis import UnitarySynthesis
|
52
|
+
from qiskit.passmanager.flow_controllers import ConditionalController, DoWhileController
|
53
|
+
from qiskit.transpiler.timing_constraints import TimingConstraints
|
54
|
+
from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
|
55
|
+
from qiskit.circuit.library.standard_gates import (
|
56
|
+
CXGate,
|
57
|
+
ECRGate,
|
58
|
+
CZGate,
|
59
|
+
XGate,
|
60
|
+
YGate,
|
61
|
+
ZGate,
|
62
|
+
TGate,
|
63
|
+
TdgGate,
|
64
|
+
SwapGate,
|
65
|
+
SGate,
|
66
|
+
SdgGate,
|
67
|
+
HGate,
|
68
|
+
CYGate,
|
69
|
+
SXGate,
|
70
|
+
SXdgGate,
|
71
|
+
)
|
72
|
+
from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
|
73
|
+
from qiskit.utils import default_num_processes
|
74
|
+
from qiskit import user_config
|
75
|
+
|
76
|
+
CONFIG = user_config.get_config()
|
77
|
+
|
78
|
+
_discrete_skipped_ops = {
|
79
|
+
"delay",
|
80
|
+
"reset",
|
81
|
+
"measure",
|
82
|
+
"switch_case",
|
83
|
+
"if_else",
|
84
|
+
"for_loop",
|
85
|
+
"while_loop",
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
class DefaultInitPassManager(PassManagerStagePlugin):
|
90
|
+
"""Plugin class for default init stage."""
|
91
|
+
|
92
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
93
|
+
|
94
|
+
if optimization_level == 0:
|
95
|
+
init = None
|
96
|
+
if (
|
97
|
+
pass_manager_config.initial_layout
|
98
|
+
or pass_manager_config.coupling_map
|
99
|
+
or (
|
100
|
+
pass_manager_config.target is not None
|
101
|
+
and pass_manager_config.target.build_coupling_map() is not None
|
102
|
+
)
|
103
|
+
):
|
104
|
+
init = common.generate_unroll_3q(
|
105
|
+
pass_manager_config.target,
|
106
|
+
pass_manager_config.basis_gates,
|
107
|
+
pass_manager_config.approximation_degree,
|
108
|
+
pass_manager_config.unitary_synthesis_method,
|
109
|
+
pass_manager_config.unitary_synthesis_plugin_config,
|
110
|
+
pass_manager_config.hls_config,
|
111
|
+
pass_manager_config.qubits_initially_zero,
|
112
|
+
)
|
113
|
+
elif optimization_level == 1:
|
114
|
+
init = PassManager()
|
115
|
+
if (
|
116
|
+
pass_manager_config.initial_layout
|
117
|
+
or pass_manager_config.coupling_map
|
118
|
+
or (
|
119
|
+
pass_manager_config.target is not None
|
120
|
+
and pass_manager_config.target.build_coupling_map() is not None
|
121
|
+
)
|
122
|
+
):
|
123
|
+
init += common.generate_unroll_3q(
|
124
|
+
pass_manager_config.target,
|
125
|
+
pass_manager_config.basis_gates,
|
126
|
+
pass_manager_config.approximation_degree,
|
127
|
+
pass_manager_config.unitary_synthesis_method,
|
128
|
+
pass_manager_config.unitary_synthesis_plugin_config,
|
129
|
+
pass_manager_config.hls_config,
|
130
|
+
pass_manager_config.qubits_initially_zero,
|
131
|
+
)
|
132
|
+
init.append(
|
133
|
+
[
|
134
|
+
InverseCancellation(
|
135
|
+
[
|
136
|
+
CXGate(),
|
137
|
+
ECRGate(),
|
138
|
+
CZGate(),
|
139
|
+
CYGate(),
|
140
|
+
XGate(),
|
141
|
+
YGate(),
|
142
|
+
ZGate(),
|
143
|
+
HGate(),
|
144
|
+
SwapGate(),
|
145
|
+
(TGate(), TdgGate()),
|
146
|
+
(SGate(), SdgGate()),
|
147
|
+
(SXGate(), SXdgGate()),
|
148
|
+
]
|
149
|
+
),
|
150
|
+
ContractIdleWiresInControlFlow(),
|
151
|
+
]
|
152
|
+
)
|
153
|
+
|
154
|
+
elif optimization_level in {2, 3}:
|
155
|
+
init = common.generate_unroll_3q(
|
156
|
+
pass_manager_config.target,
|
157
|
+
pass_manager_config.basis_gates,
|
158
|
+
pass_manager_config.approximation_degree,
|
159
|
+
pass_manager_config.unitary_synthesis_method,
|
160
|
+
pass_manager_config.unitary_synthesis_plugin_config,
|
161
|
+
pass_manager_config.hls_config,
|
162
|
+
pass_manager_config.qubits_initially_zero,
|
163
|
+
)
|
164
|
+
if pass_manager_config.routing_method != "none":
|
165
|
+
init.append(ElidePermutations())
|
166
|
+
init.append(
|
167
|
+
[
|
168
|
+
RemoveDiagonalGatesBeforeMeasure(),
|
169
|
+
# Target not set on RemoveIdentityEquivalent because we haven't applied a Layout
|
170
|
+
# yet so doing anything relative to an error rate in the target is not valid.
|
171
|
+
RemoveIdentityEquivalent(
|
172
|
+
approximation_degree=pass_manager_config.approximation_degree
|
173
|
+
),
|
174
|
+
InverseCancellation(
|
175
|
+
[
|
176
|
+
CXGate(),
|
177
|
+
ECRGate(),
|
178
|
+
CZGate(),
|
179
|
+
CYGate(),
|
180
|
+
XGate(),
|
181
|
+
YGate(),
|
182
|
+
ZGate(),
|
183
|
+
HGate(),
|
184
|
+
SwapGate(),
|
185
|
+
(TGate(), TdgGate()),
|
186
|
+
(SGate(), SdgGate()),
|
187
|
+
(SXGate(), SXdgGate()),
|
188
|
+
]
|
189
|
+
),
|
190
|
+
ContractIdleWiresInControlFlow(),
|
191
|
+
]
|
192
|
+
)
|
193
|
+
init.append(CommutativeCancellation())
|
194
|
+
|
195
|
+
# We do not want to consolidate blocks for a Clifford+T basis set,
|
196
|
+
# since this involves resynthesizing 2-qubit unitaries.
|
197
|
+
if not pass_manager_config._is_clifford_t:
|
198
|
+
init.append(ConsolidateBlocks())
|
199
|
+
|
200
|
+
# If approximation degree is None that indicates a request to approximate up to the
|
201
|
+
# error rates in the target. However, in the init stage we don't yet know the target
|
202
|
+
# qubits being used to figure out the fidelity so just use the default fidelity parameter
|
203
|
+
# in this case.
|
204
|
+
split_2q_unitaries_swap = False
|
205
|
+
if pass_manager_config.routing_method != "none":
|
206
|
+
split_2q_unitaries_swap = True
|
207
|
+
if pass_manager_config.approximation_degree is not None:
|
208
|
+
init.append(
|
209
|
+
Split2QUnitaries(
|
210
|
+
pass_manager_config.approximation_degree, split_swap=split_2q_unitaries_swap
|
211
|
+
)
|
212
|
+
)
|
213
|
+
else:
|
214
|
+
init.append(Split2QUnitaries(split_swap=split_2q_unitaries_swap))
|
215
|
+
else:
|
216
|
+
raise TranspilerError(f"Invalid optimization level {optimization_level}")
|
217
|
+
return init
|
218
|
+
|
219
|
+
|
220
|
+
class DefaultTranslationPassManager(PassManagerStagePlugin):
|
221
|
+
"""Plugin class for the default-method translation stage."""
|
222
|
+
|
223
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
224
|
+
# For now, this is just a wrapper around the `BasisTranslator`. It might expand in the
|
225
|
+
# future if we want to change the default method to do more context-aware switching, or to
|
226
|
+
# start transitioning the default method without breaking the semantics of the default
|
227
|
+
# string referring to the `BasisTranslator`.
|
228
|
+
|
229
|
+
return BasisTranslatorPassManager().pass_manager(pass_manager_config, optimization_level)
|
230
|
+
|
231
|
+
|
232
|
+
class BasisTranslatorPassManager(PassManagerStagePlugin):
|
233
|
+
"""Plugin class for translation stage with :class:`~.BasisTranslator`"""
|
234
|
+
|
235
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
236
|
+
if pass_manager_config._is_clifford_t:
|
237
|
+
method = "clifford_t"
|
238
|
+
else:
|
239
|
+
method = "translator"
|
240
|
+
return common.generate_translation_passmanager(
|
241
|
+
pass_manager_config.target,
|
242
|
+
basis_gates=pass_manager_config.basis_gates,
|
243
|
+
method=method,
|
244
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
245
|
+
coupling_map=pass_manager_config.coupling_map,
|
246
|
+
unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
|
247
|
+
unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
|
248
|
+
hls_config=pass_manager_config.hls_config,
|
249
|
+
qubits_initially_zero=pass_manager_config.qubits_initially_zero,
|
250
|
+
)
|
251
|
+
|
252
|
+
|
253
|
+
class UnitarySynthesisPassManager(PassManagerStagePlugin):
|
254
|
+
"""Plugin class for translation stage with :class:`~.UnitarySynthesis`"""
|
255
|
+
|
256
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
257
|
+
return common.generate_translation_passmanager(
|
258
|
+
pass_manager_config.target,
|
259
|
+
basis_gates=pass_manager_config.basis_gates,
|
260
|
+
method="synthesis",
|
261
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
262
|
+
coupling_map=pass_manager_config.coupling_map,
|
263
|
+
unitary_synthesis_method=pass_manager_config.unitary_synthesis_method,
|
264
|
+
unitary_synthesis_plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
|
265
|
+
hls_config=pass_manager_config.hls_config,
|
266
|
+
qubits_initially_zero=pass_manager_config.qubits_initially_zero,
|
267
|
+
)
|
268
|
+
|
269
|
+
|
270
|
+
class DefaultRoutingPassManager(PassManagerStagePlugin):
|
271
|
+
"""Plugin class for the "default" routing stage implementation."""
|
272
|
+
|
273
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
274
|
+
# The Sabre-based PM is the default implementation currently, but semantically the "default"
|
275
|
+
# plugin has more scope to change its logic than one called "sabre". In practice, we don't
|
276
|
+
# run the actually `SabreSwap` logic from this pass most of the time, because we do that
|
277
|
+
# during default layout; we're looking for the VF2PostLayout stuff mostly.
|
278
|
+
return SabreSwapPassManager().pass_manager(pass_manager_config, optimization_level)
|
279
|
+
|
280
|
+
|
281
|
+
class BasicSwapPassManager(PassManagerStagePlugin):
|
282
|
+
"""Plugin class for routing stage with :class:`~.BasicSwap`"""
|
283
|
+
|
284
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
285
|
+
"""Build routing stage PassManager."""
|
286
|
+
target = pass_manager_config.target
|
287
|
+
coupling_map = pass_manager_config.coupling_map
|
288
|
+
if target is None:
|
289
|
+
routing_pass = BasicSwap(coupling_map)
|
290
|
+
else:
|
291
|
+
routing_pass = BasicSwap(target)
|
292
|
+
|
293
|
+
vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
|
294
|
+
optimization_level,
|
295
|
+
pass_manager_config.layout_method,
|
296
|
+
pass_manager_config.initial_layout,
|
297
|
+
)
|
298
|
+
if optimization_level == 0:
|
299
|
+
return common.generate_routing_passmanager(
|
300
|
+
routing_pass,
|
301
|
+
target,
|
302
|
+
coupling_map=coupling_map,
|
303
|
+
seed_transpiler=-1,
|
304
|
+
use_barrier_before_measurement=True,
|
305
|
+
)
|
306
|
+
if optimization_level == 1:
|
307
|
+
return common.generate_routing_passmanager(
|
308
|
+
routing_pass,
|
309
|
+
target,
|
310
|
+
coupling_map,
|
311
|
+
vf2_call_limit=vf2_call_limit,
|
312
|
+
vf2_max_trials=vf2_max_trials,
|
313
|
+
seed_transpiler=-1,
|
314
|
+
check_trivial=True,
|
315
|
+
use_barrier_before_measurement=True,
|
316
|
+
)
|
317
|
+
if optimization_level == 2:
|
318
|
+
return common.generate_routing_passmanager(
|
319
|
+
routing_pass,
|
320
|
+
target,
|
321
|
+
coupling_map=coupling_map,
|
322
|
+
vf2_call_limit=vf2_call_limit,
|
323
|
+
vf2_max_trials=vf2_max_trials,
|
324
|
+
seed_transpiler=-1,
|
325
|
+
use_barrier_before_measurement=True,
|
326
|
+
)
|
327
|
+
if optimization_level == 3:
|
328
|
+
return common.generate_routing_passmanager(
|
329
|
+
routing_pass,
|
330
|
+
target,
|
331
|
+
coupling_map=coupling_map,
|
332
|
+
vf2_call_limit=vf2_call_limit,
|
333
|
+
vf2_max_trials=vf2_max_trials,
|
334
|
+
seed_transpiler=-1,
|
335
|
+
use_barrier_before_measurement=True,
|
336
|
+
)
|
337
|
+
raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
|
338
|
+
|
339
|
+
|
340
|
+
class LookaheadSwapPassManager(PassManagerStagePlugin):
|
341
|
+
"""Plugin class for routing stage with :class:`~.LookaheadSwap`"""
|
342
|
+
|
343
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
344
|
+
"""Build routing stage PassManager."""
|
345
|
+
target = pass_manager_config.target
|
346
|
+
coupling_map = pass_manager_config.coupling_map
|
347
|
+
coupling_map_routing = target
|
348
|
+
if coupling_map_routing is None:
|
349
|
+
coupling_map_routing = coupling_map
|
350
|
+
vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
|
351
|
+
optimization_level,
|
352
|
+
pass_manager_config.layout_method,
|
353
|
+
pass_manager_config.initial_layout,
|
354
|
+
)
|
355
|
+
if optimization_level == 0:
|
356
|
+
routing_pass = LookaheadSwap(coupling_map_routing, search_depth=2, search_width=2)
|
357
|
+
return common.generate_routing_passmanager(
|
358
|
+
routing_pass,
|
359
|
+
target,
|
360
|
+
coupling_map=coupling_map,
|
361
|
+
seed_transpiler=-1,
|
362
|
+
use_barrier_before_measurement=True,
|
363
|
+
)
|
364
|
+
if optimization_level == 1:
|
365
|
+
routing_pass = LookaheadSwap(coupling_map_routing, search_depth=4, search_width=4)
|
366
|
+
return common.generate_routing_passmanager(
|
367
|
+
routing_pass,
|
368
|
+
target,
|
369
|
+
coupling_map,
|
370
|
+
vf2_call_limit=vf2_call_limit,
|
371
|
+
vf2_max_trials=vf2_max_trials,
|
372
|
+
seed_transpiler=-1,
|
373
|
+
check_trivial=True,
|
374
|
+
use_barrier_before_measurement=True,
|
375
|
+
)
|
376
|
+
if optimization_level == 2:
|
377
|
+
routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
|
378
|
+
return common.generate_routing_passmanager(
|
379
|
+
routing_pass,
|
380
|
+
target,
|
381
|
+
coupling_map=coupling_map,
|
382
|
+
vf2_call_limit=vf2_call_limit,
|
383
|
+
vf2_max_trials=vf2_max_trials,
|
384
|
+
seed_transpiler=-1,
|
385
|
+
use_barrier_before_measurement=True,
|
386
|
+
)
|
387
|
+
if optimization_level == 3:
|
388
|
+
routing_pass = LookaheadSwap(coupling_map_routing, search_depth=5, search_width=6)
|
389
|
+
return common.generate_routing_passmanager(
|
390
|
+
routing_pass,
|
391
|
+
target,
|
392
|
+
coupling_map=coupling_map,
|
393
|
+
vf2_call_limit=vf2_call_limit,
|
394
|
+
vf2_max_trials=vf2_max_trials,
|
395
|
+
seed_transpiler=-1,
|
396
|
+
use_barrier_before_measurement=True,
|
397
|
+
)
|
398
|
+
raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
|
399
|
+
|
400
|
+
|
401
|
+
class SabreSwapPassManager(PassManagerStagePlugin):
|
402
|
+
"""Plugin class for routing stage with :class:`~.SabreSwap`"""
|
403
|
+
|
404
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
405
|
+
"""Build routing stage PassManager."""
|
406
|
+
seed_transpiler = pass_manager_config.seed_transpiler
|
407
|
+
target = pass_manager_config.target
|
408
|
+
coupling_map = pass_manager_config.coupling_map
|
409
|
+
coupling_map_routing = target
|
410
|
+
if coupling_map_routing is None:
|
411
|
+
coupling_map_routing = coupling_map
|
412
|
+
vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
|
413
|
+
optimization_level,
|
414
|
+
pass_manager_config.layout_method,
|
415
|
+
pass_manager_config.initial_layout,
|
416
|
+
)
|
417
|
+
if optimization_level == 0:
|
418
|
+
trial_count = _get_trial_count(5)
|
419
|
+
routing_pass = SabreSwap(
|
420
|
+
coupling_map_routing,
|
421
|
+
heuristic="basic",
|
422
|
+
seed=seed_transpiler,
|
423
|
+
trials=trial_count,
|
424
|
+
)
|
425
|
+
return common.generate_routing_passmanager(
|
426
|
+
routing_pass,
|
427
|
+
target,
|
428
|
+
coupling_map=coupling_map,
|
429
|
+
seed_transpiler=-1,
|
430
|
+
use_barrier_before_measurement=True,
|
431
|
+
)
|
432
|
+
if optimization_level == 1:
|
433
|
+
trial_count = _get_trial_count(5)
|
434
|
+
routing_pass = SabreSwap(
|
435
|
+
coupling_map_routing,
|
436
|
+
heuristic="decay",
|
437
|
+
seed=seed_transpiler,
|
438
|
+
trials=trial_count,
|
439
|
+
)
|
440
|
+
return common.generate_routing_passmanager(
|
441
|
+
routing_pass,
|
442
|
+
target,
|
443
|
+
coupling_map,
|
444
|
+
vf2_call_limit=vf2_call_limit,
|
445
|
+
vf2_max_trials=vf2_max_trials,
|
446
|
+
seed_transpiler=-1,
|
447
|
+
check_trivial=True,
|
448
|
+
use_barrier_before_measurement=True,
|
449
|
+
)
|
450
|
+
if optimization_level == 2:
|
451
|
+
trial_count = _get_trial_count(20)
|
452
|
+
|
453
|
+
routing_pass = SabreSwap(
|
454
|
+
coupling_map_routing,
|
455
|
+
heuristic="decay",
|
456
|
+
seed=seed_transpiler,
|
457
|
+
trials=trial_count,
|
458
|
+
)
|
459
|
+
return common.generate_routing_passmanager(
|
460
|
+
routing_pass,
|
461
|
+
target,
|
462
|
+
coupling_map=coupling_map,
|
463
|
+
vf2_call_limit=vf2_call_limit,
|
464
|
+
vf2_max_trials=vf2_max_trials,
|
465
|
+
seed_transpiler=-1,
|
466
|
+
use_barrier_before_measurement=True,
|
467
|
+
)
|
468
|
+
if optimization_level == 3:
|
469
|
+
trial_count = _get_trial_count(20)
|
470
|
+
routing_pass = SabreSwap(
|
471
|
+
coupling_map_routing,
|
472
|
+
heuristic="decay",
|
473
|
+
seed=seed_transpiler,
|
474
|
+
trials=trial_count,
|
475
|
+
)
|
476
|
+
return common.generate_routing_passmanager(
|
477
|
+
routing_pass,
|
478
|
+
target,
|
479
|
+
coupling_map=coupling_map,
|
480
|
+
vf2_call_limit=vf2_call_limit,
|
481
|
+
vf2_max_trials=vf2_max_trials,
|
482
|
+
seed_transpiler=-1,
|
483
|
+
use_barrier_before_measurement=True,
|
484
|
+
)
|
485
|
+
raise TranspilerError(f"Invalid optimization level specified: {optimization_level}")
|
486
|
+
|
487
|
+
|
488
|
+
class NoneRoutingPassManager(PassManagerStagePlugin):
|
489
|
+
"""Plugin class for routing stage with error on routing."""
|
490
|
+
|
491
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
492
|
+
"""Build routing stage PassManager."""
|
493
|
+
target = pass_manager_config.target
|
494
|
+
coupling_map = pass_manager_config.coupling_map
|
495
|
+
routing_pass = Error(
|
496
|
+
msg="No routing method selected, but circuit is not routed to device. "
|
497
|
+
"CheckMap Error: {check_map_msg}",
|
498
|
+
action="raise",
|
499
|
+
)
|
500
|
+
return common.generate_routing_passmanager(
|
501
|
+
routing_pass,
|
502
|
+
target,
|
503
|
+
coupling_map=coupling_map,
|
504
|
+
seed_transpiler=-1,
|
505
|
+
use_barrier_before_measurement=True,
|
506
|
+
)
|
507
|
+
|
508
|
+
|
509
|
+
class OptimizationPassManager(PassManagerStagePlugin):
|
510
|
+
"""Plugin class for optimization stage"""
|
511
|
+
|
512
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
513
|
+
"""Build pass manager for optimization stage."""
|
514
|
+
|
515
|
+
# Use the dedicated plugin for the Clifford+T basis when appropriate.
|
516
|
+
if pass_manager_config._is_clifford_t:
|
517
|
+
return CliffordTOptimizationPassManager().pass_manager(
|
518
|
+
pass_manager_config, optimization_level
|
519
|
+
)
|
520
|
+
|
521
|
+
# Obtain the translation method required for this pass to work
|
522
|
+
translation_method = pass_manager_config.translation_method or "default"
|
523
|
+
optimization = PassManager()
|
524
|
+
if optimization_level != 0:
|
525
|
+
plugin_manager = PassManagerStagePluginManager()
|
526
|
+
_depth_check = [Depth(recurse=True), FixedPoint("depth")]
|
527
|
+
_size_check = [Size(recurse=True), FixedPoint("size")]
|
528
|
+
# Minimum point check for optimization level 3.
|
529
|
+
_minimum_point_check = [
|
530
|
+
Depth(recurse=True),
|
531
|
+
Size(recurse=True),
|
532
|
+
MinimumPoint(["depth", "size"], "optimization_loop"),
|
533
|
+
]
|
534
|
+
|
535
|
+
def _opt_control(property_set):
|
536
|
+
return (not property_set["depth_fixed_point"]) or (
|
537
|
+
not property_set["size_fixed_point"]
|
538
|
+
)
|
539
|
+
|
540
|
+
translation = plugin_manager.get_passmanager_stage(
|
541
|
+
"translation",
|
542
|
+
translation_method,
|
543
|
+
pass_manager_config,
|
544
|
+
optimization_level=optimization_level,
|
545
|
+
)
|
546
|
+
|
547
|
+
# Basic steps for optimization level 1:
|
548
|
+
# 1. Optimize1qGatesDecomposition
|
549
|
+
# 2. InverseCancellation
|
550
|
+
if optimization_level == 1:
|
551
|
+
|
552
|
+
_opt = [
|
553
|
+
Optimize1qGatesDecomposition(
|
554
|
+
basis=pass_manager_config.basis_gates, target=pass_manager_config.target
|
555
|
+
),
|
556
|
+
InverseCancellation(
|
557
|
+
[
|
558
|
+
CXGate(),
|
559
|
+
ECRGate(),
|
560
|
+
CZGate(),
|
561
|
+
CYGate(),
|
562
|
+
XGate(),
|
563
|
+
YGate(),
|
564
|
+
ZGate(),
|
565
|
+
HGate(),
|
566
|
+
SwapGate(),
|
567
|
+
(TGate(), TdgGate()),
|
568
|
+
(SGate(), SdgGate()),
|
569
|
+
(SXGate(), SXdgGate()),
|
570
|
+
]
|
571
|
+
),
|
572
|
+
ContractIdleWiresInControlFlow(),
|
573
|
+
]
|
574
|
+
|
575
|
+
# Basic steps for optimization level 2:
|
576
|
+
# 1. RemoveIdentityEquivalent
|
577
|
+
# 2. Optimize1qGatesDecomposition
|
578
|
+
# 3. CommutativeCancellation
|
579
|
+
elif optimization_level == 2:
|
580
|
+
_opt = [
|
581
|
+
RemoveIdentityEquivalent(
|
582
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
583
|
+
target=pass_manager_config.target,
|
584
|
+
),
|
585
|
+
Optimize1qGatesDecomposition(
|
586
|
+
basis=pass_manager_config.basis_gates, target=pass_manager_config.target
|
587
|
+
),
|
588
|
+
CommutativeCancellation(target=pass_manager_config.target),
|
589
|
+
ContractIdleWiresInControlFlow(),
|
590
|
+
]
|
591
|
+
|
592
|
+
# Basic steps for optimization level 3:
|
593
|
+
# 1. ConsolidateBlocks
|
594
|
+
# 2. UnitarySynthesis
|
595
|
+
# 3. RemoveIdentityEquivalent
|
596
|
+
# 4. Optimize1qGatesDecomposition
|
597
|
+
# 5. CommutativeCancellation
|
598
|
+
elif optimization_level == 3:
|
599
|
+
_opt = [
|
600
|
+
ConsolidateBlocks(
|
601
|
+
basis_gates=pass_manager_config.basis_gates,
|
602
|
+
target=pass_manager_config.target,
|
603
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
604
|
+
),
|
605
|
+
UnitarySynthesis(
|
606
|
+
pass_manager_config.basis_gates,
|
607
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
608
|
+
coupling_map=pass_manager_config.coupling_map,
|
609
|
+
method=pass_manager_config.unitary_synthesis_method,
|
610
|
+
plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
|
611
|
+
target=pass_manager_config.target,
|
612
|
+
),
|
613
|
+
RemoveIdentityEquivalent(
|
614
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
615
|
+
target=pass_manager_config.target,
|
616
|
+
),
|
617
|
+
Optimize1qGatesDecomposition(
|
618
|
+
basis=pass_manager_config.basis_gates, target=pass_manager_config.target
|
619
|
+
),
|
620
|
+
CommutativeCancellation(target=pass_manager_config.target),
|
621
|
+
ContractIdleWiresInControlFlow(),
|
622
|
+
]
|
623
|
+
|
624
|
+
def _opt_control(property_set):
|
625
|
+
return not property_set["optimization_loop_minimum_point"]
|
626
|
+
|
627
|
+
else:
|
628
|
+
raise TranspilerError(f"Invalid optimization_level: {optimization_level}")
|
629
|
+
|
630
|
+
unroll = translation.to_flow_controller()
|
631
|
+
|
632
|
+
# Build nested flow controllers
|
633
|
+
def _unroll_condition(property_set):
|
634
|
+
return not property_set["all_gates_in_basis"]
|
635
|
+
|
636
|
+
# Check if any gate is not in the basis, and if so, run unroll/translation passes
|
637
|
+
_unroll_if_out_of_basis = [
|
638
|
+
GatesInBasis(pass_manager_config.basis_gates, target=pass_manager_config.target),
|
639
|
+
ConditionalController(unroll, condition=_unroll_condition),
|
640
|
+
]
|
641
|
+
|
642
|
+
if optimization_level == 3:
|
643
|
+
optimization.append(_minimum_point_check)
|
644
|
+
elif optimization_level == 2:
|
645
|
+
optimization.append(
|
646
|
+
[
|
647
|
+
ConsolidateBlocks(
|
648
|
+
basis_gates=pass_manager_config.basis_gates,
|
649
|
+
target=pass_manager_config.target,
|
650
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
651
|
+
),
|
652
|
+
UnitarySynthesis(
|
653
|
+
pass_manager_config.basis_gates,
|
654
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
655
|
+
coupling_map=pass_manager_config.coupling_map,
|
656
|
+
method=pass_manager_config.unitary_synthesis_method,
|
657
|
+
plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
|
658
|
+
target=pass_manager_config.target,
|
659
|
+
),
|
660
|
+
]
|
661
|
+
)
|
662
|
+
optimization.append(_depth_check + _size_check)
|
663
|
+
else:
|
664
|
+
optimization.append(_depth_check + _size_check)
|
665
|
+
opt_loop = (
|
666
|
+
_opt + _unroll_if_out_of_basis + _minimum_point_check
|
667
|
+
if optimization_level == 3
|
668
|
+
else _opt + _unroll_if_out_of_basis + _depth_check + _size_check
|
669
|
+
)
|
670
|
+
optimization.append(DoWhileController(opt_loop, do_while=_opt_control))
|
671
|
+
|
672
|
+
if optimization_level == 3 and pass_manager_config.coupling_map:
|
673
|
+
vf2_call_limit, vf2_max_trials = common.get_vf2_limits(
|
674
|
+
optimization_level,
|
675
|
+
pass_manager_config.layout_method,
|
676
|
+
pass_manager_config.initial_layout,
|
677
|
+
)
|
678
|
+
optimization.append(
|
679
|
+
VF2PostLayout(
|
680
|
+
target=pass_manager_config.target,
|
681
|
+
seed=-1,
|
682
|
+
call_limit=vf2_call_limit,
|
683
|
+
max_trials=vf2_max_trials,
|
684
|
+
strict_direction=True,
|
685
|
+
)
|
686
|
+
)
|
687
|
+
|
688
|
+
return optimization
|
689
|
+
else:
|
690
|
+
return None
|
691
|
+
|
692
|
+
|
693
|
+
class AlapSchedulingPassManager(PassManagerStagePlugin):
|
694
|
+
"""Plugin class for alap scheduling stage."""
|
695
|
+
|
696
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
697
|
+
"""Build scheduling stage PassManager"""
|
698
|
+
|
699
|
+
instruction_durations = pass_manager_config.instruction_durations
|
700
|
+
scheduling_method = pass_manager_config.scheduling_method
|
701
|
+
timing_constraints = pass_manager_config.timing_constraints
|
702
|
+
target = pass_manager_config.target
|
703
|
+
|
704
|
+
return common.generate_scheduling(
|
705
|
+
instruction_durations, scheduling_method, timing_constraints, target
|
706
|
+
)
|
707
|
+
|
708
|
+
|
709
|
+
class AsapSchedulingPassManager(PassManagerStagePlugin):
|
710
|
+
"""Plugin class for alap scheduling stage."""
|
711
|
+
|
712
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
713
|
+
"""Build scheduling stage PassManager"""
|
714
|
+
|
715
|
+
instruction_durations = pass_manager_config.instruction_durations
|
716
|
+
scheduling_method = pass_manager_config.scheduling_method
|
717
|
+
timing_constraints = pass_manager_config.timing_constraints
|
718
|
+
target = pass_manager_config.target
|
719
|
+
|
720
|
+
return common.generate_scheduling(
|
721
|
+
instruction_durations, scheduling_method, timing_constraints, target
|
722
|
+
)
|
723
|
+
|
724
|
+
|
725
|
+
class DefaultSchedulingPassManager(PassManagerStagePlugin):
|
726
|
+
"""Plugin class for alap scheduling stage."""
|
727
|
+
|
728
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
729
|
+
"""Build scheduling stage PassManager"""
|
730
|
+
|
731
|
+
instruction_durations = pass_manager_config.instruction_durations
|
732
|
+
scheduling_method = None
|
733
|
+
timing_constraints = pass_manager_config.timing_constraints or TimingConstraints()
|
734
|
+
target = pass_manager_config.target
|
735
|
+
|
736
|
+
return common.generate_scheduling(
|
737
|
+
instruction_durations, scheduling_method, timing_constraints, target
|
738
|
+
)
|
739
|
+
|
740
|
+
|
741
|
+
class DefaultLayoutPassManager(PassManagerStagePlugin):
|
742
|
+
"""Plugin class for default layout stage."""
|
743
|
+
|
744
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
745
|
+
_given_layout = SetLayout(pass_manager_config.initial_layout)
|
746
|
+
|
747
|
+
def _choose_layout_condition(property_set):
|
748
|
+
return not property_set["layout"]
|
749
|
+
|
750
|
+
def _layout_not_perfect(property_set):
|
751
|
+
"""Return ``True`` if the first attempt at layout has been checked and found to be
|
752
|
+
imperfect. In this case, perfection means "does not require any swap routing"."""
|
753
|
+
return property_set["is_swap_mapped"] is not None and not property_set["is_swap_mapped"]
|
754
|
+
|
755
|
+
def _vf2_match_not_found(property_set):
|
756
|
+
# If a layout hasn't been set by the time we run vf2 layout we need to
|
757
|
+
# run layout
|
758
|
+
if property_set["layout"] is None:
|
759
|
+
return True
|
760
|
+
# if VF2 layout stopped for any reason other than solution found we need
|
761
|
+
# to run layout since VF2 didn't converge.
|
762
|
+
return (
|
763
|
+
property_set["VF2Layout_stop_reason"] is not None
|
764
|
+
and property_set["VF2Layout_stop_reason"] is not VF2LayoutStopReason.SOLUTION_FOUND
|
765
|
+
)
|
766
|
+
|
767
|
+
def _swap_mapped(property_set):
|
768
|
+
return property_set["final_layout"] is None
|
769
|
+
|
770
|
+
if pass_manager_config.target is None:
|
771
|
+
coupling_map = pass_manager_config.coupling_map
|
772
|
+
else:
|
773
|
+
coupling_map = pass_manager_config.target
|
774
|
+
|
775
|
+
layout = PassManager()
|
776
|
+
layout.append(_given_layout)
|
777
|
+
if optimization_level == 0:
|
778
|
+
if coupling_map is not None:
|
779
|
+
layout.append(
|
780
|
+
ConditionalController(
|
781
|
+
TrivialLayout(coupling_map), condition=_choose_layout_condition
|
782
|
+
)
|
783
|
+
)
|
784
|
+
layout += common.generate_embed_passmanager(coupling_map)
|
785
|
+
return layout
|
786
|
+
|
787
|
+
if coupling_map is None:
|
788
|
+
# There's nothing to lay out onto. We only need to embed the initial layout, if given.
|
789
|
+
pass
|
790
|
+
elif optimization_level == 1:
|
791
|
+
layout.append(
|
792
|
+
ConditionalController(
|
793
|
+
[TrivialLayout(coupling_map), CheckMap(coupling_map)],
|
794
|
+
condition=_choose_layout_condition,
|
795
|
+
)
|
796
|
+
)
|
797
|
+
choose_layout_1 = VF2Layout(
|
798
|
+
coupling_map=pass_manager_config.coupling_map,
|
799
|
+
seed=-1,
|
800
|
+
call_limit=int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2
|
801
|
+
target=pass_manager_config.target,
|
802
|
+
max_trials=2500, # Limits layout scoring to < 600ms on ~400 qubit devices
|
803
|
+
)
|
804
|
+
layout.append(ConditionalController(choose_layout_1, condition=_layout_not_perfect))
|
805
|
+
|
806
|
+
trial_count = _get_trial_count(5)
|
807
|
+
|
808
|
+
choose_layout_2 = SabreLayout(
|
809
|
+
coupling_map,
|
810
|
+
max_iterations=2,
|
811
|
+
seed=pass_manager_config.seed_transpiler,
|
812
|
+
swap_trials=trial_count,
|
813
|
+
layout_trials=trial_count,
|
814
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
815
|
+
)
|
816
|
+
layout.append(
|
817
|
+
ConditionalController(
|
818
|
+
[
|
819
|
+
BarrierBeforeFinalMeasurements(
|
820
|
+
"qiskit.transpiler.internal.routing.protection.barrier"
|
821
|
+
),
|
822
|
+
choose_layout_2,
|
823
|
+
],
|
824
|
+
condition=_vf2_match_not_found,
|
825
|
+
)
|
826
|
+
)
|
827
|
+
elif optimization_level == 2:
|
828
|
+
choose_layout_0 = VF2Layout(
|
829
|
+
coupling_map=pass_manager_config.coupling_map,
|
830
|
+
seed=-1,
|
831
|
+
call_limit=int(5e6), # Set call limit to ~10s with rustworkx 0.10.2
|
832
|
+
target=pass_manager_config.target,
|
833
|
+
max_trials=2500, # Limits layout scoring to < 600ms on ~400 qubit devices
|
834
|
+
)
|
835
|
+
layout.append(
|
836
|
+
ConditionalController(choose_layout_0, condition=_choose_layout_condition)
|
837
|
+
)
|
838
|
+
|
839
|
+
trial_count = _get_trial_count(20)
|
840
|
+
|
841
|
+
choose_layout_1 = SabreLayout(
|
842
|
+
coupling_map,
|
843
|
+
max_iterations=2,
|
844
|
+
seed=pass_manager_config.seed_transpiler,
|
845
|
+
swap_trials=trial_count,
|
846
|
+
layout_trials=trial_count,
|
847
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
848
|
+
)
|
849
|
+
layout.append(
|
850
|
+
ConditionalController(
|
851
|
+
[
|
852
|
+
BarrierBeforeFinalMeasurements(
|
853
|
+
"qiskit.transpiler.internal.routing.protection.barrier"
|
854
|
+
),
|
855
|
+
choose_layout_1,
|
856
|
+
],
|
857
|
+
condition=_vf2_match_not_found,
|
858
|
+
)
|
859
|
+
)
|
860
|
+
elif optimization_level == 3:
|
861
|
+
choose_layout_0 = VF2Layout(
|
862
|
+
coupling_map=pass_manager_config.coupling_map,
|
863
|
+
seed=-1,
|
864
|
+
call_limit=int(3e7), # Set call limit to ~60s with rustworkx 0.10.2
|
865
|
+
target=pass_manager_config.target,
|
866
|
+
max_trials=250000, # Limits layout scoring to < 60s on ~400 qubit devices
|
867
|
+
)
|
868
|
+
layout.append(
|
869
|
+
ConditionalController(choose_layout_0, condition=_choose_layout_condition)
|
870
|
+
)
|
871
|
+
|
872
|
+
trial_count = _get_trial_count(20)
|
873
|
+
|
874
|
+
choose_layout_1 = SabreLayout(
|
875
|
+
coupling_map,
|
876
|
+
max_iterations=4,
|
877
|
+
seed=pass_manager_config.seed_transpiler,
|
878
|
+
swap_trials=trial_count,
|
879
|
+
layout_trials=trial_count,
|
880
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
881
|
+
)
|
882
|
+
layout.append(
|
883
|
+
ConditionalController(
|
884
|
+
[
|
885
|
+
BarrierBeforeFinalMeasurements(
|
886
|
+
"qiskit.transpiler.internal.routing.protection.barrier"
|
887
|
+
),
|
888
|
+
choose_layout_1,
|
889
|
+
],
|
890
|
+
condition=_vf2_match_not_found,
|
891
|
+
)
|
892
|
+
)
|
893
|
+
else:
|
894
|
+
raise TranspilerError(f"Invalid optimization level: {optimization_level}")
|
895
|
+
|
896
|
+
embed = common.generate_embed_passmanager(coupling_map)
|
897
|
+
layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
|
898
|
+
return layout
|
899
|
+
|
900
|
+
|
901
|
+
class TrivialLayoutPassManager(PassManagerStagePlugin):
|
902
|
+
"""Plugin class for trivial layout stage."""
|
903
|
+
|
904
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
905
|
+
_given_layout = SetLayout(pass_manager_config.initial_layout)
|
906
|
+
|
907
|
+
def _choose_layout_condition(property_set):
|
908
|
+
return not property_set["layout"]
|
909
|
+
|
910
|
+
if pass_manager_config.target is None:
|
911
|
+
coupling_map = pass_manager_config.coupling_map
|
912
|
+
else:
|
913
|
+
coupling_map = pass_manager_config.target
|
914
|
+
|
915
|
+
layout = PassManager()
|
916
|
+
layout.append(_given_layout)
|
917
|
+
if coupling_map is not None:
|
918
|
+
layout.append(
|
919
|
+
ConditionalController(
|
920
|
+
TrivialLayout(coupling_map), condition=_choose_layout_condition
|
921
|
+
)
|
922
|
+
)
|
923
|
+
layout += common.generate_embed_passmanager(coupling_map)
|
924
|
+
return layout
|
925
|
+
|
926
|
+
|
927
|
+
class DenseLayoutPassManager(PassManagerStagePlugin):
|
928
|
+
"""Plugin class for dense layout stage."""
|
929
|
+
|
930
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
931
|
+
_given_layout = SetLayout(pass_manager_config.initial_layout)
|
932
|
+
|
933
|
+
def _choose_layout_condition(property_set):
|
934
|
+
return not property_set["layout"]
|
935
|
+
|
936
|
+
if pass_manager_config.target is None:
|
937
|
+
coupling_map = pass_manager_config.coupling_map
|
938
|
+
else:
|
939
|
+
coupling_map = pass_manager_config.target
|
940
|
+
|
941
|
+
layout = PassManager()
|
942
|
+
layout.append(_given_layout)
|
943
|
+
if coupling_map is not None:
|
944
|
+
layout.append(
|
945
|
+
ConditionalController(
|
946
|
+
DenseLayout(
|
947
|
+
coupling_map=pass_manager_config.coupling_map,
|
948
|
+
target=pass_manager_config.target,
|
949
|
+
),
|
950
|
+
condition=_choose_layout_condition,
|
951
|
+
)
|
952
|
+
)
|
953
|
+
layout += common.generate_embed_passmanager(coupling_map)
|
954
|
+
return layout
|
955
|
+
|
956
|
+
|
957
|
+
class SabreLayoutPassManager(PassManagerStagePlugin):
|
958
|
+
"""Plugin class for sabre layout stage."""
|
959
|
+
|
960
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
961
|
+
_given_layout = SetLayout(pass_manager_config.initial_layout)
|
962
|
+
|
963
|
+
def _choose_layout_condition(property_set):
|
964
|
+
return not property_set["layout"]
|
965
|
+
|
966
|
+
def _swap_mapped(property_set):
|
967
|
+
return property_set["final_layout"] is None
|
968
|
+
|
969
|
+
if pass_manager_config.target is None:
|
970
|
+
coupling_map = pass_manager_config.coupling_map
|
971
|
+
else:
|
972
|
+
coupling_map = pass_manager_config.target
|
973
|
+
|
974
|
+
layout = PassManager()
|
975
|
+
layout.append(_given_layout)
|
976
|
+
if coupling_map is None:
|
977
|
+
layout_pass = None
|
978
|
+
elif optimization_level == 0:
|
979
|
+
trial_count = _get_trial_count(5)
|
980
|
+
|
981
|
+
layout_pass = SabreLayout(
|
982
|
+
coupling_map,
|
983
|
+
max_iterations=1,
|
984
|
+
seed=pass_manager_config.seed_transpiler,
|
985
|
+
swap_trials=trial_count,
|
986
|
+
layout_trials=trial_count,
|
987
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
988
|
+
)
|
989
|
+
elif optimization_level == 1:
|
990
|
+
trial_count = _get_trial_count(5)
|
991
|
+
|
992
|
+
layout_pass = SabreLayout(
|
993
|
+
coupling_map,
|
994
|
+
max_iterations=2,
|
995
|
+
seed=pass_manager_config.seed_transpiler,
|
996
|
+
swap_trials=trial_count,
|
997
|
+
layout_trials=trial_count,
|
998
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
999
|
+
)
|
1000
|
+
elif optimization_level == 2:
|
1001
|
+
trial_count = _get_trial_count(20)
|
1002
|
+
|
1003
|
+
layout_pass = SabreLayout(
|
1004
|
+
coupling_map,
|
1005
|
+
max_iterations=2,
|
1006
|
+
seed=pass_manager_config.seed_transpiler,
|
1007
|
+
swap_trials=trial_count,
|
1008
|
+
layout_trials=trial_count,
|
1009
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
1010
|
+
)
|
1011
|
+
elif optimization_level == 3:
|
1012
|
+
trial_count = _get_trial_count(20)
|
1013
|
+
|
1014
|
+
layout_pass = SabreLayout(
|
1015
|
+
coupling_map,
|
1016
|
+
max_iterations=4,
|
1017
|
+
seed=pass_manager_config.seed_transpiler,
|
1018
|
+
swap_trials=trial_count,
|
1019
|
+
layout_trials=trial_count,
|
1020
|
+
skip_routing=pass_manager_config.routing_method not in (None, "default", "sabre"),
|
1021
|
+
)
|
1022
|
+
else:
|
1023
|
+
raise TranspilerError(f"Invalid optimization level: {optimization_level}")
|
1024
|
+
if layout_pass is not None:
|
1025
|
+
layout.append(
|
1026
|
+
ConditionalController(
|
1027
|
+
[
|
1028
|
+
BarrierBeforeFinalMeasurements(
|
1029
|
+
"qiskit.transpiler.internal.routing.protection.barrier"
|
1030
|
+
),
|
1031
|
+
layout_pass,
|
1032
|
+
],
|
1033
|
+
condition=_choose_layout_condition,
|
1034
|
+
)
|
1035
|
+
)
|
1036
|
+
embed = common.generate_embed_passmanager(coupling_map)
|
1037
|
+
layout.append(ConditionalController(embed.to_flow_controller(), condition=_swap_mapped))
|
1038
|
+
return layout
|
1039
|
+
|
1040
|
+
|
1041
|
+
def _get_trial_count(default_trials=5):
|
1042
|
+
if CONFIG.get("sabre_all_threads", None) or os.getenv("QISKIT_SABRE_ALL_THREADS"):
|
1043
|
+
return max(default_num_processes(), default_trials)
|
1044
|
+
return default_trials
|
1045
|
+
|
1046
|
+
|
1047
|
+
class CliffordTOptimizationPassManager(PassManagerStagePlugin):
|
1048
|
+
"""Plugin class for optimization stage"""
|
1049
|
+
|
1050
|
+
def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager:
|
1051
|
+
"""Build pass manager for optimization stage."""
|
1052
|
+
|
1053
|
+
# Obtain the translation method required for this pass to work
|
1054
|
+
optimization = PassManager()
|
1055
|
+
if optimization_level != 0:
|
1056
|
+
_depth_check = [Depth(recurse=True), FixedPoint("depth")]
|
1057
|
+
_size_check = [Size(recurse=True), FixedPoint("size")]
|
1058
|
+
|
1059
|
+
def _opt_control(property_set):
|
1060
|
+
return (not property_set["depth_fixed_point"]) or (
|
1061
|
+
not property_set["size_fixed_point"]
|
1062
|
+
)
|
1063
|
+
|
1064
|
+
if optimization_level == 1:
|
1065
|
+
_opt = [
|
1066
|
+
InverseCancellation(
|
1067
|
+
[
|
1068
|
+
CXGate(),
|
1069
|
+
ECRGate(),
|
1070
|
+
CZGate(),
|
1071
|
+
CYGate(),
|
1072
|
+
XGate(),
|
1073
|
+
YGate(),
|
1074
|
+
ZGate(),
|
1075
|
+
HGate(),
|
1076
|
+
SwapGate(),
|
1077
|
+
(TGate(), TdgGate()),
|
1078
|
+
(SGate(), SdgGate()),
|
1079
|
+
(SXGate(), SXdgGate()),
|
1080
|
+
]
|
1081
|
+
),
|
1082
|
+
ContractIdleWiresInControlFlow(),
|
1083
|
+
]
|
1084
|
+
elif optimization_level in [2, 3]:
|
1085
|
+
# The optimization loop runs OptimizeCliffordT + CommutativeCancellation
|
1086
|
+
# until fixpoint.
|
1087
|
+
_opt = [
|
1088
|
+
RemoveIdentityEquivalent(
|
1089
|
+
approximation_degree=pass_manager_config.approximation_degree,
|
1090
|
+
target=pass_manager_config.target,
|
1091
|
+
),
|
1092
|
+
OptimizeCliffordT(),
|
1093
|
+
CommutativeCancellation(target=pass_manager_config.target),
|
1094
|
+
ContractIdleWiresInControlFlow(),
|
1095
|
+
]
|
1096
|
+
|
1097
|
+
else:
|
1098
|
+
raise TranspilerError(f"Invalid optimization_level: {optimization_level}")
|
1099
|
+
|
1100
|
+
# Build nested flow controllers
|
1101
|
+
optimization.append(_depth_check + _size_check)
|
1102
|
+
|
1103
|
+
opt_loop = _opt + _depth_check + _size_check
|
1104
|
+
optimization.append(DoWhileController(opt_loop, do_while=_opt_control))
|
1105
|
+
# We need to run BasisTranslator because OptimizeCliffordT does not consider the basis set.
|
1106
|
+
if optimization_level in [2, 3]:
|
1107
|
+
optimization.append(
|
1108
|
+
BasisTranslator(
|
1109
|
+
sel, pass_manager_config.basis_gates, pass_manager_config.target
|
1110
|
+
)
|
1111
|
+
)
|
1112
|
+
return optimization
|
1113
|
+
else:
|
1114
|
+
return None
|