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,242 @@
|
|
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
|
+
"""Collect sequences of uninterrupted gates acting on a number of qubits."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
16
|
+
from qiskit.circuit import Gate
|
17
|
+
from qiskit.dagcircuit import DAGOpNode, DAGInNode
|
18
|
+
|
19
|
+
|
20
|
+
class CollectMultiQBlocks(AnalysisPass):
|
21
|
+
"""Collect sequences of uninterrupted gates acting on groups of qubits.
|
22
|
+
``max_block_size`` specifies the maximum number of qubits that can be acted upon
|
23
|
+
by any single group of gates
|
24
|
+
|
25
|
+
Traverse the DAG and find blocks of gates that act consecutively on
|
26
|
+
groups of qubits. Write the blocks to ``property_set`` as a list of blocks
|
27
|
+
of the form::
|
28
|
+
|
29
|
+
[[g0, g1, g2], [g4, g5]]
|
30
|
+
|
31
|
+
Blocks are reported in a valid topological order. Further, the gates
|
32
|
+
within each block are also reported in topological order
|
33
|
+
Some gates may not be present in any block (e.g. if the number
|
34
|
+
of operands is greater than ``max_block_size``)
|
35
|
+
|
36
|
+
By default, blocks are collected in the direction from the inputs towards the
|
37
|
+
outputs of the DAG. The option ``collect_from_back`` allows to change this
|
38
|
+
direction, that is to collect blocks from the outputs towards the inputs.
|
39
|
+
Note that the blocks are still reported in a valid topological order.
|
40
|
+
|
41
|
+
A Disjoint Set Union data structure (DSU) is used to maintain blocks as
|
42
|
+
gates are processed. This data structure points each qubit to a set at all
|
43
|
+
times and the sets correspond to current blocks. These change over time
|
44
|
+
and the data structure allows these changes to be done quickly.
|
45
|
+
"""
|
46
|
+
|
47
|
+
def __init__(self, max_block_size=2, collect_from_back=False):
|
48
|
+
super().__init__()
|
49
|
+
self.parent = {} # parent array for the union
|
50
|
+
|
51
|
+
# the dicts belowed are keyed by a qubit signifying the root of a
|
52
|
+
# set in the DSU data structure
|
53
|
+
self.bit_groups = {} # current groups of bits stored at top of trees
|
54
|
+
self.gate_groups = {} # current gate lists for the groups
|
55
|
+
|
56
|
+
self.max_block_size = max_block_size # maximum block size
|
57
|
+
self.collect_from_back = collect_from_back # backward collection
|
58
|
+
|
59
|
+
def find_set(self, index):
|
60
|
+
"""DSU function for finding root of set of items
|
61
|
+
If my parent is myself, I am the root. Otherwise we recursively
|
62
|
+
find the root for my parent. After that, we assign my parent to be
|
63
|
+
my root, saving recursion in the future.
|
64
|
+
"""
|
65
|
+
|
66
|
+
if index not in self.parent:
|
67
|
+
self.parent[index] = index
|
68
|
+
self.bit_groups[index] = [index]
|
69
|
+
self.gate_groups[index] = []
|
70
|
+
if self.parent[index] == index:
|
71
|
+
return index
|
72
|
+
self.parent[index] = self.find_set(self.parent[index])
|
73
|
+
return self.parent[index]
|
74
|
+
|
75
|
+
def union_set(self, set1, set2):
|
76
|
+
"""DSU function for unioning two sets together
|
77
|
+
Find the roots of each set. Then assign one to have the other
|
78
|
+
as its parent, thus liking the sets.
|
79
|
+
Merges smaller set into larger set in order to have better runtime
|
80
|
+
"""
|
81
|
+
|
82
|
+
set1 = self.find_set(set1)
|
83
|
+
set2 = self.find_set(set2)
|
84
|
+
if set1 == set2:
|
85
|
+
return
|
86
|
+
if len(self.gate_groups[set1]) < len(self.gate_groups[set2]):
|
87
|
+
set1, set2 = set2, set1
|
88
|
+
self.parent[set2] = set1
|
89
|
+
self.gate_groups[set1].extend(self.gate_groups[set2])
|
90
|
+
self.bit_groups[set1].extend(self.bit_groups[set2])
|
91
|
+
self.gate_groups[set2].clear()
|
92
|
+
self.bit_groups[set2].clear()
|
93
|
+
|
94
|
+
def run(self, dag):
|
95
|
+
"""Run the CollectMultiQBlocks pass on `dag`.
|
96
|
+
|
97
|
+
The blocks contain "op" nodes in topological sort order
|
98
|
+
such that all gates in a block act on the same set of
|
99
|
+
qubits and are adjacent in the circuit.
|
100
|
+
|
101
|
+
The blocks are built by examining predecessors and successors of
|
102
|
+
"cx" gates in the circuit. u1, u2, u3, cx, id gates will be included.
|
103
|
+
|
104
|
+
After the execution, ``property_set['block_list']`` is set to
|
105
|
+
a list of tuples of ``DAGNode`` objects
|
106
|
+
"""
|
107
|
+
|
108
|
+
self.parent = {} # reset all variables on run
|
109
|
+
self.bit_groups = {}
|
110
|
+
self.gate_groups = {}
|
111
|
+
|
112
|
+
block_list = []
|
113
|
+
|
114
|
+
def collect_key(x):
|
115
|
+
"""special key function for topological ordering.
|
116
|
+
Heuristic for this is to push all gates involving measurement
|
117
|
+
or barriers, etc. as far back as possible (because they force
|
118
|
+
blocks to end). After that, we process gates in order of lowest
|
119
|
+
number of qubits acted on to largest number of qubits acted on
|
120
|
+
because these have less chance of increasing the size of blocks
|
121
|
+
The key also processes all the non operation notes first so that
|
122
|
+
input nodes do not mess with the top sort of op nodes
|
123
|
+
"""
|
124
|
+
if isinstance(x, DAGInNode):
|
125
|
+
return "a"
|
126
|
+
if not isinstance(x, DAGOpNode):
|
127
|
+
return "d"
|
128
|
+
if isinstance(x.op, Gate):
|
129
|
+
if x.op.is_parameterized() or getattr(x.op, "_condition", None) is not None:
|
130
|
+
return "c"
|
131
|
+
return "b" + chr(ord("a") + len(x.qargs))
|
132
|
+
return "d"
|
133
|
+
|
134
|
+
op_nodes = dag.topological_op_nodes(key=collect_key)
|
135
|
+
|
136
|
+
# When collecting from the back, the order of nodes is reversed
|
137
|
+
if self.collect_from_back:
|
138
|
+
op_nodes = reversed(list(op_nodes))
|
139
|
+
|
140
|
+
for nd in op_nodes:
|
141
|
+
can_process = True
|
142
|
+
makes_too_big = False
|
143
|
+
|
144
|
+
# check if the node is a gate and if it is parameterized
|
145
|
+
if (
|
146
|
+
getattr(nd.op, "_condition", None) is not None
|
147
|
+
or nd.op.is_parameterized()
|
148
|
+
or not isinstance(nd.op, Gate)
|
149
|
+
):
|
150
|
+
can_process = False
|
151
|
+
|
152
|
+
cur_qubits = {dag.find_bit(bit).index for bit in nd.qargs}
|
153
|
+
|
154
|
+
if can_process:
|
155
|
+
# if the gate is valid, check if grouping up the bits
|
156
|
+
# in the gate would fit within our desired max size
|
157
|
+
c_tops = set()
|
158
|
+
for bit in cur_qubits:
|
159
|
+
c_tops.add(self.find_set(bit))
|
160
|
+
tot_size = 0
|
161
|
+
for group in c_tops:
|
162
|
+
tot_size += len(self.bit_groups[group])
|
163
|
+
if tot_size > self.max_block_size:
|
164
|
+
makes_too_big = True
|
165
|
+
|
166
|
+
if not can_process:
|
167
|
+
# resolve the case where we cannot process this node
|
168
|
+
for bit in cur_qubits:
|
169
|
+
# create a gate out of me
|
170
|
+
bit = self.find_set(bit)
|
171
|
+
if len(self.gate_groups[bit]) == 0:
|
172
|
+
continue
|
173
|
+
block_list.append(self.gate_groups[bit][:])
|
174
|
+
cur_set = set(self.bit_groups[bit])
|
175
|
+
for v in cur_set:
|
176
|
+
# reset this bit
|
177
|
+
self.parent[v] = v
|
178
|
+
self.bit_groups[v] = [v]
|
179
|
+
self.gate_groups[v] = []
|
180
|
+
|
181
|
+
if makes_too_big:
|
182
|
+
# adding in all of the new qubits would make the group too big
|
183
|
+
# we must block off sub portions of the groups until the new
|
184
|
+
# group would no longer be too big
|
185
|
+
savings = {}
|
186
|
+
tot_size = 0
|
187
|
+
for bit in cur_qubits:
|
188
|
+
top = self.find_set(bit)
|
189
|
+
if top in savings:
|
190
|
+
savings[top] = savings[top] - 1
|
191
|
+
else:
|
192
|
+
savings[top] = len(self.bit_groups[top]) - 1
|
193
|
+
tot_size += len(self.bit_groups[top])
|
194
|
+
slist = []
|
195
|
+
for item, value in savings.items():
|
196
|
+
slist.append((value, item))
|
197
|
+
slist.sort(reverse=True)
|
198
|
+
savings_need = tot_size - self.max_block_size
|
199
|
+
for item in slist:
|
200
|
+
# remove groups until the size created would be acceptable
|
201
|
+
# start with blocking out the group that would decrease
|
202
|
+
# the new size the most. This heuristic for which blocks we
|
203
|
+
# create does not necessarily give the optimal blocking. Other
|
204
|
+
# heuristics may be worth considering
|
205
|
+
if savings_need > 0:
|
206
|
+
savings_need = savings_need - item[0]
|
207
|
+
if len(self.gate_groups[item[1]]) >= 1:
|
208
|
+
block_list.append(self.gate_groups[item[1]][:])
|
209
|
+
cur_set = set(self.bit_groups[item[1]])
|
210
|
+
for v in cur_set:
|
211
|
+
self.parent[v] = v
|
212
|
+
self.bit_groups[v] = [v]
|
213
|
+
self.gate_groups[v] = []
|
214
|
+
|
215
|
+
if can_process:
|
216
|
+
# if the operation is a gate, either skip it if it is too large
|
217
|
+
# or group up all of the qubits involved in the gate
|
218
|
+
if len(cur_qubits) > self.max_block_size:
|
219
|
+
# gates acting on more qubits than max_block_size cannot
|
220
|
+
# be a part of any block and thus we skip them here.
|
221
|
+
# we have already finalized the blocks involving the gate's
|
222
|
+
# qubits in the above makes_too_big block
|
223
|
+
continue # unable to be part of a group
|
224
|
+
prev = -1
|
225
|
+
for bit in cur_qubits:
|
226
|
+
if prev != -1:
|
227
|
+
self.union_set(prev, bit)
|
228
|
+
prev = bit
|
229
|
+
self.gate_groups[self.find_set(prev)].append(nd)
|
230
|
+
# need to turn all groups that still exist into their own blocks
|
231
|
+
for index, item in self.parent.items():
|
232
|
+
if item == index and len(self.gate_groups[index]) != 0:
|
233
|
+
block_list.append(self.gate_groups[index][:])
|
234
|
+
|
235
|
+
# When collecting from the back, both the order of the blocks
|
236
|
+
# and the order of nodes in each block should be reversed.
|
237
|
+
if self.collect_from_back:
|
238
|
+
block_list = [block[::-1] for block in block_list[::-1]]
|
239
|
+
|
240
|
+
self.property_set["block_list"] = block_list
|
241
|
+
|
242
|
+
return dag
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Analysis pass to find commutation relations between DAG nodes."""
|
14
|
+
|
15
|
+
from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
|
16
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
17
|
+
from qiskit._accelerate.commutation_analysis import analyze_commutations
|
18
|
+
|
19
|
+
|
20
|
+
class CommutationAnalysis(AnalysisPass):
|
21
|
+
r"""Analysis pass to find commutation relations between DAG nodes.
|
22
|
+
|
23
|
+
This sets ``property_set['commutation_set']`` to a dictionary that describes
|
24
|
+
the commutation relations on a given wire: all the gates on a wire
|
25
|
+
are grouped into a set of gates that commute.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self, *, _commutation_checker=None):
|
29
|
+
super().__init__()
|
30
|
+
# allow setting a private commutation checker, this allows better performance if we
|
31
|
+
# do not care about commutations of all gates, but just a subset
|
32
|
+
if _commutation_checker is None:
|
33
|
+
_commutation_checker = scc
|
34
|
+
|
35
|
+
self.comm_checker = _commutation_checker
|
36
|
+
|
37
|
+
def run(self, dag):
|
38
|
+
"""Run the CommutationAnalysis pass on `dag`.
|
39
|
+
|
40
|
+
Run the pass on the DAG, and write the discovered commutation relations
|
41
|
+
into the ``property_set``.
|
42
|
+
"""
|
43
|
+
# Initiate the commutation set
|
44
|
+
self.property_set["commutation_set"] = analyze_commutations(dag, self.comm_checker.cc)
|
@@ -0,0 +1,82 @@
|
|
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
|
+
"""Cancel the redundant (self-adjoint) gates through commutation relations."""
|
14
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
15
|
+
from qiskit.circuit.commutation_library import StandardGateCommutations
|
16
|
+
|
17
|
+
from qiskit.circuit.library.standard_gates.u1 import U1Gate
|
18
|
+
from qiskit.circuit.library.standard_gates.p import PhaseGate
|
19
|
+
from qiskit.circuit.library.standard_gates.rz import RZGate
|
20
|
+
from qiskit._accelerate import commutation_cancellation
|
21
|
+
from qiskit._accelerate.commutation_checker import CommutationChecker
|
22
|
+
|
23
|
+
from qiskit.transpiler.passes.utils.control_flow import trivial_recurse
|
24
|
+
|
25
|
+
_CUTOFF_PRECISION = 1e-5
|
26
|
+
|
27
|
+
|
28
|
+
class CommutativeCancellation(TransformationPass):
|
29
|
+
"""Cancel the redundant (self-adjoint) gates through commutation relations.
|
30
|
+
|
31
|
+
Pass for cancelling self-inverse gates/rotations. The cancellation utilizes
|
32
|
+
the commutation relations in the circuit. Gates considered include::
|
33
|
+
|
34
|
+
H, X, Y, Z, CX, CY, CZ
|
35
|
+
"""
|
36
|
+
|
37
|
+
def __init__(self, basis_gates=None, target=None):
|
38
|
+
"""
|
39
|
+
CommutativeCancellation initializer.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
basis_gates (list[str]): Basis gates to consider, e.g.
|
43
|
+
``['u3', 'cx']``. For the effects of this pass, the basis is
|
44
|
+
the set intersection between the ``basis_gates`` parameter
|
45
|
+
and the gates in the dag.
|
46
|
+
target (Target): The :class:`~.Target` representing the target backend, if both
|
47
|
+
``basis_gates`` and ``target`` are specified then this argument will take
|
48
|
+
precedence and ``basis_gates`` will be ignored.
|
49
|
+
"""
|
50
|
+
super().__init__()
|
51
|
+
if basis_gates:
|
52
|
+
self.basis = set(basis_gates)
|
53
|
+
else:
|
54
|
+
self.basis = set()
|
55
|
+
self.target = target
|
56
|
+
if target is not None:
|
57
|
+
self.basis = set(target.operation_names)
|
58
|
+
|
59
|
+
self._var_z_map = {"rz": RZGate, "p": PhaseGate, "u1": U1Gate}
|
60
|
+
|
61
|
+
self._z_rotations = {"p", "z", "u1", "rz", "t", "s"}
|
62
|
+
self._x_rotations = {"x", "rx"}
|
63
|
+
self._gates = {"cx", "cy", "cz", "h", "y"} # Now the gates supported are hard-coded
|
64
|
+
|
65
|
+
# build a commutation checker restricted to the gates we cancel -- the others we
|
66
|
+
# do not have to investigate, which allows to save time
|
67
|
+
self._commutation_checker = CommutationChecker(
|
68
|
+
StandardGateCommutations, gates=self._gates | self._z_rotations | self._x_rotations
|
69
|
+
)
|
70
|
+
|
71
|
+
@trivial_recurse
|
72
|
+
def run(self, dag):
|
73
|
+
"""Run the CommutativeCancellation pass on `dag`.
|
74
|
+
|
75
|
+
Args:
|
76
|
+
dag (DAGCircuit): the DAG to be optimized.
|
77
|
+
|
78
|
+
Returns:
|
79
|
+
DAGCircuit: the optimized DAG.
|
80
|
+
"""
|
81
|
+
commutation_cancellation.cancel_commutations(dag, self._commutation_checker, self.basis)
|
82
|
+
return dag
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2024.
|
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
|
+
"""Cancel pairs of inverse gates exploiting commutation relations."""
|
14
|
+
from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
|
15
|
+
|
16
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
17
|
+
from qiskit.quantum_info import Operator
|
18
|
+
from qiskit.quantum_info.operators.predicates import matrix_equal
|
19
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
20
|
+
|
21
|
+
|
22
|
+
class CommutativeInverseCancellation(TransformationPass):
|
23
|
+
"""Cancel pairs of inverse gates exploiting commutation relations."""
|
24
|
+
|
25
|
+
def __init__(self, matrix_based: bool = False, max_qubits: int = 4):
|
26
|
+
"""
|
27
|
+
Args:
|
28
|
+
matrix_based: If ``True``, uses matrix representations to check whether two
|
29
|
+
operations are inverse of each other. This makes the checks more powerful,
|
30
|
+
and, in addition, allows canceling pairs of operations that are inverse up to a
|
31
|
+
phase, while updating the global phase of the circuit accordingly.
|
32
|
+
Generally this leads to more reductions at the expense of increased runtime.
|
33
|
+
max_qubits: Limits the number of qubits in matrix-based commutativity and
|
34
|
+
inverse checks.
|
35
|
+
"""
|
36
|
+
self._matrix_based = matrix_based
|
37
|
+
self._max_qubits = max_qubits
|
38
|
+
self.comm_checker = scc
|
39
|
+
super().__init__()
|
40
|
+
|
41
|
+
def _skip_node(self, node):
|
42
|
+
"""Returns True if we should skip this node for the analysis."""
|
43
|
+
if not isinstance(node, DAGOpNode):
|
44
|
+
return True
|
45
|
+
|
46
|
+
# We are currently taking an over-conservative approach with respect to which nodes
|
47
|
+
# can be inverses of which other nodes, and do not allow reductions for barriers, measures,
|
48
|
+
# conditional gates or parameterized gates. Possibly both this and commutativity
|
49
|
+
# checking can be extended to cover additional cases.
|
50
|
+
if getattr(node.op, "_directive", False) or node.name in {"measure", "reset", "delay"}:
|
51
|
+
return True
|
52
|
+
if getattr(node, "condition", None):
|
53
|
+
return True
|
54
|
+
if node.op.is_parameterized():
|
55
|
+
return True
|
56
|
+
return False
|
57
|
+
|
58
|
+
def _check_inverse(self, node1, node2):
|
59
|
+
"""Checks whether op1 and op2 are inverse up to a phase, that is whether
|
60
|
+
``op2 = e^{i * d} op1^{-1})`` for some phase difference ``d``.
|
61
|
+
If this is the case, we can replace ``op2 * op1`` by `e^{i * d} I``.
|
62
|
+
The input to this function is a pair of DAG nodes.
|
63
|
+
The output is a tuple representing whether the two nodes
|
64
|
+
are inverse up to a phase and that phase difference.
|
65
|
+
"""
|
66
|
+
phase_difference = 0
|
67
|
+
if not self._matrix_based:
|
68
|
+
is_inverse = node1.op.inverse() == node2.op
|
69
|
+
elif len(node2.qargs) > self._max_qubits:
|
70
|
+
is_inverse = False
|
71
|
+
else:
|
72
|
+
mat1 = Operator(node1.op.inverse()).data
|
73
|
+
mat2 = Operator(node2.op).data
|
74
|
+
props = {}
|
75
|
+
is_inverse = matrix_equal(mat1, mat2, ignore_phase=True, props=props)
|
76
|
+
if is_inverse:
|
77
|
+
# mat2 = e^{i * phase_difference} mat1
|
78
|
+
phase_difference = props["phase_difference"]
|
79
|
+
return is_inverse, phase_difference
|
80
|
+
|
81
|
+
def run(self, dag: DAGCircuit):
|
82
|
+
"""
|
83
|
+
Run the CommutativeInverseCancellation pass on `dag`.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
dag: the directed acyclic graph to run on.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
DAGCircuit: Transformed DAG.
|
90
|
+
"""
|
91
|
+
topo_sorted_nodes = list(dag.topological_op_nodes())
|
92
|
+
|
93
|
+
circ_size = len(topo_sorted_nodes)
|
94
|
+
|
95
|
+
removed = [False for _ in range(circ_size)]
|
96
|
+
|
97
|
+
phase_update = 0
|
98
|
+
|
99
|
+
for idx1 in range(0, circ_size):
|
100
|
+
if self._skip_node(topo_sorted_nodes[idx1]):
|
101
|
+
continue
|
102
|
+
|
103
|
+
matched_idx2 = -1
|
104
|
+
|
105
|
+
for idx2 in range(idx1 - 1, -1, -1):
|
106
|
+
if removed[idx2]:
|
107
|
+
continue
|
108
|
+
|
109
|
+
if (
|
110
|
+
not self._skip_node(topo_sorted_nodes[idx2])
|
111
|
+
and topo_sorted_nodes[idx2].qargs == topo_sorted_nodes[idx1].qargs
|
112
|
+
and topo_sorted_nodes[idx2].cargs == topo_sorted_nodes[idx1].cargs
|
113
|
+
):
|
114
|
+
is_inverse, phase = self._check_inverse(
|
115
|
+
topo_sorted_nodes[idx1], topo_sorted_nodes[idx2]
|
116
|
+
)
|
117
|
+
if is_inverse:
|
118
|
+
phase_update += phase
|
119
|
+
matched_idx2 = idx2
|
120
|
+
break
|
121
|
+
|
122
|
+
if not self.comm_checker.commute_nodes(
|
123
|
+
topo_sorted_nodes[idx1],
|
124
|
+
topo_sorted_nodes[idx2],
|
125
|
+
max_num_qubits=self._max_qubits,
|
126
|
+
):
|
127
|
+
break
|
128
|
+
|
129
|
+
if matched_idx2 != -1:
|
130
|
+
removed[idx1] = True
|
131
|
+
removed[matched_idx2] = True
|
132
|
+
|
133
|
+
for idx in range(circ_size):
|
134
|
+
if removed[idx]:
|
135
|
+
dag.remove_op_node(topo_sorted_nodes[idx])
|
136
|
+
|
137
|
+
if phase_update != 0:
|
138
|
+
dag.global_phase += phase_update
|
139
|
+
|
140
|
+
return dag
|
@@ -0,0 +1,176 @@
|
|
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
|
+
"""Replace each block of consecutive gates by a single Unitary node."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer, TwoQubitControlledUDecomposer
|
17
|
+
from qiskit.circuit.library.standard_gates import (
|
18
|
+
CXGate,
|
19
|
+
CZGate,
|
20
|
+
iSwapGate,
|
21
|
+
ECRGate,
|
22
|
+
RXXGate,
|
23
|
+
RYYGate,
|
24
|
+
RZZGate,
|
25
|
+
RZXGate,
|
26
|
+
CRXGate,
|
27
|
+
CRYGate,
|
28
|
+
CRZGate,
|
29
|
+
CPhaseGate,
|
30
|
+
)
|
31
|
+
|
32
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
33
|
+
from qiskit.transpiler.passmanager import PassManager
|
34
|
+
from qiskit._accelerate.consolidate_blocks import consolidate_blocks
|
35
|
+
|
36
|
+
from .collect_1q_runs import Collect1qRuns
|
37
|
+
from .collect_2q_blocks import Collect2qBlocks
|
38
|
+
|
39
|
+
KAK_GATE_NAMES = {
|
40
|
+
"cx": CXGate(),
|
41
|
+
"cz": CZGate(),
|
42
|
+
"iswap": iSwapGate(),
|
43
|
+
"ecr": ECRGate(),
|
44
|
+
}
|
45
|
+
|
46
|
+
KAK_GATE_PARAM_NAMES = {
|
47
|
+
"rxx": RXXGate,
|
48
|
+
"rzz": RZZGate,
|
49
|
+
"ryy": RYYGate,
|
50
|
+
"rzx": RZXGate,
|
51
|
+
"cphase": CPhaseGate,
|
52
|
+
"crx": CRXGate,
|
53
|
+
"cry": CRYGate,
|
54
|
+
"crz": CRZGate,
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
class ConsolidateBlocks(TransformationPass):
|
59
|
+
"""Replace each block of consecutive gates by a single Unitary node.
|
60
|
+
|
61
|
+
Pass to consolidate sequences of uninterrupted gates acting on
|
62
|
+
the same qubits into a Unitary node, to be resynthesized later,
|
63
|
+
to a potentially more optimal subcircuit.
|
64
|
+
|
65
|
+
Notes:
|
66
|
+
This pass assumes that the 'blocks_list' property that it reads is
|
67
|
+
given such that blocks are in topological order. The blocks are
|
68
|
+
collected by a previous pass, such as `Collect2qBlocks`.
|
69
|
+
"""
|
70
|
+
|
71
|
+
def __init__(
|
72
|
+
self,
|
73
|
+
kak_basis_gate=None,
|
74
|
+
force_consolidate=False,
|
75
|
+
basis_gates=None,
|
76
|
+
approximation_degree=1.0,
|
77
|
+
target=None,
|
78
|
+
):
|
79
|
+
"""ConsolidateBlocks initializer.
|
80
|
+
|
81
|
+
If ``kak_basis_gate`` is not ``None`` it will be used as the basis gate for KAK decomposition.
|
82
|
+
Otherwise, if ``basis_gates`` is not ``None`` a basis gate will be chosen from this list.
|
83
|
+
Otherwise, the basis gate will be :class:`.CXGate`.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
kak_basis_gate (Gate): Basis gate for KAK decomposition.
|
87
|
+
force_consolidate (bool): Force block consolidation.
|
88
|
+
basis_gates (List(str)): Basis gates from which to choose a KAK gate.
|
89
|
+
approximation_degree (float): a float between :math:`[0.0, 1.0]`. Lower approximates more.
|
90
|
+
target (Target): The target object for the compilation target backend.
|
91
|
+
"""
|
92
|
+
super().__init__()
|
93
|
+
self.basis_gates = None
|
94
|
+
self.basis_gate_name = None
|
95
|
+
# Bypass target if it doesn't contain any basis gates (i.e. it's a _FakeTarget), as this
|
96
|
+
# not part of the official target model.
|
97
|
+
self.target = target if target is not None and len(target.operation_names) > 0 else None
|
98
|
+
if basis_gates is not None:
|
99
|
+
self.basis_gates = set(basis_gates)
|
100
|
+
self.force_consolidate = force_consolidate
|
101
|
+
if kak_basis_gate is not None:
|
102
|
+
self.decomposer = TwoQubitBasisDecomposer(kak_basis_gate)
|
103
|
+
self.basis_gate_name = kak_basis_gate.name
|
104
|
+
elif basis_gates is not None:
|
105
|
+
kak_gates = KAK_GATE_NAMES.keys() & (basis_gates or [])
|
106
|
+
kak_param_gates = KAK_GATE_PARAM_NAMES.keys() & (basis_gates or [])
|
107
|
+
if kak_param_gates:
|
108
|
+
self.decomposer = TwoQubitControlledUDecomposer(
|
109
|
+
KAK_GATE_PARAM_NAMES[list(kak_param_gates)[0]]
|
110
|
+
)
|
111
|
+
self.basis_gate_name = list(kak_param_gates)[0]
|
112
|
+
elif kak_gates:
|
113
|
+
self.decomposer = TwoQubitBasisDecomposer(
|
114
|
+
KAK_GATE_NAMES[list(kak_gates)[0]], basis_fidelity=approximation_degree or 1.0
|
115
|
+
)
|
116
|
+
self.basis_gate_name = list(kak_gates)[0]
|
117
|
+
else:
|
118
|
+
self.decomposer = None
|
119
|
+
else:
|
120
|
+
self.decomposer = TwoQubitBasisDecomposer(CXGate())
|
121
|
+
self.basis_gate_name = "cx"
|
122
|
+
|
123
|
+
def run(self, dag):
|
124
|
+
"""Run the ConsolidateBlocks pass on `dag`.
|
125
|
+
|
126
|
+
Iterate over each block and replace it with an equivalent Unitary
|
127
|
+
on the same wires.
|
128
|
+
"""
|
129
|
+
if self.decomposer is None:
|
130
|
+
return dag
|
131
|
+
|
132
|
+
blocks = self.property_set["block_list"]
|
133
|
+
if blocks is not None:
|
134
|
+
blocks = [[node._node_id for node in block] for block in blocks]
|
135
|
+
runs = self.property_set["run_list"]
|
136
|
+
if runs is not None:
|
137
|
+
runs = [[node._node_id for node in run] for run in runs]
|
138
|
+
|
139
|
+
consolidate_blocks(
|
140
|
+
dag,
|
141
|
+
self.decomposer._inner_decomposer,
|
142
|
+
self.basis_gate_name,
|
143
|
+
self.force_consolidate,
|
144
|
+
target=self.target,
|
145
|
+
basis_gates=self.basis_gates,
|
146
|
+
blocks=blocks,
|
147
|
+
runs=runs,
|
148
|
+
)
|
149
|
+
dag = self._handle_control_flow_ops(dag)
|
150
|
+
|
151
|
+
# Clear collected blocks and runs as they are no longer valid after consolidation
|
152
|
+
if "run_list" in self.property_set:
|
153
|
+
del self.property_set["run_list"]
|
154
|
+
if "block_list" in self.property_set:
|
155
|
+
del self.property_set["block_list"]
|
156
|
+
|
157
|
+
return dag
|
158
|
+
|
159
|
+
def _handle_control_flow_ops(self, dag):
|
160
|
+
"""
|
161
|
+
This is similar to transpiler/passes/utils/control_flow.py except that the
|
162
|
+
collect blocks is redone for the control flow blocks.
|
163
|
+
"""
|
164
|
+
|
165
|
+
pass_manager = PassManager()
|
166
|
+
if "run_list" in self.property_set:
|
167
|
+
pass_manager.append(Collect1qRuns())
|
168
|
+
pass_manager.append(Collect2qBlocks())
|
169
|
+
|
170
|
+
pass_manager.append(self)
|
171
|
+
for node in dag.control_flow_op_nodes():
|
172
|
+
dag.substitute_node(
|
173
|
+
node,
|
174
|
+
node.op.replace_blocks(pass_manager.run(block) for block in node.op.blocks),
|
175
|
+
)
|
176
|
+
return dag
|