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,465 @@
|
|
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
|
+
"""Routing via SWAP insertion using the SABRE method from Li et al."""
|
14
|
+
|
15
|
+
import logging
|
16
|
+
from copy import deepcopy
|
17
|
+
import time
|
18
|
+
|
19
|
+
import rustworkx
|
20
|
+
|
21
|
+
from qiskit.circuit import SwitchCaseOp, Clbit, ClassicalRegister
|
22
|
+
from qiskit.circuit.library.standard_gates import SwapGate
|
23
|
+
from qiskit.circuit.controlflow import node_resources
|
24
|
+
from qiskit.converters import dag_to_circuit
|
25
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
26
|
+
from qiskit.transpiler.coupling import CouplingMap
|
27
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
28
|
+
from qiskit.transpiler.layout import Layout
|
29
|
+
from qiskit.transpiler.target import Target
|
30
|
+
from qiskit.transpiler.passes.layout import disjoint_utils
|
31
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
32
|
+
from qiskit.utils import default_num_processes
|
33
|
+
|
34
|
+
from qiskit._accelerate.sabre import sabre_routing, Heuristic, SetScaling, NeighborTable, SabreDAG
|
35
|
+
from qiskit._accelerate.nlayout import NLayout
|
36
|
+
|
37
|
+
logger = logging.getLogger(__name__)
|
38
|
+
|
39
|
+
|
40
|
+
class SabreSwap(TransformationPass):
|
41
|
+
r"""Map input circuit onto a backend topology via insertion of SWAPs.
|
42
|
+
|
43
|
+
Implementation of the SWAP-based heuristic search from the SABRE qubit
|
44
|
+
mapping paper [2] (Algorithm 1) with the modifications from the LightSABRE
|
45
|
+
paper [1]. The heuristic aims to minimize the number of lossy SWAPs inserted
|
46
|
+
and the depth of the circuit.
|
47
|
+
|
48
|
+
This algorithm starts from an initial layout of virtual qubits onto physical
|
49
|
+
qubits, and iterates over the circuit DAG until all gates are exhausted,
|
50
|
+
inserting SWAPs along the way. It only considers 2-qubit gates as only those
|
51
|
+
are germane for the mapping problem (it is assumed that 3+ qubit gates are
|
52
|
+
already decomposed).
|
53
|
+
|
54
|
+
In each iteration, it will first check if there are any gates in the
|
55
|
+
``front_layer`` that can be directly applied. If so, it will apply them and
|
56
|
+
remove them from ``front_layer``, and replenish that layer with new gates
|
57
|
+
if possible. Otherwise, it will try to search for SWAPs, insert the SWAPs,
|
58
|
+
and update the mapping.
|
59
|
+
|
60
|
+
The search for SWAPs is restricted, in the sense that we only consider
|
61
|
+
physical qubits in the neighborhood of those qubits involved in
|
62
|
+
``front_layer``. These give rise to a ``swap_candidate_list`` which is
|
63
|
+
scored according to some heuristic cost function. The best SWAP is
|
64
|
+
implemented and ``current_layout`` updated.
|
65
|
+
|
66
|
+
This transpiler pass adds onto the SABRE algorithm in that it will run
|
67
|
+
multiple trials of the algorithm with different seeds. The best output,
|
68
|
+
determined by the trial with the least amount of SWAPed inserted, will
|
69
|
+
be selected from the random trials.
|
70
|
+
|
71
|
+
**References:**
|
72
|
+
|
73
|
+
[1] Henry Zou and Matthew Treinish and Kevin Hartman and Alexander Ivrii and Jake Lishman.
|
74
|
+
"LightSABRE: A Lightweight and Enhanced SABRE Algorithm"
|
75
|
+
`arXiv:2409.08368 <https://doi.org/10.48550/arXiv.2409.08368>`__
|
76
|
+
[2] Li, Gushu, Yufei Ding, and Yuan Xie. "Tackling the qubit mapping problem
|
77
|
+
for NISQ-era quantum devices." ASPLOS 2019.
|
78
|
+
`arXiv:1809.02573 <https://arxiv.org/pdf/1809.02573.pdf>`_
|
79
|
+
"""
|
80
|
+
|
81
|
+
def __init__(self, coupling_map, heuristic="basic", seed=None, fake_run=False, trials=None):
|
82
|
+
r"""SabreSwap initializer.
|
83
|
+
|
84
|
+
Args:
|
85
|
+
coupling_map (Union[CouplingMap, Target]): CouplingMap of the target backend.
|
86
|
+
heuristic (str): The type of heuristic to use when deciding best
|
87
|
+
swap strategy ('basic' or 'lookahead' or 'decay').
|
88
|
+
seed (int): random seed used to tie-break among candidate swaps.
|
89
|
+
fake_run (bool): if true, it only pretend to do routing, i.e., no
|
90
|
+
swap is effectively added.
|
91
|
+
trials (int): The number of seed trials to run sabre with. These will
|
92
|
+
be run in parallel (unless the PassManager is already running in
|
93
|
+
parallel). If not specified this defaults to the number of physical
|
94
|
+
CPUs on the local system. For reproducible results it is recommended
|
95
|
+
that you set this explicitly, as the output will be deterministic for
|
96
|
+
a fixed number of trials.
|
97
|
+
|
98
|
+
Raises:
|
99
|
+
TranspilerError: If the specified heuristic is not valid.
|
100
|
+
|
101
|
+
Additional Information:
|
102
|
+
|
103
|
+
The search space of possible SWAPs on physical qubits is explored
|
104
|
+
by assigning a score to the layout that would result from each SWAP.
|
105
|
+
The goodness of a layout is evaluated based on how viable it makes
|
106
|
+
the remaining virtual gates that must be applied. A few heuristic
|
107
|
+
cost functions are supported
|
108
|
+
|
109
|
+
- 'basic':
|
110
|
+
|
111
|
+
The sum of distances for corresponding physical qubits of
|
112
|
+
interacting virtual qubits in the front_layer.
|
113
|
+
|
114
|
+
.. math::
|
115
|
+
|
116
|
+
H_{basic} = \sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)]
|
117
|
+
|
118
|
+
- 'lookahead':
|
119
|
+
|
120
|
+
This is the sum of two costs: first is the same as the basic cost.
|
121
|
+
Second is the basic cost but now evaluated for the
|
122
|
+
extended set as well (i.e. :math:`|E|` number of upcoming successors to gates in
|
123
|
+
front_layer F). This is weighted by some amount EXTENDED_SET_WEIGHT (W) to
|
124
|
+
signify that upcoming gates are less important that the front_layer.
|
125
|
+
|
126
|
+
.. math::
|
127
|
+
|
128
|
+
H_{decay}=\frac{1}{\left|{F}\right|}\sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)]
|
129
|
+
+ W*\frac{1}{\left|{E}\right|} \sum_{gate \in E} D[\pi(gate.q_1)][\pi(gate.q2)]
|
130
|
+
|
131
|
+
- 'decay':
|
132
|
+
|
133
|
+
This is the same as 'lookahead', but the whole cost is multiplied by a
|
134
|
+
decay factor. This increases the cost if the SWAP that generated the
|
135
|
+
trial layout was recently used (i.e. it penalizes increase in depth).
|
136
|
+
|
137
|
+
.. math::
|
138
|
+
|
139
|
+
H_{decay} = max(decay(SWAP.q_1), decay(SWAP.q_2)) {
|
140
|
+
\frac{1}{\left|{F}\right|} \sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)]\\
|
141
|
+
+ W *\frac{1}{\left|{E}\right|} \sum_{gate \in E} D[\pi(gate.q_1)][\pi(gate.q2)]
|
142
|
+
}
|
143
|
+
"""
|
144
|
+
|
145
|
+
super().__init__()
|
146
|
+
|
147
|
+
# Assume bidirectional couplings, fixing gate direction is easy later.
|
148
|
+
if isinstance(coupling_map, Target):
|
149
|
+
self.target = coupling_map
|
150
|
+
self.coupling_map = self.target.build_coupling_map()
|
151
|
+
else:
|
152
|
+
self.coupling_map = coupling_map
|
153
|
+
self.target = None
|
154
|
+
if self.coupling_map is not None and not self.coupling_map.is_symmetric:
|
155
|
+
# A deepcopy is needed here if we don't own the coupling map (i.e. we were given it,
|
156
|
+
# rather than calculated it from the Target), to avoid modifications updating shared
|
157
|
+
# references in passes which require directional constraints.
|
158
|
+
if isinstance(coupling_map, CouplingMap):
|
159
|
+
self.coupling_map = deepcopy(self.coupling_map)
|
160
|
+
self.coupling_map.make_symmetric()
|
161
|
+
self._neighbor_table = None
|
162
|
+
if self.coupling_map is not None:
|
163
|
+
self._neighbor_table = NeighborTable(
|
164
|
+
rustworkx.adjacency_matrix(self.coupling_map.graph)
|
165
|
+
)
|
166
|
+
|
167
|
+
self.heuristic = heuristic
|
168
|
+
self.seed = seed
|
169
|
+
if trials is None:
|
170
|
+
self.trials = default_num_processes()
|
171
|
+
else:
|
172
|
+
self.trials = trials
|
173
|
+
|
174
|
+
self.fake_run = fake_run
|
175
|
+
self._qubit_indices = None
|
176
|
+
self._clbit_indices = None
|
177
|
+
self.dist_matrix = None
|
178
|
+
|
179
|
+
def run(self, dag):
|
180
|
+
"""Run the SabreSwap pass on `dag`.
|
181
|
+
|
182
|
+
Args:
|
183
|
+
dag (DAGCircuit): the directed acyclic graph to be mapped.
|
184
|
+
Returns:
|
185
|
+
DAGCircuit: A dag mapped to be compatible with the coupling_map.
|
186
|
+
Raises:
|
187
|
+
TranspilerError: if the coupling map or the layout are not
|
188
|
+
compatible with the DAG, or if the coupling_map=None
|
189
|
+
"""
|
190
|
+
|
191
|
+
if self.coupling_map is None:
|
192
|
+
raise TranspilerError("SabreSwap cannot run with coupling_map=None")
|
193
|
+
|
194
|
+
if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
|
195
|
+
raise TranspilerError("Sabre swap runs on physical circuits only.")
|
196
|
+
|
197
|
+
num_dag_qubits = len(dag.qubits)
|
198
|
+
num_coupling_qubits = self.coupling_map.size()
|
199
|
+
if num_dag_qubits < num_coupling_qubits:
|
200
|
+
raise TranspilerError(
|
201
|
+
f"Fewer qubits in the circuit ({num_dag_qubits}) than the coupling map"
|
202
|
+
f" ({num_coupling_qubits})."
|
203
|
+
" Have you run a layout pass and then expanded your DAG with ancillas?"
|
204
|
+
" See `FullAncillaAllocation`, `EnlargeWithAncilla` and `ApplyLayout`."
|
205
|
+
)
|
206
|
+
if num_dag_qubits > num_coupling_qubits:
|
207
|
+
raise TranspilerError(
|
208
|
+
f"More qubits in the circuit ({num_dag_qubits}) than available in the coupling map"
|
209
|
+
f" ({num_coupling_qubits})."
|
210
|
+
" This circuit cannot be routed to this device."
|
211
|
+
)
|
212
|
+
|
213
|
+
# In our defaults, the basic heuristic shouldn't scale by size; if it does, it's liable to
|
214
|
+
# get the algorithm stuck. See https://github.com/Qiskit/qiskit/pull/14458 for more.
|
215
|
+
if isinstance(self.heuristic, Heuristic):
|
216
|
+
heuristic = self.heuristic
|
217
|
+
elif self.heuristic == "basic":
|
218
|
+
heuristic = Heuristic(attempt_limit=10 * num_dag_qubits).with_basic(
|
219
|
+
1.0, SetScaling.Size
|
220
|
+
)
|
221
|
+
elif self.heuristic == "lookahead":
|
222
|
+
heuristic = (
|
223
|
+
Heuristic(attempt_limit=10 * num_dag_qubits)
|
224
|
+
.with_basic(1.0, SetScaling.Constant)
|
225
|
+
.with_lookahead(0.5, 20, SetScaling.Size)
|
226
|
+
)
|
227
|
+
elif self.heuristic == "decay":
|
228
|
+
heuristic = (
|
229
|
+
Heuristic(attempt_limit=10 * num_dag_qubits)
|
230
|
+
.with_basic(1.0, SetScaling.Constant)
|
231
|
+
.with_lookahead(0.5, 20, SetScaling.Size)
|
232
|
+
.with_decay(0.001, 5)
|
233
|
+
)
|
234
|
+
else:
|
235
|
+
raise TranspilerError(f"Heuristic {self.heuristic} not recognized.")
|
236
|
+
disjoint_utils.require_layout_isolated_to_component(
|
237
|
+
dag, self.coupling_map if self.target is None else self.target
|
238
|
+
)
|
239
|
+
|
240
|
+
self.dist_matrix = self.coupling_map.distance_matrix
|
241
|
+
|
242
|
+
canonical_register = dag.qregs["q"]
|
243
|
+
current_layout = Layout.generate_trivial_layout(canonical_register)
|
244
|
+
self._qubit_indices = {bit: idx for idx, bit in enumerate(canonical_register)}
|
245
|
+
layout_mapping = {
|
246
|
+
self._qubit_indices[k]: v for k, v in current_layout.get_virtual_bits().items()
|
247
|
+
}
|
248
|
+
initial_layout = NLayout(layout_mapping, len(dag.qubits), self.coupling_map.size())
|
249
|
+
|
250
|
+
sabre_dag, circuit_to_dag_dict = _build_sabre_dag(
|
251
|
+
dag,
|
252
|
+
self.coupling_map.size(),
|
253
|
+
self._qubit_indices,
|
254
|
+
)
|
255
|
+
sabre_start = time.perf_counter()
|
256
|
+
*sabre_result, final_permutation = sabre_routing(
|
257
|
+
sabre_dag,
|
258
|
+
self._neighbor_table,
|
259
|
+
self.dist_matrix,
|
260
|
+
heuristic,
|
261
|
+
initial_layout,
|
262
|
+
self.trials,
|
263
|
+
self.seed,
|
264
|
+
)
|
265
|
+
sabre_stop = time.perf_counter()
|
266
|
+
logging.debug("Sabre swap algorithm execution complete in: %s", sabre_stop - sabre_start)
|
267
|
+
final_layout = Layout(dict(zip(dag.qubits, final_permutation)))
|
268
|
+
if self.property_set["final_layout"] is None:
|
269
|
+
self.property_set["final_layout"] = final_layout
|
270
|
+
else:
|
271
|
+
self.property_set["final_layout"] = final_layout.compose(
|
272
|
+
self.property_set["final_layout"], dag.qubits
|
273
|
+
)
|
274
|
+
if self.fake_run:
|
275
|
+
return dag
|
276
|
+
return _apply_sabre_result(
|
277
|
+
dag.copy_empty_like(),
|
278
|
+
dag,
|
279
|
+
sabre_result,
|
280
|
+
initial_layout,
|
281
|
+
dag.qubits,
|
282
|
+
circuit_to_dag_dict,
|
283
|
+
)
|
284
|
+
|
285
|
+
|
286
|
+
def _build_sabre_dag(dag, num_physical_qubits, qubit_indices):
|
287
|
+
from qiskit.converters import circuit_to_dag
|
288
|
+
|
289
|
+
# Maps id(block): circuit_to_dag(block) for all descendant blocks
|
290
|
+
circuit_to_dag_dict = {}
|
291
|
+
|
292
|
+
def recurse(block, block_qubit_indices):
|
293
|
+
block_id = id(block)
|
294
|
+
if block_id in circuit_to_dag_dict:
|
295
|
+
block_dag = circuit_to_dag_dict[block_id]
|
296
|
+
else:
|
297
|
+
block_dag = circuit_to_dag(block)
|
298
|
+
circuit_to_dag_dict[block_id] = block_dag
|
299
|
+
return process_dag(block_dag, block_qubit_indices)
|
300
|
+
|
301
|
+
def process_dag(block_dag, wire_map):
|
302
|
+
dag_list = []
|
303
|
+
node_blocks = {}
|
304
|
+
for node in block_dag.topological_op_nodes():
|
305
|
+
cargs_bits = set(node.cargs)
|
306
|
+
if node.is_control_flow() and isinstance(node.op, SwitchCaseOp):
|
307
|
+
target = node.op.target
|
308
|
+
if isinstance(target, Clbit):
|
309
|
+
cargs_bits.add(target)
|
310
|
+
elif isinstance(target, ClassicalRegister):
|
311
|
+
cargs_bits.update(target)
|
312
|
+
else: # Expr
|
313
|
+
cargs_bits.update(node_resources(target).clbits)
|
314
|
+
cargs = {block_dag.find_bit(x).index for x in cargs_bits}
|
315
|
+
if node.is_control_flow():
|
316
|
+
node_blocks[node._node_id] = [
|
317
|
+
recurse(
|
318
|
+
block,
|
319
|
+
{inner: wire_map[outer] for inner, outer in zip(block.qubits, node.qargs)},
|
320
|
+
)
|
321
|
+
for block in node.op.blocks
|
322
|
+
]
|
323
|
+
dag_list.append(
|
324
|
+
(
|
325
|
+
node._node_id,
|
326
|
+
[wire_map[x] for x in node.qargs],
|
327
|
+
cargs,
|
328
|
+
node.is_directive(),
|
329
|
+
)
|
330
|
+
)
|
331
|
+
return SabreDAG(num_physical_qubits, block_dag.num_clbits(), dag_list, node_blocks)
|
332
|
+
|
333
|
+
return process_dag(dag, qubit_indices), circuit_to_dag_dict
|
334
|
+
|
335
|
+
|
336
|
+
def _apply_sabre_result(
|
337
|
+
out_dag,
|
338
|
+
in_dag,
|
339
|
+
sabre_result,
|
340
|
+
initial_layout,
|
341
|
+
physical_qubits,
|
342
|
+
circuit_to_dag_dict,
|
343
|
+
):
|
344
|
+
"""Apply the ``SabreResult`` to ``out_dag``, mutating it in place. This function in effect
|
345
|
+
performs the :class:`.ApplyLayout` transpiler pass with ``initial_layout`` and the Sabre routing
|
346
|
+
simultaneously, though it assumes that ``out_dag`` has already been prepared as containing the
|
347
|
+
right physical qubits.
|
348
|
+
|
349
|
+
Mutates ``out_dag`` in place and returns it. Mutates ``initial_layout`` in place as scratch
|
350
|
+
space.
|
351
|
+
|
352
|
+
Args:
|
353
|
+
out_dag (DAGCircuit): the physical DAG that the output should be written to.
|
354
|
+
in_dag (DAGCircuit): the source of the nodes that are being routed.
|
355
|
+
sabre_result (tuple[SwapMap, Sequence[int], NodeBlockResults]): the result object from the
|
356
|
+
Rust run of the Sabre routing algorithm.
|
357
|
+
initial_layout (NLayout): a Rust-space mapping of virtual indices (i.e. those of the qubits
|
358
|
+
in ``in_dag``) to physical ones.
|
359
|
+
physical_qubits (list[Qubit]): an indexable sequence of :class:`.circuit.Qubit` objects
|
360
|
+
representing the physical qubits of the circuit. Note that disjoint-coupling
|
361
|
+
handling can mean that these are not strictly a "canonical physical register" in order.
|
362
|
+
circuit_to_dag_dict (Mapping[int, DAGCircuit]): a mapping of the Python object identity
|
363
|
+
(as returned by :func:`id`) of a control-flow block :class:`.QuantumCircuit` to a
|
364
|
+
:class:`.DAGCircuit` that represents the same thing.
|
365
|
+
"""
|
366
|
+
|
367
|
+
# The swap gate is a singleton instance, so we don't need to waste time reconstructing it each
|
368
|
+
# time we need to use it.
|
369
|
+
swap_singleton = SwapGate()
|
370
|
+
|
371
|
+
def empty_dag(block):
|
372
|
+
empty = DAGCircuit()
|
373
|
+
empty.add_qubits(out_dag.qubits)
|
374
|
+
for qreg in out_dag.qregs.values():
|
375
|
+
empty.add_qreg(qreg)
|
376
|
+
empty.add_clbits(block.clbits)
|
377
|
+
for creg in block.cregs:
|
378
|
+
empty.add_creg(creg)
|
379
|
+
for var_ in block.iter_declared_vars():
|
380
|
+
empty.add_declared_var(var_)
|
381
|
+
for var_ in block.iter_captured_vars():
|
382
|
+
empty.add_captured_var(var_)
|
383
|
+
for stretch in block.iter_declared_stretches():
|
384
|
+
empty.add_declared_stretch(stretch)
|
385
|
+
for stretch in block.iter_captured_stretches():
|
386
|
+
empty.add_captured_stretch(stretch)
|
387
|
+
empty.global_phase = block.global_phase
|
388
|
+
return empty
|
389
|
+
|
390
|
+
def apply_swaps(dest_dag, swaps, layout):
|
391
|
+
for a, b in swaps:
|
392
|
+
qubits = (physical_qubits[a], physical_qubits[b])
|
393
|
+
layout.swap_physical(a, b)
|
394
|
+
dest_dag.apply_operation_back(swap_singleton, qubits, (), check=False)
|
395
|
+
|
396
|
+
def recurse(dest_dag, source_dag, result, root_logical_map, layout):
|
397
|
+
"""The main recursive worker. Mutates ``dest_dag`` and ``layout`` and returns them.
|
398
|
+
|
399
|
+
``root_virtual_map`` is a mapping of the (virtual) qubit in ``source_dag`` to the index of
|
400
|
+
the virtual qubit in the root source DAG that it is bound to."""
|
401
|
+
swap_map, node_order, node_block_results = result
|
402
|
+
for node_id in node_order:
|
403
|
+
node = source_dag.node(node_id)
|
404
|
+
if node_id in swap_map:
|
405
|
+
apply_swaps(dest_dag, swap_map[node_id], layout)
|
406
|
+
if not node.is_control_flow():
|
407
|
+
qubits = [
|
408
|
+
physical_qubits[layout.virtual_to_physical(root_logical_map[q])]
|
409
|
+
for q in node.qargs
|
410
|
+
]
|
411
|
+
dest_dag._apply_op_node_back(
|
412
|
+
DAGOpNode.from_instruction(
|
413
|
+
node._to_circuit_instruction().replace(qubits=qubits)
|
414
|
+
),
|
415
|
+
check=False,
|
416
|
+
)
|
417
|
+
continue
|
418
|
+
|
419
|
+
# At this point, we have to handle a control-flow node.
|
420
|
+
block_results = node_block_results[node_id]
|
421
|
+
mapped_block_dags = []
|
422
|
+
idle_qubits = set(dest_dag.qubits)
|
423
|
+
for block, block_result in zip(node.op.blocks, block_results):
|
424
|
+
block_root_logical_map = {
|
425
|
+
inner: root_logical_map[outer] for inner, outer in zip(block.qubits, node.qargs)
|
426
|
+
}
|
427
|
+
# The virtual qubits originally incident to the block should be retained even if not
|
428
|
+
# actually used; the user might be marking them out specially (like in `box`).
|
429
|
+
# There are other transpiler passes to remove those dependencies if desired.
|
430
|
+
incident_qubits = {
|
431
|
+
layout.virtual_to_physical(block_root_logical_map[bit]) for bit in block.qubits
|
432
|
+
}
|
433
|
+
block_dag, block_layout = recurse(
|
434
|
+
empty_dag(block),
|
435
|
+
circuit_to_dag_dict[id(block)],
|
436
|
+
(
|
437
|
+
block_result.result.map,
|
438
|
+
block_result.result.node_order,
|
439
|
+
block_result.result.node_block_results,
|
440
|
+
),
|
441
|
+
block_root_logical_map,
|
442
|
+
layout.copy(),
|
443
|
+
)
|
444
|
+
apply_swaps(block_dag, block_result.swap_epilogue, block_layout)
|
445
|
+
mapped_block_dags.append(block_dag)
|
446
|
+
idle_qubits.intersection_update(
|
447
|
+
bit
|
448
|
+
for bit in block_dag.idle_wires()
|
449
|
+
if block_dag.find_bit(bit).index not in incident_qubits
|
450
|
+
)
|
451
|
+
|
452
|
+
mapped_blocks = []
|
453
|
+
for mapped_block_dag in mapped_block_dags:
|
454
|
+
# Remove wires that are idle in all blocks.
|
455
|
+
mapped_block_dag.remove_qubits(*idle_qubits)
|
456
|
+
mapped_blocks.append(dag_to_circuit(mapped_block_dag))
|
457
|
+
|
458
|
+
# Apply the control flow gate to the dag.
|
459
|
+
mapped_node = node.op.replace_blocks(mapped_blocks)
|
460
|
+
mapped_node_qargs = mapped_blocks[0].qubits if mapped_blocks else ()
|
461
|
+
dest_dag.apply_operation_back(mapped_node, mapped_node_qargs, node.cargs, check=False)
|
462
|
+
return dest_dag, layout
|
463
|
+
|
464
|
+
root_logical_map = {bit: index for index, bit in enumerate(in_dag.qubits)}
|
465
|
+
return recurse(out_dag, in_dag, sabre_result, root_logical_map, initial_layout)[0]
|