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,138 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
|
14
|
+
"""Translates gates to a target basis using a given equivalence library."""
|
15
|
+
|
16
|
+
import logging
|
17
|
+
|
18
|
+
from collections import defaultdict
|
19
|
+
|
20
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
21
|
+
from qiskit._accelerate.basis_translator import base_run
|
22
|
+
|
23
|
+
logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
|
26
|
+
class BasisTranslator(TransformationPass):
|
27
|
+
"""Translates gates to a target basis by searching for a set of translations
|
28
|
+
from a given EquivalenceLibrary.
|
29
|
+
|
30
|
+
This pass operates in several steps:
|
31
|
+
|
32
|
+
* Determine the source basis from the input circuit.
|
33
|
+
* Perform a Dijkstra search over basis sets, starting from the device's
|
34
|
+
target_basis new gates are being generated using the rules from the provided
|
35
|
+
EquivalenceLibrary and the search stops if all gates in the source basis have
|
36
|
+
been generated.
|
37
|
+
* The found path, as a set of rules from the EquivalenceLibrary, is composed
|
38
|
+
into a set of gate replacement rules.
|
39
|
+
* The composed replacement rules are applied in-place to each op node which
|
40
|
+
is not already in the target_basis.
|
41
|
+
|
42
|
+
If the target keyword argument is specified and that
|
43
|
+
:class:`~qiskit.transpiler.Target` objects contains operations
|
44
|
+
which are non-global (i.e. they are defined only for a subset of qubits),
|
45
|
+
as calculated by :meth:`~qiskit.transpiler.Target.get_non_global_operation_names`,
|
46
|
+
this pass will attempt to match the output translation to those constraints.
|
47
|
+
For 1 qubit operations this is straightforward, the pass will perform a
|
48
|
+
search using the union of the set of global operations with the set of operations
|
49
|
+
defined solely on that qubit. For multi-qubit gates this is a bit more involved,
|
50
|
+
while the behavior is initially similar to the single qubit case, just using all
|
51
|
+
the qubits the operation is run on (where order is not significant) isn't sufficient.
|
52
|
+
We also need to consider any potential local qubits defined on subsets of the
|
53
|
+
quantum arguments for the multi-qubit operation. This means the target used for the
|
54
|
+
search of a non-global multi-qubit gate is the union of global operations, non-global
|
55
|
+
multi-qubit gates sharing the same qubits, and any non-global gates defined on
|
56
|
+
any subset of the qubits used.
|
57
|
+
|
58
|
+
|
59
|
+
.. note::
|
60
|
+
|
61
|
+
In the case of non-global operations it is possible for a single
|
62
|
+
execution of this pass to output an incomplete translation if any
|
63
|
+
non-global gates are defined on qubits that are a subset of a larger
|
64
|
+
multi-qubit gate. For example, if you have a ``u`` gate only defined on
|
65
|
+
qubit 0 and an ``x`` gate only on qubit 1 it is possible when
|
66
|
+
translating a 2 qubit operation on qubit 0 and 1 that the output might
|
67
|
+
have ``u`` on qubit 1 and ``x`` on qubit 0. Typically running this pass
|
68
|
+
a second time will correct these issues.
|
69
|
+
|
70
|
+
.. _translation_errors:
|
71
|
+
|
72
|
+
Translation Errors
|
73
|
+
------------------
|
74
|
+
|
75
|
+
This pass will error if there is no path to translate an input gate to
|
76
|
+
the specified basis. However, during a typical/default preset passmanager
|
77
|
+
this pass gets run multiple times at different stages of the compilation
|
78
|
+
pipeline. This means that potentially the input gates that are getting
|
79
|
+
translated were not in the input circuit to :func:`~.transpile` as they
|
80
|
+
were generated by an intermediate transform in the circuit.
|
81
|
+
|
82
|
+
When this error occurs it typically means that either the target basis
|
83
|
+
is not universal or there are additional equivalence rules needed in the
|
84
|
+
:class:`~.EquivalenceLibrary` instance being used by the
|
85
|
+
:class:`~.BasisTranslator` pass. You can refer to
|
86
|
+
:ref:`custom_basis_gates` for details on adding custom equivalence rules.
|
87
|
+
"""
|
88
|
+
|
89
|
+
def __init__(self, equivalence_library, target_basis, target=None, min_qubits=0):
|
90
|
+
"""Initialize a BasisTranslator instance.
|
91
|
+
|
92
|
+
Args:
|
93
|
+
equivalence_library (EquivalenceLibrary): The equivalence library
|
94
|
+
which will be used by the BasisTranslator pass. (Instructions in
|
95
|
+
this library will not be unrolled by this pass.)
|
96
|
+
target_basis (list[str]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
|
97
|
+
target (Target): The backend compilation target
|
98
|
+
min_qubits (int): The minimum number of qubits for operations in the input
|
99
|
+
dag to translate.
|
100
|
+
"""
|
101
|
+
super().__init__()
|
102
|
+
self._equiv_lib = equivalence_library
|
103
|
+
self._target_basis = target_basis
|
104
|
+
# Bypass target if it doesn't contain any basis gates (i.e. it's a _FakeTarget), as this
|
105
|
+
# not part of the official target model.
|
106
|
+
self._target = target if target is not None and len(target.operation_names) > 0 else None
|
107
|
+
self._non_global_operations = None
|
108
|
+
self._qargs_with_non_global_operation = {}
|
109
|
+
self._min_qubits = min_qubits
|
110
|
+
if self._target is not None:
|
111
|
+
self._non_global_operations = self._target.get_non_global_operation_names()
|
112
|
+
self._qargs_with_non_global_operation = defaultdict(set)
|
113
|
+
for gate in self._non_global_operations:
|
114
|
+
for qarg in self._target[gate]:
|
115
|
+
self._qargs_with_non_global_operation[qarg].add(gate)
|
116
|
+
|
117
|
+
def run(self, dag):
|
118
|
+
"""Translate an input DAGCircuit to the target basis.
|
119
|
+
|
120
|
+
Args:
|
121
|
+
dag (DAGCircuit): input dag
|
122
|
+
|
123
|
+
Raises:
|
124
|
+
TranspilerError: if the target basis cannot be reached
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
DAGCircuit: translated circuit.
|
128
|
+
"""
|
129
|
+
|
130
|
+
return base_run(
|
131
|
+
dag,
|
132
|
+
self._equiv_lib,
|
133
|
+
self._qargs_with_non_global_operation,
|
134
|
+
self._min_qubits,
|
135
|
+
None if self._target_basis is None else set(self._target_basis),
|
136
|
+
self._target,
|
137
|
+
None if self._non_global_operations is None else set(self._non_global_operations),
|
138
|
+
)
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Expand a gate in a circuit using its decomposition rules."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Sequence
|
18
|
+
from typing import Type
|
19
|
+
from fnmatch import fnmatch
|
20
|
+
|
21
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
22
|
+
from qiskit.transpiler.passes.utils import control_flow
|
23
|
+
from qiskit.dagcircuit.dagnode import DAGOpNode
|
24
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
25
|
+
from qiskit.converters.circuit_to_dag import circuit_to_dag
|
26
|
+
from qiskit.circuit.instruction import Instruction
|
27
|
+
|
28
|
+
from ..synthesis import HighLevelSynthesis
|
29
|
+
|
30
|
+
|
31
|
+
class Decompose(TransformationPass):
|
32
|
+
"""Expand a gate in a circuit using its decomposition rules."""
|
33
|
+
|
34
|
+
def __init__(
|
35
|
+
self,
|
36
|
+
gates_to_decompose: (
|
37
|
+
str | Type[Instruction] | Sequence[str | Type[Instruction]] | None
|
38
|
+
) = None,
|
39
|
+
apply_synthesis: bool = False,
|
40
|
+
) -> None:
|
41
|
+
"""
|
42
|
+
Args:
|
43
|
+
gates_to_decompose: optional subset of gates to be decomposed,
|
44
|
+
identified by gate label, name or type. Defaults to all gates.
|
45
|
+
apply_synthesis: If ``True``, run :class:`.HighLevelSynthesis` to synthesize operations
|
46
|
+
that do not have a definition attached.
|
47
|
+
"""
|
48
|
+
super().__init__()
|
49
|
+
self.gates_to_decompose = gates_to_decompose
|
50
|
+
self.apply_synthesis = apply_synthesis
|
51
|
+
|
52
|
+
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
53
|
+
"""Run the Decompose pass on `dag`.
|
54
|
+
|
55
|
+
Args:
|
56
|
+
dag: input dag.
|
57
|
+
|
58
|
+
Returns:
|
59
|
+
output dag where ``gate`` was expanded.
|
60
|
+
"""
|
61
|
+
# We might use HLS to synthesize objects that do not have a definition
|
62
|
+
hls = HighLevelSynthesis(qubits_initially_zero=False) if self.apply_synthesis else None
|
63
|
+
|
64
|
+
# Walk through the DAG and expand each non-basis node
|
65
|
+
for node in dag.op_nodes():
|
66
|
+
# Check in self.gates_to_decompose if the operation should be decomposed
|
67
|
+
if not self._should_decompose(node):
|
68
|
+
continue
|
69
|
+
|
70
|
+
if node.is_control_flow():
|
71
|
+
decomposition = control_flow.map_blocks(self.run, node.op)
|
72
|
+
dag.substitute_node(node, decomposition, inplace=True)
|
73
|
+
|
74
|
+
elif getattr(node.op, "definition", None) is None:
|
75
|
+
# if we try to synthesize, turn the node into a DAGCircuit and run HLS
|
76
|
+
if self.apply_synthesis:
|
77
|
+
node_as_dag = _node_to_dag(node)
|
78
|
+
synthesized = hls.run(node_as_dag)
|
79
|
+
dag.substitute_node_with_dag(node, synthesized)
|
80
|
+
|
81
|
+
# else: no definition and synthesis not enabled, so we do nothing
|
82
|
+
else:
|
83
|
+
rule = node.op.definition.data
|
84
|
+
|
85
|
+
if (
|
86
|
+
len(rule) == 1
|
87
|
+
and len(node.qargs) == len(rule[0].qubits) == 1 # to preserve gate order
|
88
|
+
and len(node.cargs) == len(rule[0].clbits) == 0
|
89
|
+
):
|
90
|
+
if node.op.definition.global_phase:
|
91
|
+
dag.global_phase += node.op.definition.global_phase
|
92
|
+
dag.substitute_node(node, rule[0].operation, inplace=True)
|
93
|
+
else:
|
94
|
+
decomposition = circuit_to_dag(node.op.definition)
|
95
|
+
dag.substitute_node_with_dag(node, decomposition)
|
96
|
+
|
97
|
+
return dag
|
98
|
+
|
99
|
+
def _should_decompose(self, node: DAGOpNode) -> bool:
|
100
|
+
"""Call a decomposition pass on this circuit to decompose one level (shallow decompose)."""
|
101
|
+
if self.gates_to_decompose is None: # check if no gates given
|
102
|
+
return True
|
103
|
+
|
104
|
+
if not isinstance(self.gates_to_decompose, list):
|
105
|
+
gates = [self.gates_to_decompose]
|
106
|
+
else:
|
107
|
+
gates = self.gates_to_decompose
|
108
|
+
|
109
|
+
strings_list = [s for s in gates if isinstance(s, str)]
|
110
|
+
gate_type_list = [g for g in gates if isinstance(g, type)]
|
111
|
+
|
112
|
+
if (
|
113
|
+
getattr(node.op, "label", None) is not None
|
114
|
+
and node.op.label != ""
|
115
|
+
and ( # check if label or label wildcard is given
|
116
|
+
node.op.label in gates or any(fnmatch(node.op.label, p) for p in strings_list)
|
117
|
+
)
|
118
|
+
):
|
119
|
+
return True
|
120
|
+
elif node.name in gates or any( # check if name or name wildcard is given
|
121
|
+
fnmatch(node.name, p) for p in strings_list
|
122
|
+
):
|
123
|
+
return True
|
124
|
+
elif any(isinstance(node.op, op) for op in gate_type_list): # check if Gate type given
|
125
|
+
return True
|
126
|
+
else:
|
127
|
+
return False
|
128
|
+
|
129
|
+
|
130
|
+
def _node_to_dag(node: DAGOpNode) -> DAGCircuit:
|
131
|
+
# create new dag and apply the operation
|
132
|
+
dag = DAGCircuit()
|
133
|
+
dag.add_qubits(node.qargs)
|
134
|
+
dag.add_clbits(node.cargs)
|
135
|
+
dag.apply_operation_back(node.op, node.qargs, node.cargs)
|
136
|
+
|
137
|
+
return dag
|
@@ -0,0 +1,175 @@
|
|
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
|
+
"""Translate parameterized gates only, and leave others as they are."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import Instruction, ParameterExpression, Qubit, Clbit
|
18
|
+
from qiskit.circuit.equivalence_library import EquivalenceLibrary
|
19
|
+
from qiskit.converters import circuit_to_dag
|
20
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
21
|
+
from qiskit.exceptions import QiskitError
|
22
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
23
|
+
from qiskit.transpiler.passes.basis.basis_translator import BasisTranslator
|
24
|
+
from qiskit.transpiler.target import Target
|
25
|
+
|
26
|
+
|
27
|
+
class TranslateParameterizedGates(TransformationPass):
|
28
|
+
"""Translate parameterized gates to a supported basis set.
|
29
|
+
|
30
|
+
Once a parameterized instruction is found that is not in the ``supported_gates`` list,
|
31
|
+
the instruction is decomposed one level and the parameterized sub-blocks are recursively
|
32
|
+
decomposed. The recursion is stopped once all parameterized gates are in ``supported_gates``,
|
33
|
+
or if a gate has no definition and a translation to the basis is attempted (this might happen
|
34
|
+
e.g. for the ``UGate`` if it's not in the specified gate list).
|
35
|
+
|
36
|
+
Example:
|
37
|
+
|
38
|
+
The following, multiply nested circuit::
|
39
|
+
|
40
|
+
from qiskit.circuit import QuantumCircuit, ParameterVector
|
41
|
+
from qiskit.transpiler.passes import TranslateParameterizedGates
|
42
|
+
|
43
|
+
x = ParameterVector("x", 4)
|
44
|
+
block1 = QuantumCircuit(1)
|
45
|
+
block1.rx(x[0], 0)
|
46
|
+
|
47
|
+
sub_block = QuantumCircuit(2)
|
48
|
+
sub_block.cx(0, 1)
|
49
|
+
sub_block.rz(x[2], 0)
|
50
|
+
|
51
|
+
block2 = QuantumCircuit(2)
|
52
|
+
block2.ry(x[1], 0)
|
53
|
+
block2.append(sub_block.to_gate(), [0, 1])
|
54
|
+
|
55
|
+
block3 = QuantumCircuit(3)
|
56
|
+
block3.ccx(0, 1, 2)
|
57
|
+
|
58
|
+
circuit = QuantumCircuit(3)
|
59
|
+
circuit.append(block1.to_gate(), [1])
|
60
|
+
circuit.append(block2.to_gate(), [0, 1])
|
61
|
+
circuit.append(block3.to_gate(), [0, 1, 2])
|
62
|
+
circuit.cry(x[3], 0, 2)
|
63
|
+
|
64
|
+
supported_gates = ["rx", "ry", "rz", "cp", "crx", "cry", "crz"]
|
65
|
+
unrolled = TranslateParameterizedGates(supported_gates)(circuit)
|
66
|
+
|
67
|
+
is decomposed to::
|
68
|
+
|
69
|
+
┌──────────┐ ┌──────────┐┌─────────────┐
|
70
|
+
q_0: ┤ Ry(x[1]) ├──■──┤ Rz(x[2]) ├┤0 ├─────■──────
|
71
|
+
├──────────┤┌─┴─┐└──────────┘│ │ │
|
72
|
+
q_1: ┤ Rx(x[0]) ├┤ X ├────────────┤1 circuit-92 ├─────┼──────
|
73
|
+
└──────────┘└───┘ │ │┌────┴─────┐
|
74
|
+
q_2: ─────────────────────────────┤2 ├┤ Ry(x[3]) ├
|
75
|
+
└─────────────┘└──────────┘
|
76
|
+
|
77
|
+
"""
|
78
|
+
|
79
|
+
def __init__(
|
80
|
+
self,
|
81
|
+
supported_gates: list[str] | None = None,
|
82
|
+
equivalence_library: EquivalenceLibrary | None = None,
|
83
|
+
target: Target | None = None,
|
84
|
+
) -> None:
|
85
|
+
"""
|
86
|
+
Args:
|
87
|
+
supported_gates: A list of suppported basis gates specified as string. If ``None``,
|
88
|
+
a ``target`` must be provided.
|
89
|
+
equivalence_library: The equivalence library to translate the gates. Defaults
|
90
|
+
to the equivalence library of all Qiskit standard gates.
|
91
|
+
target: A :class:`.Target` containing the supported operations. If ``None``,
|
92
|
+
``supported_gates`` must be set. Note that this argument takes precedence over
|
93
|
+
``supported_gates``, if both are set.
|
94
|
+
|
95
|
+
Raises:
|
96
|
+
ValueError: If neither of ``supported_gates`` and ``target`` are passed.
|
97
|
+
"""
|
98
|
+
super().__init__()
|
99
|
+
|
100
|
+
# get the default equivalence library, if none has been set
|
101
|
+
if equivalence_library is None:
|
102
|
+
from qiskit.circuit.library.standard_gates.equivalence_library import _sel
|
103
|
+
|
104
|
+
equivalence_library = _sel
|
105
|
+
|
106
|
+
# The target takes precedence over the supported_gates argument. If neither are set,
|
107
|
+
# raise an error.
|
108
|
+
if target is not None:
|
109
|
+
supported_gates = target.operation_names
|
110
|
+
elif supported_gates is None:
|
111
|
+
raise ValueError("One of ``supported_gates`` or ``target`` must be specified.")
|
112
|
+
|
113
|
+
self._supported_gates = supported_gates
|
114
|
+
self._target = target
|
115
|
+
self._translator = BasisTranslator(equivalence_library, supported_gates, target=target)
|
116
|
+
|
117
|
+
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
118
|
+
"""Run the transpiler pass.
|
119
|
+
|
120
|
+
Args:
|
121
|
+
dag: The DAG circuit in which the parameterized gates should be unrolled.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
A DAG where the parameterized gates have been unrolled.
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
QiskitError: If the circuit cannot be unrolled.
|
128
|
+
"""
|
129
|
+
for node in dag.op_nodes():
|
130
|
+
# check whether it is parameterized and we need to decompose it
|
131
|
+
if _is_parameterized(node.op) and not _is_supported(
|
132
|
+
node, self._supported_gates, self._target
|
133
|
+
):
|
134
|
+
definition = node.op.definition
|
135
|
+
|
136
|
+
if definition is not None:
|
137
|
+
# recurse to unroll further parameterized blocks
|
138
|
+
unrolled = self.run(circuit_to_dag(definition))
|
139
|
+
else:
|
140
|
+
# if we hit a base case, try to translate to the specified basis
|
141
|
+
try:
|
142
|
+
unrolled = self._translator.run(_instruction_to_dag(node.op))
|
143
|
+
except Exception as exc:
|
144
|
+
raise QiskitError("Failed to translate final block.") from exc
|
145
|
+
|
146
|
+
# replace with unrolled (or translated) dag
|
147
|
+
dag.substitute_node_with_dag(node, unrolled)
|
148
|
+
|
149
|
+
return dag
|
150
|
+
|
151
|
+
|
152
|
+
def _is_parameterized(op: Instruction) -> bool:
|
153
|
+
return any(
|
154
|
+
isinstance(param, ParameterExpression) and len(param.parameters) > 0 for param in op.params
|
155
|
+
)
|
156
|
+
|
157
|
+
|
158
|
+
def _is_supported(node: DAGOpNode, supported_gates: list[str], target: Target | None) -> bool:
|
159
|
+
"""Check whether the node is supported.
|
160
|
+
|
161
|
+
If the target is provided, check using the target, otherwise the supported_gates are used.
|
162
|
+
"""
|
163
|
+
if target is not None:
|
164
|
+
return target.instruction_supported(node.op.name)
|
165
|
+
|
166
|
+
return node.op.name in supported_gates
|
167
|
+
|
168
|
+
|
169
|
+
def _instruction_to_dag(op: Instruction) -> DAGCircuit:
|
170
|
+
dag = DAGCircuit()
|
171
|
+
dag.add_qubits([Qubit() for _ in range(op.num_qubits)])
|
172
|
+
dag.add_qubits([Clbit() for _ in range(op.num_clbits)])
|
173
|
+
dag.apply_operation_back(op, dag.qubits, dag.clbits, check=False)
|
174
|
+
|
175
|
+
return dag
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Recursively expands 3q+ gates until the circuit only contains 2q or 1q gates."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit.transpiler.passes.utils import control_flow
|
17
|
+
from qiskit.exceptions import QiskitError
|
18
|
+
from qiskit.circuit import ControlFlowOp
|
19
|
+
from qiskit.converters.circuit_to_dag import circuit_to_dag
|
20
|
+
|
21
|
+
|
22
|
+
class Unroll3qOrMore(TransformationPass):
|
23
|
+
"""Recursively expands 3q+ gates until the circuit only contains 2q or 1q gates."""
|
24
|
+
|
25
|
+
def __init__(self, target=None, basis_gates=None):
|
26
|
+
"""Initialize the Unroll3qOrMore pass
|
27
|
+
|
28
|
+
Args:
|
29
|
+
target (Target): The target object representing the compilation
|
30
|
+
target. If specified any multi-qubit instructions in the
|
31
|
+
circuit when the pass is run that are supported by the target
|
32
|
+
device will be left in place. If both this and ``basis_gates``
|
33
|
+
are specified only the target will be checked.
|
34
|
+
basis_gates (list): A list of basis gate names that the target
|
35
|
+
device supports. If specified any gate names in the circuit
|
36
|
+
which are present in this list will not be unrolled. If both
|
37
|
+
this and ``target`` are specified only the target will be used
|
38
|
+
for checking which gates are supported.
|
39
|
+
"""
|
40
|
+
super().__init__()
|
41
|
+
self.target = target
|
42
|
+
self.basis_gates = None
|
43
|
+
if basis_gates is not None:
|
44
|
+
self.basis_gates = set(basis_gates)
|
45
|
+
|
46
|
+
def run(self, dag):
|
47
|
+
"""Run the Unroll3qOrMore pass on `dag`.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
dag(DAGCircuit): input dag
|
51
|
+
Returns:
|
52
|
+
DAGCircuit: output dag with maximum node degrees of 2
|
53
|
+
Raises:
|
54
|
+
QiskitError: if a 3q+ gate is not decomposable
|
55
|
+
"""
|
56
|
+
for node in dag.multi_qubit_ops():
|
57
|
+
|
58
|
+
if isinstance(node.op, ControlFlowOp):
|
59
|
+
dag.substitute_node(node, control_flow.map_blocks(self.run, node.op))
|
60
|
+
continue
|
61
|
+
|
62
|
+
if self.target is not None:
|
63
|
+
# Treat target instructions as global since this pass can be run
|
64
|
+
# prior to layout and routing we don't have physical qubits from
|
65
|
+
# the circuit yet
|
66
|
+
if node.name in self.target:
|
67
|
+
continue
|
68
|
+
elif self.basis_gates is not None and node.name in self.basis_gates:
|
69
|
+
continue
|
70
|
+
|
71
|
+
# TODO: allow choosing other possible decompositions
|
72
|
+
rule = node.op.definition.data
|
73
|
+
if not rule:
|
74
|
+
if rule == []: # empty node
|
75
|
+
dag.remove_op_node(node)
|
76
|
+
continue
|
77
|
+
raise QiskitError(
|
78
|
+
"Cannot unroll all 3q or more gates. "
|
79
|
+
f"No rule to expand instruction {node.op.name}."
|
80
|
+
)
|
81
|
+
decomposition = circuit_to_dag(node.op.definition, copy_operations=False)
|
82
|
+
decomposition = self.run(decomposition) # recursively unroll
|
83
|
+
dag.substitute_node_with_dag(node, decomposition)
|
84
|
+
return dag
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Unrolls instructions with custom definitions."""
|
14
|
+
|
15
|
+
from qiskit.exceptions import QiskitError
|
16
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
17
|
+
from qiskit.transpiler.passes.utils import control_flow
|
18
|
+
from qiskit.circuit import ControlledGate, ControlFlowOp
|
19
|
+
from qiskit.converters.circuit_to_dag import circuit_to_dag
|
20
|
+
|
21
|
+
|
22
|
+
class UnrollCustomDefinitions(TransformationPass):
|
23
|
+
"""Unrolls instructions with custom definitions."""
|
24
|
+
|
25
|
+
def __init__(self, equivalence_library, basis_gates=None, target=None, min_qubits=0):
|
26
|
+
"""Unrolls instructions with custom definitions.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
equivalence_library (EquivalenceLibrary): The equivalence library
|
30
|
+
which will be used by the BasisTranslator pass. (Instructions in
|
31
|
+
this library will not be unrolled by this pass.)
|
32
|
+
basis_gates (Optional[list[str]]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
|
33
|
+
Ignored if ``target`` is also specified.
|
34
|
+
target (Optional[Target]): The :class:`~.Target` object corresponding to the compilation
|
35
|
+
target. When specified, any argument specified for ``basis_gates`` is ignored.
|
36
|
+
min_qubits (int): The minimum number of qubits for operations in the input
|
37
|
+
dag to translate.
|
38
|
+
"""
|
39
|
+
|
40
|
+
super().__init__()
|
41
|
+
self._equiv_lib = equivalence_library
|
42
|
+
self._basis_gates = basis_gates
|
43
|
+
self._target = target
|
44
|
+
self._min_qubits = min_qubits
|
45
|
+
|
46
|
+
def run(self, dag):
|
47
|
+
"""Run the UnrollCustomDefinitions pass on `dag`.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
dag (DAGCircuit): input dag
|
51
|
+
|
52
|
+
Raises:
|
53
|
+
QiskitError: if unable to unroll given the basis due to undefined
|
54
|
+
decomposition rules (such as a bad basis) or excessive recursion.
|
55
|
+
|
56
|
+
Returns:
|
57
|
+
DAGCircuit: output unrolled dag
|
58
|
+
"""
|
59
|
+
|
60
|
+
if self._basis_gates is None and self._target is None:
|
61
|
+
return dag
|
62
|
+
|
63
|
+
device_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
|
64
|
+
if self._target is None:
|
65
|
+
device_insts |= set(self._basis_gates)
|
66
|
+
|
67
|
+
for node in dag.op_nodes():
|
68
|
+
if isinstance(node.op, ControlFlowOp):
|
69
|
+
dag.substitute_node(
|
70
|
+
node,
|
71
|
+
control_flow.map_blocks(self.run, node.op),
|
72
|
+
)
|
73
|
+
continue
|
74
|
+
|
75
|
+
if getattr(node.op, "_directive", False):
|
76
|
+
continue
|
77
|
+
|
78
|
+
if len(node.qargs) < self._min_qubits:
|
79
|
+
continue
|
80
|
+
|
81
|
+
controlled_gate_open_ctrl = isinstance(node.op, ControlledGate) and node.op._open_ctrl
|
82
|
+
if not controlled_gate_open_ctrl:
|
83
|
+
if self._target is not None:
|
84
|
+
inst_supported = self._target.instruction_supported(
|
85
|
+
operation_name=node.op.name,
|
86
|
+
qargs=tuple(dag.find_bit(x).index for x in node.qargs),
|
87
|
+
)
|
88
|
+
else:
|
89
|
+
inst_supported = node.name in device_insts
|
90
|
+
|
91
|
+
if inst_supported or self._equiv_lib.has_entry(node.op):
|
92
|
+
continue
|
93
|
+
try:
|
94
|
+
unrolled = getattr(node.op, "definition", None)
|
95
|
+
except TypeError as err:
|
96
|
+
raise QiskitError(f"Error decomposing node {node.name}: {err}") from err
|
97
|
+
|
98
|
+
if unrolled is None:
|
99
|
+
# opaque node
|
100
|
+
raise QiskitError(
|
101
|
+
f"Cannot unroll the circuit to the given basis, {str(self._basis_gates)}. "
|
102
|
+
f"Instruction {node.op.name} not found in equivalence library "
|
103
|
+
"and no rule found to expand."
|
104
|
+
)
|
105
|
+
|
106
|
+
decomposition = circuit_to_dag(unrolled, copy_operations=False)
|
107
|
+
unrolled_dag = self.run(decomposition)
|
108
|
+
dag.substitute_node_with_dag(node, unrolled_dag)
|
109
|
+
|
110
|
+
return dag
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing transpiler layout passes."""
|
14
|
+
|
15
|
+
from .set_layout import SetLayout
|
16
|
+
from .trivial_layout import TrivialLayout
|
17
|
+
from .dense_layout import DenseLayout
|
18
|
+
from .sabre_layout import SabreLayout
|
19
|
+
from .csp_layout import CSPLayout
|
20
|
+
from .vf2_layout import VF2Layout
|
21
|
+
from .vf2_post_layout import VF2PostLayout
|
22
|
+
from .apply_layout import ApplyLayout
|
23
|
+
from .layout_2q_distance import Layout2qDistance
|
24
|
+
from .enlarge_with_ancilla import EnlargeWithAncilla
|
25
|
+
from .full_ancilla_allocation import FullAncillaAllocation
|
26
|
+
from .sabre_pre_layout import SabrePreLayout
|