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,61 @@
|
|
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
|
+
"""Internal utilities for working with control-flow operations."""
|
14
|
+
|
15
|
+
import functools
|
16
|
+
from typing import Callable
|
17
|
+
|
18
|
+
from qiskit.circuit import ControlFlowOp
|
19
|
+
from qiskit.converters import circuit_to_dag, dag_to_circuit
|
20
|
+
from qiskit.dagcircuit import DAGCircuit
|
21
|
+
|
22
|
+
|
23
|
+
def map_blocks(dag_mapping: Callable[[DAGCircuit], DAGCircuit], op: ControlFlowOp) -> ControlFlowOp:
|
24
|
+
"""Use the ``dag_mapping`` function to replace the blocks of a :class:`.ControlFlowOp` with new
|
25
|
+
ones. Each block will be automatically converted to a :class:`.DAGCircuit` and then returned
|
26
|
+
to a :class:`.QuantumCircuit`."""
|
27
|
+
return op.replace_blocks(
|
28
|
+
[
|
29
|
+
dag_to_circuit(dag_mapping(circuit_to_dag(block)), copy_operations=False)
|
30
|
+
for block in op.blocks
|
31
|
+
]
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
def trivial_recurse(method):
|
36
|
+
"""Decorator that causes :class:`.BasePass.run` to iterate over all control-flow nodes,
|
37
|
+
replacing their operations with a new :class:`.ControlFlowOp` whose blocks have all had
|
38
|
+
:class`.BasePass.run` called on them.
|
39
|
+
|
40
|
+
This is only suitable for simple run calls that store no state between calls, do not need
|
41
|
+
circuit-specific information feeding into them (such as via a :class:`.PropertySet`), and will
|
42
|
+
safely do nothing to control-flow operations that are in the DAG.
|
43
|
+
|
44
|
+
If slightly finer control is needed on when the control-flow operations are modified, one can
|
45
|
+
use :func:`map_blocks` as::
|
46
|
+
|
47
|
+
if isinstance(node.op, ControlFlowOp):
|
48
|
+
dag.substitute_node(node, map_blocks(self.run, node.op))
|
49
|
+
|
50
|
+
from with :meth:`.BasePass.run`."""
|
51
|
+
|
52
|
+
@functools.wraps(method)
|
53
|
+
def out(self, dag):
|
54
|
+
def bound_wrapped_method(dag):
|
55
|
+
return out(self, dag)
|
56
|
+
|
57
|
+
for node in dag.control_flow_op_nodes():
|
58
|
+
dag.substitute_node(node, map_blocks(bound_wrapped_method, node.op))
|
59
|
+
return method(self, dag)
|
60
|
+
|
61
|
+
return out
|
@@ -0,0 +1,36 @@
|
|
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
|
+
"""Check if the DAG has reached a fixed point."""
|
14
|
+
|
15
|
+
from copy import deepcopy
|
16
|
+
|
17
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
18
|
+
|
19
|
+
|
20
|
+
class DAGFixedPoint(AnalysisPass):
|
21
|
+
"""Check if the DAG has reached a fixed point.
|
22
|
+
|
23
|
+
A dummy analysis pass that checks if the DAG a fixed point (the DAG is not
|
24
|
+
modified anymore). The result is saved in
|
25
|
+
``property_set['dag_fixed_point']`` as a boolean.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def run(self, dag):
|
29
|
+
"""Run the DAGFixedPoint pass on `dag`."""
|
30
|
+
if self.property_set["_dag_fixed_point_previous_dag"] is None:
|
31
|
+
self.property_set["dag_fixed_point"] = False
|
32
|
+
else:
|
33
|
+
fixed_point_reached = self.property_set["_dag_fixed_point_previous_dag"] == dag
|
34
|
+
self.property_set["dag_fixed_point"] = fixed_point_reached
|
35
|
+
|
36
|
+
self.property_set["_dag_fixed_point_previous_dag"] = deepcopy(dag)
|
@@ -0,0 +1,69 @@
|
|
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
|
+
"""Error pass to be called when an error happens."""
|
14
|
+
|
15
|
+
import logging
|
16
|
+
import string
|
17
|
+
import warnings
|
18
|
+
|
19
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
20
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
21
|
+
|
22
|
+
|
23
|
+
class Error(AnalysisPass):
|
24
|
+
"""Error pass to be called when an error happens."""
|
25
|
+
|
26
|
+
def __init__(self, msg=None, action="raise"):
|
27
|
+
"""Error pass.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
msg (str | Callable[[PropertySet], str]): Error message, if not provided a generic error
|
31
|
+
will be used. This can be either a raw string, or a callback function that accepts
|
32
|
+
the current ``property_set`` and returns the desired message.
|
33
|
+
action (str): the action to perform. Default: 'raise'. The options are:
|
34
|
+
* ``'raise'``: Raises a ``TranspilerError`` exception with msg
|
35
|
+
* ``'warn'``: Raises a non-fatal warning with msg
|
36
|
+
* ``'log'``: logs in ``logging.getLogger(__name__)``
|
37
|
+
|
38
|
+
Raises:
|
39
|
+
TranspilerError: if action is not valid.
|
40
|
+
"""
|
41
|
+
super().__init__()
|
42
|
+
self.msg = msg
|
43
|
+
if action in ["raise", "warn", "log"]:
|
44
|
+
self.action = action
|
45
|
+
else:
|
46
|
+
raise TranspilerError(f"Unknown action: {action}")
|
47
|
+
|
48
|
+
def run(self, _):
|
49
|
+
"""Run the Error pass on `dag`."""
|
50
|
+
if self.msg is None:
|
51
|
+
msg = "An error occurred while the pass manager was running."
|
52
|
+
elif isinstance(self.msg, str):
|
53
|
+
prop_names = [
|
54
|
+
tup[1] for tup in string.Formatter().parse(self.msg) if tup[1] is not None
|
55
|
+
]
|
56
|
+
properties = {prop_name: self.property_set[prop_name] for prop_name in prop_names}
|
57
|
+
msg = self.msg.format(**properties)
|
58
|
+
else:
|
59
|
+
msg = self.msg(self.property_set)
|
60
|
+
|
61
|
+
if self.action == "raise":
|
62
|
+
raise TranspilerError(msg)
|
63
|
+
if self.action == "warn":
|
64
|
+
warnings.warn(msg, Warning)
|
65
|
+
elif self.action == "log":
|
66
|
+
logger = logging.getLogger(__name__)
|
67
|
+
logger.info(msg)
|
68
|
+
else:
|
69
|
+
raise TranspilerError(f"Unknown action: {self.action}")
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
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
|
+
"""Filter ops from a circuit"""
|
14
|
+
|
15
|
+
from typing import Callable
|
16
|
+
|
17
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
18
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
19
|
+
from qiskit.transpiler.passes.utils import control_flow
|
20
|
+
|
21
|
+
from qiskit._accelerate.filter_op_nodes import filter_op_nodes
|
22
|
+
|
23
|
+
|
24
|
+
class FilterOpNodes(TransformationPass):
|
25
|
+
"""Remove all operations that match a filter function
|
26
|
+
|
27
|
+
This transformation pass is used to remove any operations that matches a
|
28
|
+
the provided filter function.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
predicate: A given callable that will be passed the :class:`.DAGOpNode`
|
32
|
+
for each node in the :class:`.DAGCircuit`. If the callable returns
|
33
|
+
``True`` the :class:`.DAGOpNode` is retained in the circuit and if it
|
34
|
+
returns ``False`` it is removed from the circuit.
|
35
|
+
|
36
|
+
Example:
|
37
|
+
|
38
|
+
Filter out operations that are labeled ``"foo"``
|
39
|
+
|
40
|
+
.. plot::
|
41
|
+
:alt: Circuit diagram output by the previous code.
|
42
|
+
:include-source:
|
43
|
+
|
44
|
+
from qiskit import QuantumCircuit
|
45
|
+
from qiskit.transpiler.passes import FilterOpNodes
|
46
|
+
|
47
|
+
circuit = QuantumCircuit(1)
|
48
|
+
circuit.x(0, label='foo')
|
49
|
+
circuit.barrier()
|
50
|
+
circuit.h(0)
|
51
|
+
|
52
|
+
circuit = FilterOpNodes(
|
53
|
+
lambda node: getattr(node.op, "label") != "foo"
|
54
|
+
)(circuit)
|
55
|
+
circuit.draw('mpl')
|
56
|
+
"""
|
57
|
+
|
58
|
+
def __init__(self, predicate: Callable[[DAGOpNode], bool]):
|
59
|
+
super().__init__()
|
60
|
+
self.predicate = predicate
|
61
|
+
|
62
|
+
@control_flow.trivial_recurse
|
63
|
+
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
64
|
+
"""Run the RemoveBarriers pass on `dag`."""
|
65
|
+
filter_op_nodes(dag, self.predicate)
|
66
|
+
return dag
|
@@ -0,0 +1,48 @@
|
|
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
|
+
"""Check if a property reached a fixed point."""
|
14
|
+
|
15
|
+
from copy import deepcopy
|
16
|
+
|
17
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
18
|
+
|
19
|
+
|
20
|
+
class FixedPoint(AnalysisPass):
|
21
|
+
"""Check if a property reached a fixed point.
|
22
|
+
|
23
|
+
A dummy analysis pass that checks if a property reached a fixed point.
|
24
|
+
The result is saved in ``property_set['<property>_fixed_point']``
|
25
|
+
as a boolean.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self, property_to_check):
|
29
|
+
"""FixedPoint initializer.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
property_to_check (str): The property to check if a fixed point was reached.
|
33
|
+
"""
|
34
|
+
super().__init__()
|
35
|
+
self._property = property_to_check
|
36
|
+
|
37
|
+
def run(self, dag):
|
38
|
+
"""Run the FixedPoint pass on `dag`."""
|
39
|
+
current_value = self.property_set[self._property]
|
40
|
+
fixed_point_previous_property = f"_fixed_point_previous_{self._property}"
|
41
|
+
|
42
|
+
if self.property_set[fixed_point_previous_property] is None:
|
43
|
+
self.property_set[f"{self._property}_fixed_point"] = False
|
44
|
+
else:
|
45
|
+
fixed_point_reached = self.property_set[fixed_point_previous_property] == current_value
|
46
|
+
self.property_set[f"{self._property}_fixed_point"] = fixed_point_reached
|
47
|
+
|
48
|
+
self.property_set[fixed_point_previous_property] = deepcopy(current_value)
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
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
|
+
"""Rearrange the direction of the 2-qubit gate nodes to match the directed coupling map."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit._accelerate.gate_direction import fix_gate_direction_coupling, fix_gate_direction_target
|
17
|
+
|
18
|
+
|
19
|
+
class GateDirection(TransformationPass):
|
20
|
+
"""Modify asymmetric gates to match the hardware coupling direction.
|
21
|
+
|
22
|
+
This pass supports replacements for the `cx`, `cz`, `ecr`, `swap`, `rzx`, `rxx`, `ryy` and
|
23
|
+
`rzz` gates, using the following identities::
|
24
|
+
|
25
|
+
┌───┐┌───┐┌───┐
|
26
|
+
q_0: ──■── q_0: ┤ H ├┤ X ├┤ H ├
|
27
|
+
┌─┴─┐ = ├───┤└─┬─┘├───┤
|
28
|
+
q_1: ┤ X ├ q_1: ┤ H ├──■──┤ H ├
|
29
|
+
└───┘ └───┘ └───┘
|
30
|
+
|
31
|
+
|
32
|
+
global phase: 3π/2
|
33
|
+
┌──────┐ ┌───┐ ┌────┐┌─────┐┌──────┐┌───┐
|
34
|
+
q_0: ┤0 ├ q_0: ─┤ S ├─┤ √X ├┤ Sdg ├┤1 ├┤ H ├
|
35
|
+
│ ECR │ = ┌┴───┴┐├────┤└┬───┬┘│ Ecr │├───┤
|
36
|
+
q_1: ┤1 ├ q_1: ┤ Sdg ├┤ √X ├─┤ S ├─┤0 ├┤ H ├
|
37
|
+
└──────┘ └─────┘└────┘ └───┘ └──────┘└───┘
|
38
|
+
Note: This is done in terms of less-efficient S/SX/Sdg gates instead of the more natural
|
39
|
+
`RY(pi /2)` so we have a chance for basis translation to keep things in a discrete basis
|
40
|
+
during resynthesis, if that's what's being asked for.
|
41
|
+
|
42
|
+
|
43
|
+
┌──────┐ ┌───┐┌──────┐┌───┐
|
44
|
+
q_0: ┤0 ├ q_0: ┤ H ├┤1 ├┤ H ├
|
45
|
+
│ RZX │ = ├───┤│ RZX │├───┤
|
46
|
+
q_1: ┤1 ├ q_1: ┤ H ├┤0 ├┤ H ├
|
47
|
+
└──────┘ └───┘└──────┘└───┘
|
48
|
+
|
49
|
+
cz, swap, rxx, ryy and rzz directions are fixed by reversing their qargs order.
|
50
|
+
|
51
|
+
This pass assumes that the positions of the qubits in the :attr:`.DAGCircuit.qubits` attribute
|
52
|
+
are the physical qubit indices. For example if ``dag.qubits[0]`` is qubit 0 in the
|
53
|
+
:class:`.CouplingMap` or :class:`.Target`.
|
54
|
+
"""
|
55
|
+
|
56
|
+
def __init__(self, coupling_map, target=None):
|
57
|
+
"""GateDirection pass.
|
58
|
+
|
59
|
+
Args:
|
60
|
+
coupling_map (CouplingMap): Directed graph representing a coupling map.
|
61
|
+
target (Target): The backend target to use for this pass. If this is specified
|
62
|
+
it will be used instead of the coupling map
|
63
|
+
"""
|
64
|
+
super().__init__()
|
65
|
+
self.coupling_map = coupling_map
|
66
|
+
self.target = target
|
67
|
+
|
68
|
+
def run(self, dag):
|
69
|
+
"""Run the GateDirection pass on `dag`.
|
70
|
+
|
71
|
+
Flips the cx nodes to match the directed coupling map. Modifies the
|
72
|
+
input dag.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
dag (DAGCircuit): DAG to map.
|
76
|
+
|
77
|
+
Returns:
|
78
|
+
DAGCircuit: The rearranged dag for the coupling map
|
79
|
+
|
80
|
+
Raises:
|
81
|
+
TranspilerError: If the circuit cannot be mapped just by flipping the
|
82
|
+
cx nodes.
|
83
|
+
"""
|
84
|
+
# Only use "fix_gate_direction_target" if a target exists and target.operation_names
|
85
|
+
# is not empty, else use "fix_gate_direction_coupling".
|
86
|
+
if self.target is None:
|
87
|
+
return fix_gate_direction_coupling(dag, set(self.coupling_map.get_edges()))
|
88
|
+
elif len(self.target.operation_names) == 0:
|
89
|
+
# A _FakeTarget path, no basis gates, just use the coupling map
|
90
|
+
return fix_gate_direction_coupling(
|
91
|
+
dag, set(self.target.build_coupling_map().get_edges())
|
92
|
+
)
|
93
|
+
return fix_gate_direction_target(dag, self.target)
|
@@ -0,0 +1,51 @@
|
|
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
|
+
"""Check if all gates in the DAGCircuit are in the specified basis gates."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
16
|
+
|
17
|
+
from qiskit._accelerate.gates_in_basis import (
|
18
|
+
any_gate_missing_from_basis,
|
19
|
+
any_gate_missing_from_target,
|
20
|
+
)
|
21
|
+
|
22
|
+
|
23
|
+
class GatesInBasis(AnalysisPass):
|
24
|
+
"""Check if all gates in a DAG are in a given set of gates"""
|
25
|
+
|
26
|
+
def __init__(self, basis_gates=None, target=None):
|
27
|
+
"""Initialize the GatesInBasis pass.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
basis_gates (list): The list of strings representing the set of basis gates.
|
31
|
+
target (Target): The target representing the backend. If specified
|
32
|
+
this will be used instead of the ``basis_gates`` parameter
|
33
|
+
"""
|
34
|
+
super().__init__()
|
35
|
+
self._basis_gates = None
|
36
|
+
if basis_gates is not None:
|
37
|
+
self._basis_gates = set(basis_gates).union(
|
38
|
+
{"measure", "reset", "barrier", "snapshot", "delay", "store"}
|
39
|
+
)
|
40
|
+
self._target = target
|
41
|
+
|
42
|
+
def run(self, dag):
|
43
|
+
"""Run the GatesInBasis pass on `dag`."""
|
44
|
+
if self._basis_gates is None and self._target is None:
|
45
|
+
self.property_set["all_gates_in_basis"] = True
|
46
|
+
return
|
47
|
+
if self._target is not None:
|
48
|
+
gates_out_of_basis = any_gate_missing_from_target(dag, self._target)
|
49
|
+
else:
|
50
|
+
gates_out_of_basis = any_gate_missing_from_basis(dag, self._basis_gates)
|
51
|
+
self.property_set["all_gates_in_basis"] = not gates_out_of_basis
|
@@ -0,0 +1,163 @@
|
|
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
|
+
"""Return a circuit with any adjacent barriers merged together."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit.circuit.barrier import Barrier
|
17
|
+
|
18
|
+
|
19
|
+
class MergeAdjacentBarriers(TransformationPass):
|
20
|
+
"""Return a circuit with any adjacent barriers merged together.
|
21
|
+
|
22
|
+
Only barriers which can be merged without affecting the barrier structure
|
23
|
+
of the DAG will be merged.
|
24
|
+
|
25
|
+
Not all redundant barriers will necessarily be merged, only adjacent
|
26
|
+
barriers are merged.
|
27
|
+
|
28
|
+
For example, the circuit::
|
29
|
+
|
30
|
+
qr = QuantumRegister(3, 'q')
|
31
|
+
circuit = QuantumCircuit(qr)
|
32
|
+
circuit.barrier(qr[0])
|
33
|
+
circuit.barrier(qr[1])
|
34
|
+
circuit.barrier(qr)
|
35
|
+
|
36
|
+
Will be transformed into a circuit corresponding to::
|
37
|
+
|
38
|
+
circuit.barrier(qr[0])
|
39
|
+
circuit.barrier(qr)
|
40
|
+
|
41
|
+
i.e,
|
42
|
+
|
43
|
+
.. code-block:: text
|
44
|
+
|
45
|
+
░ ░ ░ ░
|
46
|
+
q_0: ─░──░─ q_0: ─░──░─
|
47
|
+
░ ░ ░ ░
|
48
|
+
q_1: ─░──░─ => q_1: ────░─
|
49
|
+
░ ░ ░
|
50
|
+
q_2: ────░─ q_2: ────░─
|
51
|
+
░
|
52
|
+
|
53
|
+
after one iteration of the pass. These two barriers were not merged by the
|
54
|
+
first pass as they are not adjacent in the initial circuit.
|
55
|
+
|
56
|
+
The pass then can be reapplied to merge the newly adjacent barriers.
|
57
|
+
"""
|
58
|
+
|
59
|
+
def run(self, dag):
|
60
|
+
"""Run the MergeAdjacentBarriers pass on `dag`."""
|
61
|
+
indices = {qubit: index for index, qubit in enumerate(dag.qubits)}
|
62
|
+
|
63
|
+
# sorted to so that they are in the order they appear in the DAG
|
64
|
+
# so ancestors/descendants makes sense
|
65
|
+
barriers = [nd for nd in dag.topological_op_nodes() if nd.name == "barrier"]
|
66
|
+
|
67
|
+
# get dict of barrier merges
|
68
|
+
node_to_barrier_qubits = MergeAdjacentBarriers._collect_potential_merges(dag, barriers)
|
69
|
+
|
70
|
+
if not node_to_barrier_qubits:
|
71
|
+
return dag
|
72
|
+
|
73
|
+
for barrier in barriers:
|
74
|
+
if barrier in node_to_barrier_qubits:
|
75
|
+
barrier_to_add, nodes = node_to_barrier_qubits[barrier]
|
76
|
+
dag.replace_block_with_op(
|
77
|
+
nodes, barrier_to_add, wire_pos_map=indices, cycle_check=False
|
78
|
+
)
|
79
|
+
|
80
|
+
return dag
|
81
|
+
|
82
|
+
@staticmethod
|
83
|
+
def _collect_potential_merges(dag, barriers):
|
84
|
+
"""Return the potential merges.
|
85
|
+
|
86
|
+
Returns a dict of DAGOpNode: (Barrier, [DAGOpNode]) objects, where the barrier needs to be
|
87
|
+
inserted where the corresponding index DAGOpNode appears in the main DAG, in replacement of
|
88
|
+
the listed DAGOpNodes.
|
89
|
+
"""
|
90
|
+
# if only got 1 or 0 barriers then can't merge
|
91
|
+
if len(barriers) < 2:
|
92
|
+
return None
|
93
|
+
|
94
|
+
# mapping from the node that will be the main barrier to the
|
95
|
+
# barrier object that gets built up
|
96
|
+
node_to_barrier_qubits = {}
|
97
|
+
|
98
|
+
# Start from the first barrier
|
99
|
+
current_barrier = barriers[0]
|
100
|
+
end_of_barrier = current_barrier
|
101
|
+
current_barrier_nodes = [current_barrier]
|
102
|
+
|
103
|
+
current_qubits = set(current_barrier.qargs)
|
104
|
+
current_ancestors = dag.ancestors(current_barrier)
|
105
|
+
current_descendants = dag.descendants(current_barrier)
|
106
|
+
|
107
|
+
barrier_to_add = Barrier(len(current_qubits))
|
108
|
+
|
109
|
+
for next_barrier in barriers[1:]:
|
110
|
+
|
111
|
+
# Ensure barriers are adjacent before checking if they are mergeable.
|
112
|
+
if dag._has_edge(end_of_barrier._node_id, next_barrier._node_id):
|
113
|
+
|
114
|
+
# Remove all barriers that have already been included in this new barrier from the
|
115
|
+
# set of ancestors/descendants as they will be removed from the new DAG when it is
|
116
|
+
# created.
|
117
|
+
next_ancestors = {
|
118
|
+
nd for nd in dag.ancestors(next_barrier) if nd not in current_barrier_nodes
|
119
|
+
}
|
120
|
+
next_descendants = {
|
121
|
+
nd for nd in dag.descendants(next_barrier) if nd not in current_barrier_nodes
|
122
|
+
}
|
123
|
+
next_qubits = set(next_barrier.qargs)
|
124
|
+
|
125
|
+
if (
|
126
|
+
not current_qubits.isdisjoint(next_qubits)
|
127
|
+
and current_ancestors.isdisjoint(next_descendants)
|
128
|
+
and current_descendants.isdisjoint(next_ancestors)
|
129
|
+
):
|
130
|
+
|
131
|
+
# can be merged
|
132
|
+
current_ancestors = current_ancestors | next_ancestors
|
133
|
+
current_descendants = current_descendants | next_descendants
|
134
|
+
current_qubits = current_qubits | next_qubits
|
135
|
+
|
136
|
+
# update the barrier that will be added back to include this barrier
|
137
|
+
barrier_to_add = Barrier(len(current_qubits))
|
138
|
+
|
139
|
+
end_of_barrier = next_barrier
|
140
|
+
current_barrier_nodes.append(end_of_barrier)
|
141
|
+
continue
|
142
|
+
|
143
|
+
# Fallback if barriers are not adjacent or not mergeable.
|
144
|
+
|
145
|
+
# store the previously made barrier
|
146
|
+
if barrier_to_add:
|
147
|
+
node_to_barrier_qubits[end_of_barrier] = (barrier_to_add, current_barrier_nodes)
|
148
|
+
|
149
|
+
# reset the properties
|
150
|
+
current_qubits = set(next_barrier.qargs)
|
151
|
+
current_ancestors = dag.ancestors(next_barrier)
|
152
|
+
current_descendants = dag.descendants(next_barrier)
|
153
|
+
|
154
|
+
barrier_to_add = Barrier(len(current_qubits))
|
155
|
+
current_barrier_nodes = []
|
156
|
+
|
157
|
+
end_of_barrier = next_barrier
|
158
|
+
current_barrier_nodes.append(end_of_barrier)
|
159
|
+
|
160
|
+
if barrier_to_add:
|
161
|
+
node_to_barrier_qubits[end_of_barrier] = (barrier_to_add, current_barrier_nodes)
|
162
|
+
|
163
|
+
return node_to_barrier_qubits
|