qiskit 2.0.3__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 +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -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 +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -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 +163 -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 +157 -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 +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -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 +316 -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 +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -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 +198 -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 +217 -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 +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -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 +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -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 +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -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 +193 -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 +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -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 +188 -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 +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -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 +81 -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 +374 -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 +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -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 +28 -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 +23 -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 +558 -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 +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -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/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_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 +639 -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 +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -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 +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -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 +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -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 +1963 -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 +313 -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 +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -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 +354 -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 +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -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_visualization.py +318 -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/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.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,229 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Tools for working with the partial ordering of the type system."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
__all__ = [
|
18
|
+
"Ordering",
|
19
|
+
"is_subtype",
|
20
|
+
"is_supertype",
|
21
|
+
"order",
|
22
|
+
"greater",
|
23
|
+
"CastKind",
|
24
|
+
"cast_kind",
|
25
|
+
]
|
26
|
+
|
27
|
+
import enum
|
28
|
+
|
29
|
+
from .types import Type, Bool, Duration, Float, Uint
|
30
|
+
|
31
|
+
|
32
|
+
# While the type system is simple, it's overkill to represent the complete partial ordering graph of
|
33
|
+
# the set of types in an explicit graph form. The strategy here is to assume that two types have no
|
34
|
+
# ordering between them, and an ordering is defined by putting a function `Type * Type -> Ordering`
|
35
|
+
# into the `_ORDERERS`.
|
36
|
+
|
37
|
+
|
38
|
+
class Ordering(enum.Enum):
|
39
|
+
"""Enumeration listing the possible relations between two types. Types only have a partial
|
40
|
+
ordering, so it's possible for two types to have no sub-typing relationship.
|
41
|
+
|
42
|
+
Note that the sub-/supertyping relationship is not the same as whether a type can be explicitly
|
43
|
+
cast from one to another."""
|
44
|
+
|
45
|
+
LESS = enum.auto()
|
46
|
+
"""The left type is a strict subtype of the right type."""
|
47
|
+
EQUAL = enum.auto()
|
48
|
+
"""The two types are equal."""
|
49
|
+
GREATER = enum.auto()
|
50
|
+
"""The left type is a strict supertype of the right type."""
|
51
|
+
NONE = enum.auto()
|
52
|
+
"""There is no typing relationship between the two types."""
|
53
|
+
|
54
|
+
def __repr__(self):
|
55
|
+
return str(self)
|
56
|
+
|
57
|
+
|
58
|
+
def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
|
59
|
+
if left.width < right.width:
|
60
|
+
return Ordering.LESS
|
61
|
+
if left.width == right.width:
|
62
|
+
return Ordering.EQUAL
|
63
|
+
return Ordering.GREATER
|
64
|
+
|
65
|
+
|
66
|
+
_ORDERERS = {
|
67
|
+
(Bool, Bool): lambda _a, _b, /: Ordering.EQUAL,
|
68
|
+
(Uint, Uint): _order_uint_uint,
|
69
|
+
(Float, Float): lambda _a, _b, /: Ordering.EQUAL,
|
70
|
+
(Duration, Duration): lambda _a, _b, /: Ordering.EQUAL,
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
def order(left: Type, right: Type, /) -> Ordering:
|
75
|
+
"""Get the ordering relationship between the two types as an enumeration value.
|
76
|
+
|
77
|
+
Examples:
|
78
|
+
Compare two :class:`Uint` types of different widths::
|
79
|
+
|
80
|
+
>>> from qiskit.circuit.classical import types
|
81
|
+
>>> types.order(types.Uint(8), types.Uint(16))
|
82
|
+
Ordering.LESS
|
83
|
+
|
84
|
+
Compare two types that have no ordering between them::
|
85
|
+
|
86
|
+
>>> types.order(types.Uint(8), types.Bool())
|
87
|
+
Ordering.NONE
|
88
|
+
"""
|
89
|
+
if (orderer := _ORDERERS.get((left.kind, right.kind))) is None:
|
90
|
+
return Ordering.NONE
|
91
|
+
return orderer(left, right)
|
92
|
+
|
93
|
+
|
94
|
+
def is_subtype(left: Type, right: Type, /, strict: bool = False) -> bool:
|
95
|
+
r"""Does the relation :math:`\text{left} \le \text{right}` hold? If there is no ordering
|
96
|
+
relation between the two types, then this returns ``False``. If ``strict``, then the equality
|
97
|
+
is also forbidden.
|
98
|
+
|
99
|
+
Examples:
|
100
|
+
Check if one type is a subclass of another::
|
101
|
+
|
102
|
+
>>> from qiskit.circuit.classical import types
|
103
|
+
>>> types.is_subtype(types.Uint(8), types.Uint(16))
|
104
|
+
True
|
105
|
+
|
106
|
+
Check if one type is a strict subclass of another::
|
107
|
+
|
108
|
+
>>> types.is_subtype(types.Bool(), types.Bool())
|
109
|
+
True
|
110
|
+
>>> types.is_subtype(types.Bool(), types.Bool(), strict=True)
|
111
|
+
False
|
112
|
+
"""
|
113
|
+
order_ = order(left, right)
|
114
|
+
return order_ is Ordering.LESS or (not strict and order_ is Ordering.EQUAL)
|
115
|
+
|
116
|
+
|
117
|
+
def is_supertype(left: Type, right: Type, /, strict: bool = False) -> bool:
|
118
|
+
r"""Does the relation :math:`\text{left} \ge \text{right}` hold? If there is no ordering
|
119
|
+
relation between the two types, then this returns ``False``. If ``strict``, then the equality
|
120
|
+
is also forbidden.
|
121
|
+
|
122
|
+
Examples:
|
123
|
+
Check if one type is a superclass of another::
|
124
|
+
|
125
|
+
>>> from qiskit.circuit.classical import types
|
126
|
+
>>> types.is_supertype(types.Uint(8), types.Uint(16))
|
127
|
+
False
|
128
|
+
|
129
|
+
Check if one type is a strict superclass of another::
|
130
|
+
|
131
|
+
>>> types.is_supertype(types.Bool(), types.Bool())
|
132
|
+
True
|
133
|
+
>>> types.is_supertype(types.Bool(), types.Bool(), strict=True)
|
134
|
+
False
|
135
|
+
"""
|
136
|
+
order_ = order(left, right)
|
137
|
+
return order_ is Ordering.GREATER or (not strict and order_ is Ordering.EQUAL)
|
138
|
+
|
139
|
+
|
140
|
+
def greater(left: Type, right: Type, /) -> Type:
|
141
|
+
"""Get the greater of the two types, assuming that there is an ordering relation between them.
|
142
|
+
Technically, this is a slightly restricted version of the concept of the 'meet' of the two
|
143
|
+
types in that the return value must be one of the inputs. In practice in the type system there
|
144
|
+
is no concept of a 'sum' type, so the 'meet' exists if and only if there is an ordering between
|
145
|
+
the two types, and is equal to the greater of the two types.
|
146
|
+
|
147
|
+
Returns:
|
148
|
+
The greater of the two types.
|
149
|
+
|
150
|
+
Raises:
|
151
|
+
TypeError: if there is no ordering relation between the two types.
|
152
|
+
|
153
|
+
Examples:
|
154
|
+
Find the greater of two :class:`Uint` types::
|
155
|
+
|
156
|
+
>>> from qiskit.circuit.classical import types
|
157
|
+
>>> types.greater(types.Uint(8), types.Uint(16))
|
158
|
+
types.Uint(16)
|
159
|
+
"""
|
160
|
+
order_ = order(left, right)
|
161
|
+
if order_ is Ordering.NONE:
|
162
|
+
raise TypeError(f"no ordering exists between '{left}' and '{right}'")
|
163
|
+
return left if order_ is Ordering.GREATER else right
|
164
|
+
|
165
|
+
|
166
|
+
class CastKind(enum.Enum):
|
167
|
+
"""A return value indicating the type of cast that can occur from one type to another."""
|
168
|
+
|
169
|
+
EQUAL = enum.auto()
|
170
|
+
"""The two types are equal; no cast node is required at all."""
|
171
|
+
IMPLICIT = enum.auto()
|
172
|
+
"""The 'from' type can be cast to the 'to' type implicitly. A :class:`~.expr.Cast` node with
|
173
|
+
``implicit==True`` is the minimum required to specify this."""
|
174
|
+
LOSSLESS = enum.auto()
|
175
|
+
"""The 'from' type can be cast to the 'to' type explicitly, and the cast will be lossless. This
|
176
|
+
requires a :class:`~.expr.Cast`` node with ``implicit=False``, but there's no danger from
|
177
|
+
inserting one."""
|
178
|
+
DANGEROUS = enum.auto()
|
179
|
+
"""The 'from' type has a defined cast to the 'to' type, but depending on the value, it may lose
|
180
|
+
data. A user would need to manually specify casts."""
|
181
|
+
NONE = enum.auto()
|
182
|
+
"""There is no casting permitted from the 'from' type to the 'to' type."""
|
183
|
+
|
184
|
+
|
185
|
+
def _uint_cast(from_: Uint, to_: Uint, /) -> CastKind:
|
186
|
+
if from_.width == to_.width:
|
187
|
+
return CastKind.EQUAL
|
188
|
+
if from_.width < to_.width:
|
189
|
+
return CastKind.LOSSLESS
|
190
|
+
return CastKind.DANGEROUS
|
191
|
+
|
192
|
+
|
193
|
+
_ALLOWED_CASTS = {
|
194
|
+
(Bool, Bool): lambda _a, _b, /: CastKind.EQUAL,
|
195
|
+
(Bool, Uint): lambda _a, _b, /: CastKind.LOSSLESS,
|
196
|
+
(Bool, Float): lambda _a, _b, /: CastKind.LOSSLESS,
|
197
|
+
(Uint, Bool): lambda _a, _b, /: CastKind.IMPLICIT,
|
198
|
+
(Uint, Uint): _uint_cast,
|
199
|
+
(Uint, Float): lambda _a, _b, /: CastKind.DANGEROUS,
|
200
|
+
(Float, Float): lambda _a, _b, /: CastKind.EQUAL,
|
201
|
+
(Float, Uint): lambda _a, _b, /: CastKind.DANGEROUS,
|
202
|
+
(Float, Bool): lambda _a, _b, /: CastKind.DANGEROUS,
|
203
|
+
(Duration, Duration): lambda _a, _b, /: CastKind.EQUAL,
|
204
|
+
}
|
205
|
+
|
206
|
+
|
207
|
+
def cast_kind(from_: Type, to_: Type, /) -> CastKind:
|
208
|
+
"""Determine the sort of cast that is required to move from the left type to the right type.
|
209
|
+
|
210
|
+
Examples:
|
211
|
+
|
212
|
+
.. plot::
|
213
|
+
:include-source:
|
214
|
+
:nofigs:
|
215
|
+
|
216
|
+
|
217
|
+
>>> from qiskit.circuit.classical import types
|
218
|
+
>>> types.cast_kind(types.Bool(), types.Bool())
|
219
|
+
<CastKind.EQUAL: 1>
|
220
|
+
>>> types.cast_kind(types.Uint(8), types.Bool())
|
221
|
+
<CastKind.IMPLICIT: 2>
|
222
|
+
>>> types.cast_kind(types.Bool(), types.Uint(8))
|
223
|
+
<CastKind.LOSSLESS: 3>
|
224
|
+
>>> types.cast_kind(types.Uint(16), types.Uint(8))
|
225
|
+
<CastKind.DANGEROUS: 4>
|
226
|
+
"""
|
227
|
+
if (coercer := _ALLOWED_CASTS.get((from_.kind, to_.kind))) is None:
|
228
|
+
return CastKind.NONE
|
229
|
+
return coercer(from_, to_)
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Type-system definition for the expression tree."""
|
14
|
+
|
15
|
+
# Given the nature of the tree representation and that there are helper functions associated with
|
16
|
+
# many of the classes whose arguments naturally share names with themselves, it's inconvenient to
|
17
|
+
# use synonyms everywhere. This goes for the builtin 'type' as well.
|
18
|
+
# pylint: disable=redefined-builtin,redefined-outer-name
|
19
|
+
|
20
|
+
from __future__ import annotations
|
21
|
+
|
22
|
+
__all__ = [
|
23
|
+
"Type",
|
24
|
+
"Bool",
|
25
|
+
"Duration",
|
26
|
+
"Float",
|
27
|
+
"Uint",
|
28
|
+
]
|
29
|
+
|
30
|
+
import typing
|
31
|
+
|
32
|
+
|
33
|
+
class _Singleton(type):
|
34
|
+
"""Metaclass to make the child, which should take zero initialization arguments, a singleton
|
35
|
+
object."""
|
36
|
+
|
37
|
+
def _get_singleton_instance(cls):
|
38
|
+
return cls._INSTANCE
|
39
|
+
|
40
|
+
@classmethod
|
41
|
+
def __prepare__(mcs, name, bases): # pylint: disable=unused-argument
|
42
|
+
return {"__new__": mcs._get_singleton_instance}
|
43
|
+
|
44
|
+
@staticmethod
|
45
|
+
def __new__(cls, name, bases, namespace):
|
46
|
+
out = super().__new__(cls, name, bases, namespace)
|
47
|
+
out._INSTANCE = object.__new__(out) # pylint: disable=invalid-name
|
48
|
+
return out
|
49
|
+
|
50
|
+
|
51
|
+
class Type:
|
52
|
+
"""Root base class of all nodes in the type tree. The base case should never be instantiated
|
53
|
+
directly.
|
54
|
+
|
55
|
+
This must not be subclassed by users; subclasses form the internal data of the representation of
|
56
|
+
expressions, and it does not make sense to add more outside of Qiskit library code."""
|
57
|
+
|
58
|
+
__slots__ = ()
|
59
|
+
|
60
|
+
@property
|
61
|
+
def kind(self):
|
62
|
+
"""Get the kind of this type. This is exactly equal to the Python type object that defines
|
63
|
+
this type, that is ``t.kind is type(t)``, but is exposed like this to make it clear that
|
64
|
+
this a hashable enum-like discriminator you can rely on."""
|
65
|
+
return self.__class__
|
66
|
+
|
67
|
+
# Enforcement of immutability. The constructor methods need to manually skip this.
|
68
|
+
|
69
|
+
def __setattr__(self, _key, _value):
|
70
|
+
raise AttributeError(f"'{self.kind.__name__}' instances are immutable")
|
71
|
+
|
72
|
+
def __copy__(self):
|
73
|
+
return self
|
74
|
+
|
75
|
+
def __deepcopy__(self, _memo):
|
76
|
+
return self
|
77
|
+
|
78
|
+
def __setstate__(self, state):
|
79
|
+
_dict, slots = state
|
80
|
+
for slot, value in slots.items():
|
81
|
+
# We need to overcome the type's enforcement of immutability post initialization.
|
82
|
+
super().__setattr__(slot, value)
|
83
|
+
|
84
|
+
|
85
|
+
@typing.final
|
86
|
+
class Bool(Type, metaclass=_Singleton):
|
87
|
+
"""The Boolean type. This has exactly two values: ``True`` and ``False``."""
|
88
|
+
|
89
|
+
__slots__ = ()
|
90
|
+
|
91
|
+
def __repr__(self):
|
92
|
+
return "Bool()"
|
93
|
+
|
94
|
+
def __hash__(self):
|
95
|
+
return hash(self.__class__)
|
96
|
+
|
97
|
+
def __eq__(self, other):
|
98
|
+
return isinstance(other, Bool)
|
99
|
+
|
100
|
+
|
101
|
+
@typing.final
|
102
|
+
class Uint(Type):
|
103
|
+
"""An unsigned integer of fixed bit width."""
|
104
|
+
|
105
|
+
__slots__ = ("width",)
|
106
|
+
|
107
|
+
def __init__(self, width: int):
|
108
|
+
if isinstance(width, int) and width <= 0:
|
109
|
+
raise ValueError("uint width must be greater than zero")
|
110
|
+
super(Type, self).__setattr__("width", width)
|
111
|
+
|
112
|
+
def __repr__(self):
|
113
|
+
return f"Uint({self.width})"
|
114
|
+
|
115
|
+
def __hash__(self):
|
116
|
+
return hash((self.__class__, self.width))
|
117
|
+
|
118
|
+
def __eq__(self, other):
|
119
|
+
return isinstance(other, Uint) and self.width == other.width
|
120
|
+
|
121
|
+
|
122
|
+
@typing.final
|
123
|
+
class Float(Type, metaclass=_Singleton):
|
124
|
+
"""An IEEE-754 double-precision floating point number.
|
125
|
+
In the future, this may also be used to represent other fixed-width floats.
|
126
|
+
"""
|
127
|
+
|
128
|
+
__slots__ = ()
|
129
|
+
|
130
|
+
def __repr__(self):
|
131
|
+
return "Float()"
|
132
|
+
|
133
|
+
def __hash__(self):
|
134
|
+
return hash(self.__class__)
|
135
|
+
|
136
|
+
def __eq__(self, other):
|
137
|
+
return isinstance(other, Float)
|
138
|
+
|
139
|
+
|
140
|
+
@typing.final
|
141
|
+
class Duration(Type, metaclass=_Singleton):
|
142
|
+
"""A length of time, possibly negative."""
|
143
|
+
|
144
|
+
__slots__ = ()
|
145
|
+
|
146
|
+
def __repr__(self):
|
147
|
+
return "Duration()"
|
148
|
+
|
149
|
+
def __hash__(self):
|
150
|
+
return hash(self.__class__)
|
151
|
+
|
152
|
+
def __eq__(self, other):
|
153
|
+
return isinstance(other, Duration)
|
@@ -0,0 +1,133 @@
|
|
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
|
+
"""Code from commutative_analysis pass that checks commutation relations between DAG nodes."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import List, Union, Set, Optional
|
17
|
+
|
18
|
+
from qiskit.circuit.operation import Operation
|
19
|
+
from qiskit._accelerate.commutation_checker import CommutationChecker as RustChecker
|
20
|
+
|
21
|
+
|
22
|
+
class CommutationChecker:
|
23
|
+
r"""Check commutations of two operations.
|
24
|
+
|
25
|
+
Two unitaries :math:`A` and :math:`B` on :math:`n` qubits commute if
|
26
|
+
|
27
|
+
.. math::
|
28
|
+
|
29
|
+
\frac{2^n F_{\text{process}}(AB, BA) + 1}{2^n + 1} > 1 - \varepsilon,
|
30
|
+
|
31
|
+
where
|
32
|
+
|
33
|
+
.. math::
|
34
|
+
|
35
|
+
F_{\text{process}}(U_1, U_2) = \left|\frac{\mathrm{Tr}(U_1 U_2^\dagger)}{2^n} \right|^2,
|
36
|
+
|
37
|
+
and we set :math:`\varepsilon` to :math:`10^{-12}` to account for round-off errors on
|
38
|
+
few-qubit systems. This metric is chosen for consistency with other closeness checks in
|
39
|
+
Qiskit.
|
40
|
+
|
41
|
+
When possible, commutation relations are queried from a lookup table. This is the case
|
42
|
+
for standard gates without parameters (such as :class:`.XGate` or :class:`.HGate`) or
|
43
|
+
gates with free parameters (such as :class:`.RXGate` with a :class:`.ParameterExpression` as
|
44
|
+
angle). Otherwise, a matrix-based check is performed, where two operations are said to
|
45
|
+
commute, if the average gate fidelity of performing the commutation is above a certain threshold
|
46
|
+
(see ``approximation_degree``). The result of this commutation is then added to the
|
47
|
+
cached lookup table.
|
48
|
+
"""
|
49
|
+
|
50
|
+
def __init__(
|
51
|
+
self,
|
52
|
+
standard_gate_commutations: dict = None,
|
53
|
+
cache_max_entries: int = 10**6,
|
54
|
+
*,
|
55
|
+
gates: Optional[Set[str]] = None,
|
56
|
+
):
|
57
|
+
self.cc = RustChecker(standard_gate_commutations, cache_max_entries, gates)
|
58
|
+
|
59
|
+
def commute_nodes(
|
60
|
+
self,
|
61
|
+
op1,
|
62
|
+
op2,
|
63
|
+
max_num_qubits: int = 3,
|
64
|
+
approximation_degree: float = 1.0,
|
65
|
+
) -> bool:
|
66
|
+
"""Checks if two DAGOpNodes commute."""
|
67
|
+
return self.cc.commute_nodes(op1, op2, max_num_qubits, approximation_degree)
|
68
|
+
|
69
|
+
def commute(
|
70
|
+
self,
|
71
|
+
op1: Operation,
|
72
|
+
qargs1: List,
|
73
|
+
cargs1: List,
|
74
|
+
op2: Operation,
|
75
|
+
qargs2: List,
|
76
|
+
cargs2: List,
|
77
|
+
max_num_qubits: int = 3,
|
78
|
+
approximation_degree: float = 1.0,
|
79
|
+
) -> bool:
|
80
|
+
"""
|
81
|
+
Checks if two Operations commute. The return value of `True` means that the operations
|
82
|
+
truly commute, and the return value of `False` means that either the operations do not
|
83
|
+
commute or that the commutation check was skipped (for example, when the operations
|
84
|
+
have conditions or have too many qubits).
|
85
|
+
|
86
|
+
Args:
|
87
|
+
op1: first operation.
|
88
|
+
qargs1: first operation's qubits.
|
89
|
+
cargs1: first operation's clbits.
|
90
|
+
op2: second operation.
|
91
|
+
qargs2: second operation's qubits.
|
92
|
+
cargs2: second operation's clbits.
|
93
|
+
max_num_qubits: the maximum number of qubits to consider, the check may be skipped if
|
94
|
+
the number of qubits for either operation exceeds this amount.
|
95
|
+
approximation_degree: If the average gate fidelity in between the two operations
|
96
|
+
is above this number (up to ``1e-12``) they are assumed to commute.
|
97
|
+
|
98
|
+
Returns:
|
99
|
+
bool: whether two operations commute.
|
100
|
+
"""
|
101
|
+
return self.cc.commute(
|
102
|
+
op1, qargs1, cargs1, op2, qargs2, cargs2, max_num_qubits, approximation_degree
|
103
|
+
)
|
104
|
+
|
105
|
+
def num_cached_entries(self):
|
106
|
+
"""Returns number of cached entries"""
|
107
|
+
return self.cc.num_cached_entries()
|
108
|
+
|
109
|
+
def clear_cached_commutations(self):
|
110
|
+
"""Clears the dictionary holding cached commutations"""
|
111
|
+
self.cc.clear_cached_commutations()
|
112
|
+
|
113
|
+
def check_commutation_entries(
|
114
|
+
self,
|
115
|
+
first_op: Operation,
|
116
|
+
first_qargs: List,
|
117
|
+
second_op: Operation,
|
118
|
+
second_qargs: List,
|
119
|
+
) -> Union[bool, None]:
|
120
|
+
"""Returns stored commutation relation if any
|
121
|
+
|
122
|
+
Args:
|
123
|
+
first_op: first operation.
|
124
|
+
first_qargs: first operation's qubits.
|
125
|
+
second_op: second operation.
|
126
|
+
second_qargs: second operation's qubits.
|
127
|
+
|
128
|
+
Return:
|
129
|
+
bool: True if the gates commute and false if it is not the case.
|
130
|
+
"""
|
131
|
+
return self.cc.library.check_commutation_entries(
|
132
|
+
first_op, first_qargs, second_op, second_qargs
|
133
|
+
)
|
@@ -0,0 +1,20 @@
|
|
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
|
+
"""Provides a commutation checker that caches the determined commutation results during this session """
|
14
|
+
|
15
|
+
from qiskit.circuit import CommutationChecker
|
16
|
+
|
17
|
+
from qiskit.circuit._standard_gates_commutations import standard_gates_commutations
|
18
|
+
|
19
|
+
StandardGateCommutations = standard_gates_commutations
|
20
|
+
SessionCommutationChecker = CommutationChecker(StandardGateCommutations)
|
@@ -0,0 +1,59 @@
|
|
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
|
+
"""Instruction sub-classes for dynamic circuits."""
|
14
|
+
|
15
|
+
|
16
|
+
from ._builder_utils import condition_resources, node_resources, LegacyResources
|
17
|
+
from .control_flow import ControlFlowOp
|
18
|
+
from .continue_loop import ContinueLoopOp
|
19
|
+
from .break_loop import BreakLoopOp
|
20
|
+
|
21
|
+
from .box import BoxOp
|
22
|
+
from .if_else import IfElseOp
|
23
|
+
from .while_loop import WhileLoopOp
|
24
|
+
from .for_loop import ForLoopOp
|
25
|
+
from .switch_case import SwitchCaseOp, CASE_DEFAULT
|
26
|
+
|
27
|
+
|
28
|
+
CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case", "box"))
|
29
|
+
"""Set of the instruction names of Qiskit's known control-flow operations."""
|
30
|
+
|
31
|
+
|
32
|
+
def get_control_flow_name_mapping():
|
33
|
+
"""Return a dictionary mapping the names of control-flow operations
|
34
|
+
to their corresponding classes."
|
35
|
+
|
36
|
+
Examples:
|
37
|
+
|
38
|
+
.. code-block:: python
|
39
|
+
|
40
|
+
from qiskit.circuit import get_control_flow_name_mapping
|
41
|
+
|
42
|
+
ctrl_flow_name_map = get_control_flow_name_mapping()
|
43
|
+
if_else_object = ctrl_flow_name_map["if_else"]
|
44
|
+
|
45
|
+
print(if_else_object)
|
46
|
+
|
47
|
+
.. code-block:: text
|
48
|
+
|
49
|
+
<class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
|
50
|
+
"""
|
51
|
+
|
52
|
+
name_mapping = {
|
53
|
+
"if_else": IfElseOp,
|
54
|
+
"while_loop": WhileLoopOp,
|
55
|
+
"for_loop": ForLoopOp,
|
56
|
+
"switch_case": SwitchCaseOp,
|
57
|
+
"box": BoxOp,
|
58
|
+
}
|
59
|
+
return name_mapping
|