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,158 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Given a template and a circuit: it applies template matching and substitutes
|
15
|
+
all compatible maximal matches that reduces the size of the circuit.
|
16
|
+
|
17
|
+
**Reference:**
|
18
|
+
|
19
|
+
[1] Iten, R., Moyard, R., Metger, T., Sutter, D. and Woerner, S., 2020.
|
20
|
+
Exact and practical pattern matching for quantum circuit optimization.
|
21
|
+
`arXiv:1909.05270 <https://arxiv.org/abs/1909.05270>`_
|
22
|
+
"""
|
23
|
+
import numpy as np
|
24
|
+
|
25
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
+
from qiskit.dagcircuit import DAGDependency
|
27
|
+
from qiskit.converters.circuit_to_dagdependency import circuit_to_dagdependency
|
28
|
+
from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit
|
29
|
+
from qiskit.converters.dag_to_dagdependency import dag_to_dagdependency
|
30
|
+
from qiskit.converters.dagdependency_to_dag import dagdependency_to_dag
|
31
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
32
|
+
from qiskit.circuit.library.templates import template_nct_2a_1, template_nct_2a_2, template_nct_2a_3
|
33
|
+
from qiskit.quantum_info.operators.operator import Operator
|
34
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
35
|
+
from qiskit.transpiler.passes.optimization.template_matching import (
|
36
|
+
TemplateMatching,
|
37
|
+
TemplateSubstitution,
|
38
|
+
MaximalMatches,
|
39
|
+
)
|
40
|
+
|
41
|
+
|
42
|
+
class TemplateOptimization(TransformationPass):
|
43
|
+
"""
|
44
|
+
Class for the template optimization pass.
|
45
|
+
"""
|
46
|
+
|
47
|
+
def __init__(
|
48
|
+
self,
|
49
|
+
template_list=None,
|
50
|
+
heuristics_qubits_param=None,
|
51
|
+
heuristics_backward_param=None,
|
52
|
+
user_cost_dict=None,
|
53
|
+
):
|
54
|
+
"""
|
55
|
+
Args:
|
56
|
+
template_list (list[QuantumCircuit()]): list of the different template circuit to apply.
|
57
|
+
heuristics_backward_param (list[int]): [length, survivor] Those are the parameters for
|
58
|
+
applying heuristics on the backward part of the algorithm. This part of the
|
59
|
+
algorithm creates a tree of matching scenario. This tree grows exponentially. The
|
60
|
+
heuristics evaluate which scenarios have the longest match and keep only those.
|
61
|
+
The length is the interval in the tree for cutting it and survivor is the number
|
62
|
+
of scenarios that are kept. We advise to use l=3 and s=1 to have serious time
|
63
|
+
advantage. We remind that the heuristics implies losing a part of the maximal
|
64
|
+
matches. Check reference for more details.
|
65
|
+
heuristics_qubits_param (list[int]): [length] The heuristics for the qubit choice make
|
66
|
+
guesses from the dag dependency of the circuit in order to limit the number of
|
67
|
+
qubit configurations to explore. The length is the number of successors or not
|
68
|
+
predecessors that will be explored in the dag dependency of the circuit, each
|
69
|
+
qubits of the nodes are added to the set of authorized qubits. We advise to use
|
70
|
+
length=1. Check reference for more details.
|
71
|
+
user_cost_dict (Dict[str, int]): quantum cost dictionary passed to TemplateSubstitution
|
72
|
+
to configure its behavior. This will override any default values if None
|
73
|
+
is not given. The key is the name of the gate and the value its quantum cost.
|
74
|
+
"""
|
75
|
+
super().__init__()
|
76
|
+
# If no template is given; the template are set as x-x, cx-cx, ccx-ccx.
|
77
|
+
if template_list is None:
|
78
|
+
template_list = [template_nct_2a_1(), template_nct_2a_2(), template_nct_2a_3()]
|
79
|
+
self.template_list = template_list
|
80
|
+
self.heuristics_qubits_param = (
|
81
|
+
heuristics_qubits_param if heuristics_qubits_param is not None else []
|
82
|
+
)
|
83
|
+
self.heuristics_backward_param = (
|
84
|
+
heuristics_backward_param if heuristics_backward_param is not None else []
|
85
|
+
)
|
86
|
+
|
87
|
+
self.user_cost_dict = user_cost_dict
|
88
|
+
|
89
|
+
def run(self, dag):
|
90
|
+
"""
|
91
|
+
Args:
|
92
|
+
dag(DAGCircuit): DAG circuit.
|
93
|
+
Returns:
|
94
|
+
DAGCircuit: optimized DAG circuit.
|
95
|
+
Raises:
|
96
|
+
TranspilerError: If the template has not the right form or
|
97
|
+
if the output circuit acts differently as the input circuit.
|
98
|
+
"""
|
99
|
+
circuit_dag = dag
|
100
|
+
circuit_dag_dep = dag_to_dagdependency(circuit_dag)
|
101
|
+
|
102
|
+
for template in self.template_list:
|
103
|
+
if not isinstance(template, (QuantumCircuit, DAGDependency)):
|
104
|
+
raise TranspilerError("A template is a Quantumciruit or a DAGDependency.")
|
105
|
+
|
106
|
+
if len(template.qubits) > len(circuit_dag_dep.qubits):
|
107
|
+
continue
|
108
|
+
|
109
|
+
identity = np.identity(2 ** len(template.qubits), dtype=complex)
|
110
|
+
try:
|
111
|
+
if isinstance(template, DAGDependency):
|
112
|
+
data = Operator(dagdependency_to_circuit(template)).data
|
113
|
+
else:
|
114
|
+
data = Operator(template).data
|
115
|
+
|
116
|
+
comparison = np.allclose(data, identity)
|
117
|
+
|
118
|
+
if not comparison:
|
119
|
+
raise TranspilerError(
|
120
|
+
"A template is a Quantumciruit() that performs the identity."
|
121
|
+
)
|
122
|
+
except TypeError:
|
123
|
+
pass
|
124
|
+
|
125
|
+
if isinstance(template, QuantumCircuit):
|
126
|
+
template_dag_dep = circuit_to_dagdependency(template)
|
127
|
+
else:
|
128
|
+
template_dag_dep = template
|
129
|
+
|
130
|
+
template_m = TemplateMatching(
|
131
|
+
circuit_dag_dep,
|
132
|
+
template_dag_dep,
|
133
|
+
self.heuristics_qubits_param,
|
134
|
+
self.heuristics_backward_param,
|
135
|
+
)
|
136
|
+
|
137
|
+
template_m.run_template_matching()
|
138
|
+
|
139
|
+
matches = template_m.match_list
|
140
|
+
|
141
|
+
if matches:
|
142
|
+
maximal = MaximalMatches(matches)
|
143
|
+
maximal.run_maximal_matches()
|
144
|
+
max_matches = maximal.max_match_list
|
145
|
+
|
146
|
+
substitution = TemplateSubstitution(
|
147
|
+
max_matches,
|
148
|
+
template_m.circuit_dag_dep,
|
149
|
+
template_m.template_dag_dep,
|
150
|
+
self.user_cost_dict,
|
151
|
+
)
|
152
|
+
substitution.run_dag_opt()
|
153
|
+
|
154
|
+
circuit_dag_dep = substitution.dag_dep_optimized
|
155
|
+
else:
|
156
|
+
continue
|
157
|
+
circuit_dag = dagdependency_to_dag(circuit_dag_dep)
|
158
|
+
return circuit_dag
|
@@ -0,0 +1,21 @@
|
|
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 mapping passes."""
|
14
|
+
|
15
|
+
from .basic_swap import BasicSwap
|
16
|
+
from .layout_transformation import LayoutTransformation
|
17
|
+
from .lookahead_swap import LookaheadSwap
|
18
|
+
from .sabre_swap import SabreSwap
|
19
|
+
from .commuting_2q_gate_routing.commuting_2q_gate_router import Commuting2qGateRouter
|
20
|
+
from .commuting_2q_gate_routing.swap_strategy import SwapStrategy
|
21
|
+
from .star_prerouting import StarPreRouting
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
# Copyright 2019 Andrew M. Childs, Eddie Schoute, Cem M. Unsal
|
14
|
+
#
|
15
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
16
|
+
# you may not use this file except in compliance with the License.
|
17
|
+
# You may obtain a copy of the License at
|
18
|
+
#
|
19
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
20
|
+
#
|
21
|
+
# Unless required by applicable law or agreed to in writing, software
|
22
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
23
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
24
|
+
# See the License for the specific language governing permissions and
|
25
|
+
# limitations under the License.
|
26
|
+
|
27
|
+
"""The permutation modules contains some functions for permuting on architectures given a mapping.
|
28
|
+
|
29
|
+
A permutation function takes in a graph and a permutation of graph nodes,
|
30
|
+
and returns a sequence of SWAPs that implements that permutation on the graph.
|
31
|
+
"""
|
32
|
+
|
33
|
+
from .token_swapper import ApproximateTokenSwapper
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
# Copyright 2019 Andrew M. Childs, Eddie Schoute, Cem M. Unsal
|
14
|
+
#
|
15
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
16
|
+
# you may not use this file except in compliance with the License.
|
17
|
+
# You may obtain a copy of the License at
|
18
|
+
#
|
19
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
20
|
+
#
|
21
|
+
# Unless required by applicable law or agreed to in writing, software
|
22
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
23
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
24
|
+
# See the License for the specific language governing permissions and
|
25
|
+
# limitations under the License.
|
26
|
+
|
27
|
+
"""Permutation algorithms for general graphs."""
|
28
|
+
|
29
|
+
from __future__ import annotations
|
30
|
+
import logging
|
31
|
+
from collections.abc import Mapping
|
32
|
+
|
33
|
+
import numpy as np
|
34
|
+
import rustworkx as rx
|
35
|
+
|
36
|
+
from .types import Swap, Permutation
|
37
|
+
from .util import PermutationCircuit, permutation_circuit
|
38
|
+
|
39
|
+
|
40
|
+
logger = logging.getLogger(__name__)
|
41
|
+
|
42
|
+
|
43
|
+
class ApproximateTokenSwapper:
|
44
|
+
"""A class for computing approximate solutions to the Token Swapping problem.
|
45
|
+
|
46
|
+
Internally caches the graph and associated datastructures for re-use.
|
47
|
+
"""
|
48
|
+
|
49
|
+
def __init__(self, graph: rx.PyGraph, seed: int | np.random.Generator | None = None) -> None:
|
50
|
+
"""Construct an ApproximateTokenSwapping object.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
graph: Undirected graph represented a coupling map.
|
54
|
+
seed: Seed to use for random trials.
|
55
|
+
"""
|
56
|
+
self.graph = graph
|
57
|
+
self.shortest_paths = rx.graph_distance_matrix(graph)
|
58
|
+
if isinstance(seed, np.random.Generator):
|
59
|
+
self.seed = seed
|
60
|
+
else:
|
61
|
+
self.seed = np.random.default_rng(seed)
|
62
|
+
|
63
|
+
def distance(self, vertex0: int, vertex1: int) -> int:
|
64
|
+
"""Compute the distance between two nodes in `graph`."""
|
65
|
+
return self.shortest_paths[vertex0, vertex1]
|
66
|
+
|
67
|
+
def permutation_circuit(self, permutation: Permutation, trials: int = 4) -> PermutationCircuit:
|
68
|
+
"""Perform an approximately optimal Token Swapping algorithm to implement the permutation.
|
69
|
+
|
70
|
+
Args:
|
71
|
+
permutation: The partial mapping to implement in swaps.
|
72
|
+
trials: The number of trials to try to perform the mapping. Minimize over the trials.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
The circuit to implement the permutation
|
76
|
+
"""
|
77
|
+
sequential_swaps = self.map(permutation, trials=trials)
|
78
|
+
|
79
|
+
parallel_swaps = [[swap] for swap in sequential_swaps]
|
80
|
+
return permutation_circuit(parallel_swaps)
|
81
|
+
|
82
|
+
def map(
|
83
|
+
self, mapping: Mapping[int, int], trials: int = 4, parallel_threshold: int = 50
|
84
|
+
) -> list[Swap[int]]:
|
85
|
+
"""Perform an approximately optimal Token Swapping algorithm to implement the permutation.
|
86
|
+
|
87
|
+
Supports partial mappings (i.e. not-permutations) for graphs with missing tokens.
|
88
|
+
|
89
|
+
Based on the paper: Approximation and Hardness for Token Swapping by Miltzow et al. (2016)
|
90
|
+
ArXiV: https://arxiv.org/abs/1602.05150
|
91
|
+
and generalization based on our own work.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
mapping: The partial mapping to implement in swaps.
|
95
|
+
trials: The number of trials to try to perform the mapping. Minimize over the trials.
|
96
|
+
parallel_threshold: The number of nodes in the graph beyond which the algorithm
|
97
|
+
will use parallel processing
|
98
|
+
|
99
|
+
Returns:
|
100
|
+
The swaps to implement the mapping
|
101
|
+
"""
|
102
|
+
# Since integer seed is used in rustworkx, take random integer from np.random.randint
|
103
|
+
# and use that for the seed.
|
104
|
+
seed = self.seed.integers(1, 10000)
|
105
|
+
return rx.graph_token_swapper(self.graph, mapping, trials, seed, parallel_threshold)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
# Copyright 2019 Andrew M. Childs, Eddie Schoute, Cem M. Unsal
|
14
|
+
#
|
15
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
16
|
+
# you may not use this file except in compliance with the License.
|
17
|
+
# You may obtain a copy of the License at
|
18
|
+
#
|
19
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
20
|
+
#
|
21
|
+
# Unless required by applicable law or agreed to in writing, software
|
22
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
23
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
24
|
+
# See the License for the specific language governing permissions and
|
25
|
+
# limitations under the License.
|
26
|
+
|
27
|
+
"""Type definitions used within the permutation package."""
|
28
|
+
|
29
|
+
from typing import TypeVar, Dict, Tuple, NamedTuple, Union
|
30
|
+
|
31
|
+
from qiskit.circuit import Qubit
|
32
|
+
from qiskit.dagcircuit import DAGCircuit
|
33
|
+
|
34
|
+
PermuteElement = TypeVar("PermuteElement")
|
35
|
+
Permutation = Dict[PermuteElement, PermuteElement]
|
36
|
+
Swap = Tuple[PermuteElement, PermuteElement]
|
37
|
+
|
38
|
+
# Represents a circuit for permuting to a mapping.
|
39
|
+
PermutationCircuit = NamedTuple(
|
40
|
+
"PermutationCircuit",
|
41
|
+
[
|
42
|
+
("circuit", DAGCircuit),
|
43
|
+
("inputmap", Dict[Union[int, Qubit], Qubit]),
|
44
|
+
# A mapping from architecture nodes to circuit registers.
|
45
|
+
],
|
46
|
+
)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
# Copyright 2019 Andrew M. Childs, Eddie Schoute, Cem M. Unsal
|
14
|
+
#
|
15
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
16
|
+
# you may not use this file except in compliance with the License.
|
17
|
+
# You may obtain a copy of the License at
|
18
|
+
#
|
19
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
20
|
+
#
|
21
|
+
# Unless required by applicable law or agreed to in writing, software
|
22
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
23
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
24
|
+
# See the License for the specific language governing permissions and
|
25
|
+
# limitations under the License.
|
26
|
+
|
27
|
+
"""Utility functions shared between permutation functionality."""
|
28
|
+
|
29
|
+
from __future__ import annotations
|
30
|
+
|
31
|
+
from collections.abc import Iterable
|
32
|
+
from typing import TypeVar, MutableMapping
|
33
|
+
|
34
|
+
from qiskit.circuit import QuantumRegister
|
35
|
+
from qiskit.dagcircuit import DAGCircuit
|
36
|
+
from qiskit.circuit.library.standard_gates import SwapGate
|
37
|
+
|
38
|
+
from .types import Swap, PermutationCircuit
|
39
|
+
|
40
|
+
_K = TypeVar("_K")
|
41
|
+
_V = TypeVar("_V")
|
42
|
+
|
43
|
+
|
44
|
+
def swap_permutation(
|
45
|
+
swaps: Iterable[Iterable[Swap[_K]]],
|
46
|
+
mapping: MutableMapping[_K, _V],
|
47
|
+
allow_missing_keys: bool = False,
|
48
|
+
) -> None:
|
49
|
+
"""Given a circuit of swaps, apply them to the permutation (in-place).
|
50
|
+
|
51
|
+
Args:
|
52
|
+
swaps: param mapping: A mapping of Keys to Values, where the Keys are being swapped.
|
53
|
+
mapping: The permutation to have swaps applied to.
|
54
|
+
allow_missing_keys: Whether to allow swaps of missing keys in mapping.
|
55
|
+
"""
|
56
|
+
for swap_step in swaps:
|
57
|
+
for sw1, sw2 in swap_step:
|
58
|
+
# Take into account non-existent keys.
|
59
|
+
val1: _V | None = None
|
60
|
+
val2: _V | None = None
|
61
|
+
if allow_missing_keys:
|
62
|
+
val1 = mapping.pop(sw1, None)
|
63
|
+
val2 = mapping.pop(sw2, None)
|
64
|
+
else:
|
65
|
+
# Asserts that both keys exist
|
66
|
+
val1, val2 = mapping.pop(sw1), mapping.pop(sw2)
|
67
|
+
|
68
|
+
if val1 is not None:
|
69
|
+
mapping[sw2] = val1
|
70
|
+
if val2 is not None:
|
71
|
+
mapping[sw1] = val2
|
72
|
+
|
73
|
+
|
74
|
+
def permutation_circuit(swaps: Iterable[list[Swap[_V]]]) -> PermutationCircuit:
|
75
|
+
"""Produce a circuit description of a list of swaps.
|
76
|
+
With a given permutation and permuter you can compute the swaps using the permuter function
|
77
|
+
then feed it into this circuit function to obtain a circuit description.
|
78
|
+
Args:
|
79
|
+
swaps: An iterable of swaps to perform.
|
80
|
+
Returns:
|
81
|
+
A MappingCircuit with the circuit and a mapping of node to qubit in the circuit.
|
82
|
+
"""
|
83
|
+
# Construct a circuit with each unique node id becoming a quantum register of size 1.
|
84
|
+
dag = DAGCircuit()
|
85
|
+
swap_list = list(swaps)
|
86
|
+
|
87
|
+
# Set of unique nodes used in the swaps.
|
88
|
+
nodes = {
|
89
|
+
swap_node for swap_step in swap_list for swap_nodes in swap_step for swap_node in swap_nodes
|
90
|
+
}
|
91
|
+
|
92
|
+
node_qargs = {node: QuantumRegister(1) for node in nodes}
|
93
|
+
for qubit in node_qargs.values():
|
94
|
+
dag.add_qreg(qubit)
|
95
|
+
|
96
|
+
inputmap = {node: q[0] for node, q in node_qargs.items()}
|
97
|
+
|
98
|
+
# Apply swaps to the circuit.
|
99
|
+
for swap_step in swap_list:
|
100
|
+
for swap0, swap1 in swap_step:
|
101
|
+
dag.apply_operation_back(SwapGate(), (inputmap[swap0], inputmap[swap1]), check=False)
|
102
|
+
|
103
|
+
return PermutationCircuit(dag, inputmap)
|
@@ -0,0 +1,166 @@
|
|
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
|
+
"""Map (with minimum effort) a DAGCircuit onto a ``coupling_map`` adding swap gates."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
17
|
+
from qiskit.dagcircuit import DAGCircuit
|
18
|
+
from qiskit.transpiler.layout import Layout
|
19
|
+
from qiskit.circuit.library.standard_gates import SwapGate
|
20
|
+
from qiskit.transpiler.target import Target
|
21
|
+
from qiskit.transpiler.passes.layout import disjoint_utils
|
22
|
+
|
23
|
+
|
24
|
+
class BasicSwap(TransformationPass):
|
25
|
+
"""Map (with minimum effort) a DAGCircuit onto a ``coupling_map`` adding swap gates.
|
26
|
+
|
27
|
+
The basic mapper is a minimum effort to insert swap gates to map the DAG onto
|
28
|
+
a coupling map. When a cx is not in the coupling map possibilities, it inserts
|
29
|
+
one or more swaps in front to make it compatible.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self, coupling_map, fake_run=False):
|
33
|
+
"""BasicSwap initializer.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
coupling_map (Union[CouplingMap, Target]): Directed graph represented a coupling map.
|
37
|
+
fake_run (bool): if true, it will only pretend to do routing, i.e., no
|
38
|
+
swap is effectively added.
|
39
|
+
"""
|
40
|
+
super().__init__()
|
41
|
+
if isinstance(coupling_map, Target):
|
42
|
+
self.target = coupling_map
|
43
|
+
self.coupling_map = self.target.build_coupling_map()
|
44
|
+
else:
|
45
|
+
self.target = None
|
46
|
+
self.coupling_map = coupling_map
|
47
|
+
self.fake_run = fake_run
|
48
|
+
|
49
|
+
def run(self, dag):
|
50
|
+
"""Run the BasicSwap pass on `dag`.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
dag (DAGCircuit): DAG to map.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
DAGCircuit: A mapped DAG.
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
TranspilerError: if the coupling map or the layout are not
|
60
|
+
compatible with the DAG, or if the ``coupling_map=None``.
|
61
|
+
"""
|
62
|
+
if self.fake_run:
|
63
|
+
return self._fake_run(dag)
|
64
|
+
|
65
|
+
new_dag = dag.copy_empty_like()
|
66
|
+
|
67
|
+
if self.coupling_map is None:
|
68
|
+
raise TranspilerError("BasicSwap cannot run with coupling_map=None")
|
69
|
+
|
70
|
+
if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
|
71
|
+
raise TranspilerError("Basic swap runs on physical circuits only")
|
72
|
+
|
73
|
+
if len(dag.qubits) > len(self.coupling_map.physical_qubits):
|
74
|
+
raise TranspilerError("The layout does not match the amount of qubits in the DAG")
|
75
|
+
disjoint_utils.require_layout_isolated_to_component(
|
76
|
+
dag, self.coupling_map if self.target is None else self.target
|
77
|
+
)
|
78
|
+
canonical_register = dag.qregs["q"]
|
79
|
+
trivial_layout = Layout.generate_trivial_layout(canonical_register)
|
80
|
+
current_layout = trivial_layout.copy()
|
81
|
+
|
82
|
+
for layer in dag.serial_layers():
|
83
|
+
subdag = layer["graph"]
|
84
|
+
|
85
|
+
for gate in subdag.two_qubit_ops():
|
86
|
+
physical_q0 = current_layout[gate.qargs[0]]
|
87
|
+
physical_q1 = current_layout[gate.qargs[1]]
|
88
|
+
if self.coupling_map.distance(physical_q0, physical_q1) != 1:
|
89
|
+
# Insert a new layer with the SWAP(s).
|
90
|
+
swap_layer = DAGCircuit()
|
91
|
+
swap_layer.add_qreg(canonical_register)
|
92
|
+
|
93
|
+
path = self.coupling_map.shortest_undirected_path(physical_q0, physical_q1)
|
94
|
+
for swap in range(len(path) - 2):
|
95
|
+
connected_wire_1 = path[swap]
|
96
|
+
connected_wire_2 = path[swap + 1]
|
97
|
+
|
98
|
+
qubit_1 = current_layout[connected_wire_1]
|
99
|
+
qubit_2 = current_layout[connected_wire_2]
|
100
|
+
|
101
|
+
# create the swap operation
|
102
|
+
swap_layer.apply_operation_back(
|
103
|
+
SwapGate(), (qubit_1, qubit_2), cargs=(), check=False
|
104
|
+
)
|
105
|
+
|
106
|
+
# layer insertion
|
107
|
+
order = current_layout.reorder_bits(new_dag.qubits)
|
108
|
+
new_dag.compose(swap_layer, qubits=order)
|
109
|
+
|
110
|
+
# update current_layout
|
111
|
+
for swap in range(len(path) - 2):
|
112
|
+
current_layout.swap(path[swap], path[swap + 1])
|
113
|
+
|
114
|
+
order = current_layout.reorder_bits(new_dag.qubits)
|
115
|
+
new_dag.compose(subdag, qubits=order)
|
116
|
+
|
117
|
+
if self.property_set["final_layout"] is None:
|
118
|
+
self.property_set["final_layout"] = current_layout
|
119
|
+
else:
|
120
|
+
self.property_set["final_layout"] = current_layout.compose(
|
121
|
+
self.property_set["final_layout"], dag.qubits
|
122
|
+
)
|
123
|
+
|
124
|
+
return new_dag
|
125
|
+
|
126
|
+
def _fake_run(self, dag):
|
127
|
+
"""Do a fake run the BasicSwap pass on `dag`.
|
128
|
+
|
129
|
+
Args:
|
130
|
+
dag (DAGCircuit): DAG to improve initial layout.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
DAGCircuit: The same DAG.
|
134
|
+
|
135
|
+
Raises:
|
136
|
+
TranspilerError: if the coupling map or the layout are not
|
137
|
+
compatible with the DAG.
|
138
|
+
"""
|
139
|
+
if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
|
140
|
+
raise TranspilerError("Basic swap runs on physical circuits only")
|
141
|
+
|
142
|
+
if len(dag.qubits) > len(self.coupling_map.physical_qubits):
|
143
|
+
raise TranspilerError("The layout does not match the amount of qubits in the DAG")
|
144
|
+
|
145
|
+
canonical_register = dag.qregs["q"]
|
146
|
+
trivial_layout = Layout.generate_trivial_layout(canonical_register)
|
147
|
+
current_layout = trivial_layout.copy()
|
148
|
+
|
149
|
+
for layer in dag.serial_layers():
|
150
|
+
subdag = layer["graph"]
|
151
|
+
for gate in subdag.two_qubit_ops():
|
152
|
+
physical_q0 = current_layout[gate.qargs[0]]
|
153
|
+
physical_q1 = current_layout[gate.qargs[1]]
|
154
|
+
if self.coupling_map.distance(physical_q0, physical_q1) != 1:
|
155
|
+
path = self.coupling_map.shortest_undirected_path(physical_q0, physical_q1)
|
156
|
+
# update current_layout
|
157
|
+
for swap in range(len(path) - 2):
|
158
|
+
current_layout.swap(path[swap], path[swap + 1])
|
159
|
+
|
160
|
+
if self.property_set["final_layout"] is None:
|
161
|
+
self.property_set["final_layout"] = current_layout
|
162
|
+
else:
|
163
|
+
self.property_set["final_layout"] = current_layout.compose(
|
164
|
+
self.property_set["final_layout"], dag.qubits
|
165
|
+
)
|
166
|
+
return dag
|
@@ -0,0 +1,25 @@
|
|
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
|
+
"""Module containing swap strategies for blocks of commuting gates.
|
14
|
+
|
15
|
+
Swap routing is, in general, a hard problem. However, this problem is much simpler if
|
16
|
+
the gates commute. Many variational algorithms such as QAOA are built with blocks of
|
17
|
+
commuting gates. Transpiling such circuits with a general purpose SWAP router typically
|
18
|
+
yields sub optimal results or is costly to run. This module introduces a framework to
|
19
|
+
transpile blocks of commuting gates by applying layers of a predefined swap strategy.
|
20
|
+
Further details can also be found here: https://arxiv.org/abs/2202.03459.
|
21
|
+
"""
|
22
|
+
|
23
|
+
from .swap_strategy import SwapStrategy
|
24
|
+
from .pauli_2q_evolution_commutation import FindCommutingPauliEvolutions
|
25
|
+
from .commuting_2q_gate_router import Commuting2qGateRouter
|