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,425 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Unitary Synthesis Transpiler Pass
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from typing import Any
|
19
|
+
|
20
|
+
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
21
|
+
from qiskit.circuit import CircuitInstruction
|
22
|
+
from qiskit.converters import circuit_to_dag, dag_to_circuit
|
23
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
24
|
+
from qiskit.dagcircuit.dagnode import DAGOpNode
|
25
|
+
from qiskit.synthesis.one_qubit import one_qubit_decompose
|
26
|
+
|
27
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
28
|
+
from qiskit.transpiler.coupling import CouplingMap
|
29
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
30
|
+
from qiskit.transpiler.passes.synthesis import plugin
|
31
|
+
from qiskit.transpiler.target import Target
|
32
|
+
|
33
|
+
from qiskit._accelerate.unitary_synthesis import run_main_loop
|
34
|
+
|
35
|
+
|
36
|
+
def _choose_bases(basis_gates, basis_dict=None):
|
37
|
+
"""Find the matching basis string keys from the list of basis gates from the target."""
|
38
|
+
if basis_gates is None:
|
39
|
+
basis_set = set()
|
40
|
+
else:
|
41
|
+
basis_set = set(basis_gates)
|
42
|
+
|
43
|
+
if basis_dict is None:
|
44
|
+
basis_dict = one_qubit_decompose.ONE_QUBIT_EULER_BASIS_GATES
|
45
|
+
|
46
|
+
out_basis = []
|
47
|
+
for basis, gates in basis_dict.items():
|
48
|
+
if set(gates).issubset(basis_set):
|
49
|
+
out_basis.append(basis)
|
50
|
+
|
51
|
+
return out_basis
|
52
|
+
|
53
|
+
|
54
|
+
class UnitarySynthesis(TransformationPass):
|
55
|
+
"""Synthesize gates according to their basis gates."""
|
56
|
+
|
57
|
+
def __init__(
|
58
|
+
self,
|
59
|
+
basis_gates: list[str] = None,
|
60
|
+
approximation_degree: float | None = 1.0,
|
61
|
+
coupling_map: CouplingMap = None,
|
62
|
+
pulse_optimize: bool | None = None,
|
63
|
+
natural_direction: bool | None = None,
|
64
|
+
synth_gates: list[str] | None = None,
|
65
|
+
method: str = "default",
|
66
|
+
min_qubits: int = 0,
|
67
|
+
plugin_config: dict = None,
|
68
|
+
target: Target = None,
|
69
|
+
):
|
70
|
+
"""Synthesize unitaries over some basis gates.
|
71
|
+
|
72
|
+
This pass can approximate 2-qubit unitaries given some
|
73
|
+
gate fidelities (via ``target``).
|
74
|
+
More approximation can be forced by setting a heuristic dial
|
75
|
+
``approximation_degree``.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
basis_gates (list[str]): List of gate names to target. If this is
|
79
|
+
not specified the ``target`` argument must be used. If both this
|
80
|
+
and the ``target`` are specified the value of ``target`` will
|
81
|
+
be used and this will be ignored.
|
82
|
+
approximation_degree (float): heuristic dial used for circuit approximation
|
83
|
+
(1.0=no approximation, 0.0=maximal approximation). Approximation can
|
84
|
+
make the synthesized circuit cheaper at the cost of straying from
|
85
|
+
the original unitary. If None, approximation is done based on gate fidelities.
|
86
|
+
coupling_map (CouplingMap): the coupling map of the target
|
87
|
+
in case synthesis is done on a physical circuit. The
|
88
|
+
directionality of the coupling_map will be taken into
|
89
|
+
account if ``pulse_optimize`` is ``True``/``None`` and ``natural_direction``
|
90
|
+
is ``True``/``None``.
|
91
|
+
pulse_optimize (bool): Whether to optimize pulses during
|
92
|
+
synthesis. A value of ``None`` will attempt it but fall
|
93
|
+
back if it does not succeed. A value of ``True`` will raise
|
94
|
+
an error if pulse-optimized synthesis does not succeed.
|
95
|
+
natural_direction (bool): Whether to apply synthesis considering
|
96
|
+
directionality of 2-qubit gates. Only applies when
|
97
|
+
``pulse_optimize`` is ``True`` or ``None``. The natural direction is
|
98
|
+
determined by first checking to see whether the
|
99
|
+
coupling map is unidirectional. If there is no
|
100
|
+
coupling map or the coupling map is bidirectional,
|
101
|
+
the gate direction with the shorter
|
102
|
+
duration from the target properties will be used. If
|
103
|
+
set to True, and a natural direction can not be
|
104
|
+
determined, raises :class:`.TranspilerError`. If set to None, no
|
105
|
+
exception will be raised if a natural direction can
|
106
|
+
not be determined.
|
107
|
+
synth_gates (list[str]): List of gates to synthesize. If None and
|
108
|
+
``pulse_optimize`` is False or None, default to
|
109
|
+
``['unitary']``. If ``None`` and ``pulse_optimize == True``,
|
110
|
+
default to ``['unitary', 'swap']``
|
111
|
+
method (str): The unitary synthesis method plugin to use.
|
112
|
+
min_qubits: The minimum number of qubits in the unitary to synthesize. If this is set
|
113
|
+
and the unitary is less than the specified number of qubits it will not be
|
114
|
+
synthesized.
|
115
|
+
plugin_config: Optional extra configuration arguments (as a ``dict``)
|
116
|
+
which are passed directly to the specified unitary synthesis
|
117
|
+
plugin. By default, this will have no effect as the default
|
118
|
+
plugin has no extra arguments. Refer to the documentation of
|
119
|
+
your unitary synthesis plugin on how to use this.
|
120
|
+
target: The optional :class:`~.Target` for the target device the pass
|
121
|
+
is compiling for. If specified this will supersede the values
|
122
|
+
set for ``basis_gates`` and ``coupling_map``.
|
123
|
+
|
124
|
+
Raises:
|
125
|
+
TranspilerError: if ``method`` was specified but is not found in the
|
126
|
+
installed plugins list. The list of installed plugins can be queried with
|
127
|
+
:func:`~qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names`
|
128
|
+
"""
|
129
|
+
super().__init__()
|
130
|
+
self._basis_gates = set(basis_gates or ())
|
131
|
+
self._approximation_degree = approximation_degree
|
132
|
+
self._min_qubits = min_qubits
|
133
|
+
self.method = method
|
134
|
+
self.plugins = None
|
135
|
+
if method != "default":
|
136
|
+
self.plugins = plugin.UnitarySynthesisPluginManager()
|
137
|
+
self._coupling_map = coupling_map
|
138
|
+
self._pulse_optimize = pulse_optimize
|
139
|
+
self._natural_direction = natural_direction
|
140
|
+
self._plugin_config = plugin_config
|
141
|
+
# Bypass target if it doesn't contain any basis gates (i.e it's _FakeTarget), as this
|
142
|
+
# not part of the official target model.
|
143
|
+
self._target = target if target is not None and len(target.operation_names) > 0 else None
|
144
|
+
if target is not None:
|
145
|
+
self._coupling_map = target.build_coupling_map()
|
146
|
+
if synth_gates:
|
147
|
+
self._synth_gates = synth_gates
|
148
|
+
else:
|
149
|
+
if pulse_optimize:
|
150
|
+
self._synth_gates = ["unitary", "swap"]
|
151
|
+
else:
|
152
|
+
self._synth_gates = ["unitary"]
|
153
|
+
|
154
|
+
self._synth_gates = set(self._synth_gates) - self._basis_gates
|
155
|
+
|
156
|
+
if self.method != "default" and self.method not in self.plugins.ext_plugins:
|
157
|
+
raise TranspilerError(f"Specified method '{self.method}' not found in plugin list")
|
158
|
+
|
159
|
+
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
160
|
+
"""Run the UnitarySynthesis pass on ``dag``.
|
161
|
+
|
162
|
+
Args:
|
163
|
+
dag: input dag.
|
164
|
+
|
165
|
+
Returns:
|
166
|
+
Output dag with UnitaryGates synthesized to target basis.
|
167
|
+
"""
|
168
|
+
|
169
|
+
# If there aren't any gates to synthesize in the circuit we can skip all the iteration
|
170
|
+
# and just return.
|
171
|
+
if not set(self._synth_gates).intersection(dag.count_ops()):
|
172
|
+
return dag
|
173
|
+
|
174
|
+
if self.plugins:
|
175
|
+
plugin_method = self.plugins.ext_plugins[self.method].obj
|
176
|
+
else:
|
177
|
+
from qiskit.transpiler.passes.synthesis.default_unitary_synth_plugin import (
|
178
|
+
DefaultUnitarySynthesis,
|
179
|
+
)
|
180
|
+
|
181
|
+
plugin_method = DefaultUnitarySynthesis()
|
182
|
+
plugin_kwargs: dict[str, Any] = {"config": self._plugin_config}
|
183
|
+
_gate_lengths = _gate_errors = None
|
184
|
+
_gate_lengths_by_qubit = _gate_errors_by_qubit = None
|
185
|
+
|
186
|
+
if self.method == "default":
|
187
|
+
# If the method is the default, we only need to evaluate one set of keyword arguments.
|
188
|
+
# To simplify later logic, and avoid cases where static analysis might complain that we
|
189
|
+
# haven't initialized the "default" handler, we rebind the names so they point to the
|
190
|
+
# same object as the chosen method.
|
191
|
+
default_method = plugin_method
|
192
|
+
default_kwargs = plugin_kwargs
|
193
|
+
method_list = [(plugin_method, plugin_kwargs)]
|
194
|
+
else:
|
195
|
+
# If the method is not the default, we still need to initialise the default plugin's
|
196
|
+
# keyword arguments in case we have to fall back on it during the actual run.
|
197
|
+
default_method = self.plugins.ext_plugins["default"].obj
|
198
|
+
default_kwargs = {}
|
199
|
+
method_list = [(plugin_method, plugin_kwargs), (default_method, default_kwargs)]
|
200
|
+
|
201
|
+
# Handle approximation degree as a special case for backwards compatibility, it's
|
202
|
+
# not part of the plugin interface and only something needed for the default
|
203
|
+
# pass.
|
204
|
+
# pylint: disable=attribute-defined-outside-init
|
205
|
+
default_method._approximation_degree = self._approximation_degree
|
206
|
+
if self.method == "default":
|
207
|
+
# pylint: disable=attribute-defined-outside-init
|
208
|
+
plugin_method._approximation_degree = self._approximation_degree
|
209
|
+
|
210
|
+
qubit_indices = (
|
211
|
+
{bit: i for i, bit in enumerate(dag.qubits)}
|
212
|
+
if plugin_method.supports_coupling_map or default_method.supports_coupling_map
|
213
|
+
else {}
|
214
|
+
)
|
215
|
+
|
216
|
+
if self.method == "default":
|
217
|
+
_coupling_edges = (
|
218
|
+
set(self._coupling_map.get_edges()) if self._coupling_map is not None else set()
|
219
|
+
)
|
220
|
+
out = run_main_loop(
|
221
|
+
dag,
|
222
|
+
list(qubit_indices.values()),
|
223
|
+
self._min_qubits,
|
224
|
+
self._target,
|
225
|
+
self._basis_gates,
|
226
|
+
self._synth_gates,
|
227
|
+
_coupling_edges,
|
228
|
+
self._approximation_degree,
|
229
|
+
self._natural_direction,
|
230
|
+
self._pulse_optimize,
|
231
|
+
)
|
232
|
+
return out
|
233
|
+
else:
|
234
|
+
for method, kwargs in method_list:
|
235
|
+
if method.supports_basis_gates:
|
236
|
+
kwargs["basis_gates"] = self._basis_gates
|
237
|
+
if method.supports_natural_direction:
|
238
|
+
kwargs["natural_direction"] = self._natural_direction
|
239
|
+
if method.supports_pulse_optimize:
|
240
|
+
kwargs["pulse_optimize"] = self._pulse_optimize
|
241
|
+
if method.supports_gate_lengths:
|
242
|
+
_gate_lengths = _gate_lengths or _build_gate_lengths(self._target)
|
243
|
+
kwargs["gate_lengths"] = _gate_lengths
|
244
|
+
if method.supports_gate_errors:
|
245
|
+
_gate_errors = _gate_errors or _build_gate_errors(self._target)
|
246
|
+
kwargs["gate_errors"] = _gate_errors
|
247
|
+
if method.supports_gate_lengths_by_qubit:
|
248
|
+
_gate_lengths_by_qubit = _gate_lengths_by_qubit or _build_gate_lengths_by_qubit(
|
249
|
+
self._target
|
250
|
+
)
|
251
|
+
kwargs["gate_lengths_by_qubit"] = _gate_lengths_by_qubit
|
252
|
+
if method.supports_gate_errors_by_qubit:
|
253
|
+
_gate_errors_by_qubit = _gate_errors_by_qubit or _build_gate_errors_by_qubit(
|
254
|
+
self._target
|
255
|
+
)
|
256
|
+
kwargs["gate_errors_by_qubit"] = _gate_errors_by_qubit
|
257
|
+
supported_bases = method.supported_bases
|
258
|
+
if supported_bases is not None:
|
259
|
+
kwargs["matched_basis"] = _choose_bases(self._basis_gates, supported_bases)
|
260
|
+
if method.supports_target:
|
261
|
+
kwargs["target"] = self._target
|
262
|
+
|
263
|
+
out = self._run_main_loop(
|
264
|
+
dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
|
265
|
+
)
|
266
|
+
return out
|
267
|
+
|
268
|
+
def _run_main_loop(
|
269
|
+
self, dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
|
270
|
+
):
|
271
|
+
"""Inner loop for the optimizer, after all DAG-independent set-up has been completed."""
|
272
|
+
for node in dag.op_nodes():
|
273
|
+
if node.name not in CONTROL_FLOW_OP_NAMES:
|
274
|
+
continue
|
275
|
+
new_op = node.op.replace_blocks(
|
276
|
+
[
|
277
|
+
dag_to_circuit(
|
278
|
+
self._run_main_loop(
|
279
|
+
circuit_to_dag(block),
|
280
|
+
{
|
281
|
+
inner: qubit_indices[outer]
|
282
|
+
for inner, outer in zip(block.qubits, node.qargs)
|
283
|
+
},
|
284
|
+
plugin_method,
|
285
|
+
plugin_kwargs,
|
286
|
+
default_method,
|
287
|
+
default_kwargs,
|
288
|
+
),
|
289
|
+
copy_operations=False,
|
290
|
+
)
|
291
|
+
for block in node.op.blocks
|
292
|
+
]
|
293
|
+
)
|
294
|
+
dag.substitute_node(node, new_op)
|
295
|
+
|
296
|
+
out_dag = dag.copy_empty_like()
|
297
|
+
for node in dag.topological_op_nodes():
|
298
|
+
if node.name in self._synth_gates and len(node.qargs) >= self._min_qubits:
|
299
|
+
synth_dag = None
|
300
|
+
unitary = node.matrix
|
301
|
+
n_qubits = len(node.qargs)
|
302
|
+
if (
|
303
|
+
plugin_method.max_qubits is not None and n_qubits > plugin_method.max_qubits
|
304
|
+
) or (plugin_method.min_qubits is not None and n_qubits < plugin_method.min_qubits):
|
305
|
+
method, kwargs = default_method, default_kwargs
|
306
|
+
else:
|
307
|
+
method, kwargs = plugin_method, plugin_kwargs
|
308
|
+
if method.supports_coupling_map:
|
309
|
+
kwargs["coupling_map"] = (
|
310
|
+
self._coupling_map,
|
311
|
+
[qubit_indices[x] for x in node.qargs],
|
312
|
+
)
|
313
|
+
synth_dag = method.run(unitary, **kwargs)
|
314
|
+
if synth_dag is None:
|
315
|
+
out_dag._apply_op_node_back(node)
|
316
|
+
continue
|
317
|
+
if isinstance(synth_dag, DAGCircuit):
|
318
|
+
qubit_map = dict(zip(synth_dag.qubits, node.qargs))
|
319
|
+
for node in synth_dag.topological_op_nodes():
|
320
|
+
node.qargs = tuple(qubit_map[x] for x in node.qargs)
|
321
|
+
out_dag._apply_op_node_back(node)
|
322
|
+
out_dag.global_phase += synth_dag.global_phase
|
323
|
+
else:
|
324
|
+
node_list, global_phase, gate = synth_dag
|
325
|
+
qubits = node.qargs
|
326
|
+
user_gate_node = DAGOpNode(gate)
|
327
|
+
for (
|
328
|
+
gate,
|
329
|
+
params,
|
330
|
+
qargs,
|
331
|
+
) in node_list:
|
332
|
+
if gate is None:
|
333
|
+
node = DAGOpNode.from_instruction(
|
334
|
+
user_gate_node._to_circuit_instruction().replace(
|
335
|
+
params=user_gate_node.params,
|
336
|
+
qubits=tuple(qubits[x] for x in qargs),
|
337
|
+
)
|
338
|
+
)
|
339
|
+
else:
|
340
|
+
node = DAGOpNode.from_instruction(
|
341
|
+
CircuitInstruction.from_standard(
|
342
|
+
gate, tuple(qubits[x] for x in qargs), params
|
343
|
+
)
|
344
|
+
)
|
345
|
+
out_dag._apply_op_node_back(node)
|
346
|
+
out_dag.global_phase += global_phase
|
347
|
+
else:
|
348
|
+
out_dag._apply_op_node_back(node)
|
349
|
+
return out_dag
|
350
|
+
|
351
|
+
|
352
|
+
def _build_gate_lengths(target=None):
|
353
|
+
"""Builds a ``gate_lengths`` dictionary from ``target`` (BackendV2).
|
354
|
+
|
355
|
+
The dictionary has the form:
|
356
|
+
{gate_name: {(qubits,): duration}}
|
357
|
+
"""
|
358
|
+
gate_lengths = {}
|
359
|
+
if target is not None:
|
360
|
+
for gate, prop_dict in target.items():
|
361
|
+
gate_lengths[gate] = {}
|
362
|
+
for qubit, gate_props in prop_dict.items():
|
363
|
+
if gate_props is not None and gate_props.duration is not None:
|
364
|
+
gate_lengths[gate][qubit] = gate_props.duration
|
365
|
+
return gate_lengths
|
366
|
+
|
367
|
+
|
368
|
+
def _build_gate_errors(target=None):
|
369
|
+
"""Builds a ``gate_error`` dictionary from ``target`` (BackendV2).
|
370
|
+
|
371
|
+
The dictionary has the form:
|
372
|
+
{gate_name: {(qubits,): error_rate}}
|
373
|
+
"""
|
374
|
+
gate_errors = {}
|
375
|
+
if target is not None:
|
376
|
+
for gate, prop_dict in target.items():
|
377
|
+
gate_errors[gate] = {}
|
378
|
+
for qubit, gate_props in prop_dict.items():
|
379
|
+
if gate_props is not None and gate_props.error is not None:
|
380
|
+
gate_errors[gate][qubit] = gate_props.error
|
381
|
+
return gate_errors
|
382
|
+
|
383
|
+
|
384
|
+
def _build_gate_lengths_by_qubit(target=None):
|
385
|
+
"""
|
386
|
+
Builds a `gate_lengths` dictionary from `target (BackendV2)`.
|
387
|
+
|
388
|
+
The dictionary has the form:
|
389
|
+
{(qubits): [Gate, duration]}
|
390
|
+
"""
|
391
|
+
gate_lengths = {}
|
392
|
+
if target is not None and target.qargs is not None:
|
393
|
+
for qubits in target.qargs:
|
394
|
+
names = target.operation_names_for_qargs(qubits)
|
395
|
+
operation_and_durations = []
|
396
|
+
for name in names:
|
397
|
+
operation = target.operation_from_name(name)
|
398
|
+
duration = getattr(target[name].get(qubits, None), "duration", None)
|
399
|
+
if duration:
|
400
|
+
operation_and_durations.append((operation, duration))
|
401
|
+
if operation_and_durations:
|
402
|
+
gate_lengths[qubits] = operation_and_durations
|
403
|
+
return gate_lengths
|
404
|
+
|
405
|
+
|
406
|
+
def _build_gate_errors_by_qubit(target=None):
|
407
|
+
"""
|
408
|
+
Builds a `gate_error` dictionary from `target (BackendV2)`.
|
409
|
+
|
410
|
+
The dictionary has the form:
|
411
|
+
{(qubits): [Gate, error]}
|
412
|
+
"""
|
413
|
+
gate_errors = {}
|
414
|
+
if target is not None and target.qargs is not None:
|
415
|
+
for qubits in target.qargs:
|
416
|
+
names = target.operation_names_for_qargs(qubits)
|
417
|
+
operation_and_errors = []
|
418
|
+
for name in names:
|
419
|
+
operation = target.operation_from_name(name)
|
420
|
+
error = getattr(target[name].get(qubits, None), "error", None)
|
421
|
+
if error:
|
422
|
+
operation_and_errors.append((operation, error))
|
423
|
+
if operation_and_errors:
|
424
|
+
gate_errors[qubits] = operation_and_errors
|
425
|
+
return gate_errors
|
@@ -0,0 +1,32 @@
|
|
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
|
+
"""Utility passes and functions used for other main passes."""
|
14
|
+
|
15
|
+
from .check_map import CheckMap
|
16
|
+
from .check_gate_direction import CheckGateDirection
|
17
|
+
from .gate_direction import GateDirection
|
18
|
+
from .barrier_before_final_measurements import BarrierBeforeFinalMeasurements
|
19
|
+
from .remove_final_measurements import RemoveFinalMeasurements
|
20
|
+
from .merge_adjacent_barriers import MergeAdjacentBarriers
|
21
|
+
from .dag_fixed_point import DAGFixedPoint
|
22
|
+
from .fixed_point import FixedPoint
|
23
|
+
from .error import Error
|
24
|
+
from .remove_barriers import RemoveBarriers
|
25
|
+
from .contains_instruction import ContainsInstruction
|
26
|
+
from .gates_basis import GatesInBasis
|
27
|
+
from .unroll_forloops import UnrollForLoops
|
28
|
+
from .minimum_point import MinimumPoint
|
29
|
+
from .filter_op_nodes import FilterOpNodes
|
30
|
+
|
31
|
+
# Utility functions
|
32
|
+
from . import control_flow
|
@@ -0,0 +1,41 @@
|
|
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
|
+
|
14
|
+
"""Add a barrier before final measurements."""
|
15
|
+
|
16
|
+
from qiskit._accelerate.barrier_before_final_measurement import barrier_before_final_measurements
|
17
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
18
|
+
from .merge_adjacent_barriers import MergeAdjacentBarriers
|
19
|
+
|
20
|
+
|
21
|
+
class BarrierBeforeFinalMeasurements(TransformationPass):
|
22
|
+
"""Add a barrier before final measurements.
|
23
|
+
|
24
|
+
This pass adds a barrier before the set of final measurements. Measurements
|
25
|
+
are considered final if they are followed by no other operations (aside from
|
26
|
+
other measurements or barriers.)
|
27
|
+
"""
|
28
|
+
|
29
|
+
def __init__(self, label=None):
|
30
|
+
super().__init__()
|
31
|
+
self.label = label
|
32
|
+
|
33
|
+
def run(self, dag):
|
34
|
+
"""Run the BarrierBeforeFinalMeasurements pass on `dag`."""
|
35
|
+
barrier_before_final_measurements(dag, self.label)
|
36
|
+
if self.label is None:
|
37
|
+
# Merge the new barrier into any other barriers
|
38
|
+
adjacent_pass = MergeAdjacentBarriers()
|
39
|
+
return adjacent_pass.run(dag)
|
40
|
+
else:
|
41
|
+
return dag
|
@@ -0,0 +1,60 @@
|
|
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 the gates follow the right direction with respect to the coupling map."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
16
|
+
from qiskit._accelerate.gate_direction import (
|
17
|
+
check_gate_direction_coupling,
|
18
|
+
check_gate_direction_target,
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
class CheckGateDirection(AnalysisPass):
|
23
|
+
"""Check if the two-qubit gates follow the right direction with
|
24
|
+
respect to the coupling map.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, coupling_map, target=None):
|
28
|
+
"""CheckGateDirection initializer.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
coupling_map (CouplingMap): Directed graph representing a coupling map.
|
32
|
+
target (Target): The backend target to use for this pass. If this is specified
|
33
|
+
it will be used instead of the coupling map
|
34
|
+
"""
|
35
|
+
super().__init__()
|
36
|
+
self.coupling_map = coupling_map
|
37
|
+
self.target = target
|
38
|
+
|
39
|
+
def run(self, dag):
|
40
|
+
"""Run the CheckGateDirection pass on `dag`.
|
41
|
+
|
42
|
+
If `dag` is mapped and the direction is correct the property
|
43
|
+
`is_direction_mapped` is set to True (or to False otherwise).
|
44
|
+
|
45
|
+
Args:
|
46
|
+
dag (DAGCircuit): DAG to check.
|
47
|
+
"""
|
48
|
+
# Only use "check_gate_direction_target" if a target exists and target.operation_names
|
49
|
+
# is not empty, else use "check_gate_direction_coupling".
|
50
|
+
if self.target is None:
|
51
|
+
self.property_set["is_direction_mapped"] = check_gate_direction_coupling(
|
52
|
+
dag, set(self.coupling_map.get_edges())
|
53
|
+
)
|
54
|
+
elif len(self.target.operation_names) == 0:
|
55
|
+
# A _FakeTarget path, no basis gates, just use the coupling map
|
56
|
+
self.property_set["is_direction_mapped"] = check_gate_direction_coupling(
|
57
|
+
dag, set(self.target.build_coupling_map().get_edges())
|
58
|
+
)
|
59
|
+
else:
|
60
|
+
self.property_set["is_direction_mapped"] = check_gate_direction_target(dag, self.target)
|
@@ -0,0 +1,78 @@
|
|
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 DAG circuit is already mapped to a coupling map."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
16
|
+
from qiskit.transpiler.target import Target
|
17
|
+
|
18
|
+
from qiskit._accelerate import check_map
|
19
|
+
|
20
|
+
|
21
|
+
class CheckMap(AnalysisPass):
|
22
|
+
"""Check if a DAG circuit is already mapped to a coupling map.
|
23
|
+
|
24
|
+
Check if a DAGCircuit is mapped to ``coupling_map`` by checking that all
|
25
|
+
2-qubit interactions are laid out to be on adjacent qubits in the global coupling
|
26
|
+
map of the device, setting the property set field (either specified with ``property_set_field``
|
27
|
+
or the default ``is_swap_mapped``) to ``True`` or ``False`` accordingly. Note this does not
|
28
|
+
validate directionality of the connectivity between qubits. If you need to check gates are
|
29
|
+
implemented in a native direction for a target use the :class:`~.CheckGateDirection` pass
|
30
|
+
instead.
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __init__(self, coupling_map, property_set_field=None):
|
34
|
+
"""CheckMap initializer.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
coupling_map (Union[CouplingMap, Target]): Directed graph representing a coupling map.
|
38
|
+
property_set_field (str): An optional string to specify the property set field to
|
39
|
+
store the result of the check. If not default the result is stored in
|
40
|
+
``"is_swap_mapped"``.
|
41
|
+
"""
|
42
|
+
super().__init__()
|
43
|
+
if property_set_field is None:
|
44
|
+
self.property_set_field = "is_swap_mapped"
|
45
|
+
else:
|
46
|
+
self.property_set_field = property_set_field
|
47
|
+
if isinstance(coupling_map, Target):
|
48
|
+
cmap = coupling_map.build_coupling_map()
|
49
|
+
else:
|
50
|
+
cmap = coupling_map
|
51
|
+
if cmap is None:
|
52
|
+
self.qargs = None
|
53
|
+
else:
|
54
|
+
self.qargs = set()
|
55
|
+
for edge in cmap.get_edges():
|
56
|
+
self.qargs.add(edge)
|
57
|
+
self.qargs.add((edge[1], edge[0]))
|
58
|
+
|
59
|
+
def run(self, dag):
|
60
|
+
"""Run the CheckMap pass on `dag`.
|
61
|
+
|
62
|
+
If `dag` is mapped to `coupling_map`, the property
|
63
|
+
`is_swap_mapped` is set to True (or to False otherwise).
|
64
|
+
|
65
|
+
Args:
|
66
|
+
dag (DAGCircuit): DAG to map.
|
67
|
+
"""
|
68
|
+
if not self.qargs:
|
69
|
+
self.property_set[self.property_set_field] = True
|
70
|
+
return
|
71
|
+
res = check_map.check_map(dag, self.qargs)
|
72
|
+
if res is None:
|
73
|
+
self.property_set[self.property_set_field] = True
|
74
|
+
return
|
75
|
+
self.property_set[self.property_set_field] = False
|
76
|
+
self.property_set["check_map_msg"] = (
|
77
|
+
f"{res[0]}({dag.qubits[res[1][0]]}, {dag.qubits[res[1][1]]}) failed"
|
78
|
+
)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Check if a property reached a fixed point."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
16
|
+
|
17
|
+
|
18
|
+
class ContainsInstruction(AnalysisPass):
|
19
|
+
"""An analysis pass to detect if the DAG contains a specific instruction.
|
20
|
+
|
21
|
+
This pass takes in a single instruction name for example ``'delay'`` and
|
22
|
+
will set the property set ``contains_delay`` to ``True`` if the DAG contains
|
23
|
+
that instruction and ``False`` if it does not.
|
24
|
+
"""
|
25
|
+
|
26
|
+
def __init__(self, instruction_name, recurse: bool = True):
|
27
|
+
"""ContainsInstruction initializer.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
instruction_name (str | Iterable[str]): The instruction or instructions to check are in
|
31
|
+
the DAG. The output in the property set is set to ``contains_`` prefixed on each
|
32
|
+
value for this parameter.
|
33
|
+
recurse (bool): if ``True`` (default), then recurse into control-flow operations.
|
34
|
+
"""
|
35
|
+
super().__init__()
|
36
|
+
self._instruction_names = (
|
37
|
+
{instruction_name} if isinstance(instruction_name, str) else set(instruction_name)
|
38
|
+
)
|
39
|
+
self._recurse = recurse
|
40
|
+
|
41
|
+
def run(self, dag):
|
42
|
+
"""Run the ContainsInstruction pass on dag."""
|
43
|
+
names = dag.count_ops(recurse=self._recurse)
|
44
|
+
for name in self._instruction_names:
|
45
|
+
self.property_set[f"contains_{name}"] = name in names
|