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,375 @@
|
|
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
|
+
"""Expression visitors."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
__all__ = [
|
18
|
+
"ExprVisitor",
|
19
|
+
"iter_vars",
|
20
|
+
"iter_identifiers",
|
21
|
+
"structurally_equivalent",
|
22
|
+
"is_lvalue",
|
23
|
+
]
|
24
|
+
|
25
|
+
import typing
|
26
|
+
|
27
|
+
from . import expr
|
28
|
+
|
29
|
+
_T_co = typing.TypeVar("_T_co", covariant=True)
|
30
|
+
|
31
|
+
|
32
|
+
class ExprVisitor(typing.Generic[_T_co]):
|
33
|
+
"""Base class for visitors to the :class:`Expr` tree. Subclasses should override whichever of
|
34
|
+
the ``visit_*`` methods that they are able to handle, and should be organized such that
|
35
|
+
non-existent methods will never be called."""
|
36
|
+
|
37
|
+
# The method names are self-explanatory and docstrings would just be noise.
|
38
|
+
# pylint: disable=missing-function-docstring
|
39
|
+
|
40
|
+
__slots__ = ()
|
41
|
+
|
42
|
+
def visit_generic(self, node: expr.Expr, /) -> _T_co: # pragma: no cover
|
43
|
+
raise RuntimeError(f"expression visitor {self} has no method to handle expr {node}")
|
44
|
+
|
45
|
+
def visit_var(self, node: expr.Var, /) -> _T_co: # pragma: no cover
|
46
|
+
return self.visit_generic(node)
|
47
|
+
|
48
|
+
def visit_stretch(self, node: expr.Stretch, /) -> _T_co: # pragma: no cover
|
49
|
+
return self.visit_generic(node)
|
50
|
+
|
51
|
+
def visit_value(self, node: expr.Value, /) -> _T_co: # pragma: no cover
|
52
|
+
return self.visit_generic(node)
|
53
|
+
|
54
|
+
def visit_unary(self, node: expr.Unary, /) -> _T_co: # pragma: no cover
|
55
|
+
return self.visit_generic(node)
|
56
|
+
|
57
|
+
def visit_binary(self, node: expr.Binary, /) -> _T_co: # pragma: no cover
|
58
|
+
return self.visit_generic(node)
|
59
|
+
|
60
|
+
def visit_cast(self, node: expr.Cast, /) -> _T_co: # pragma: no cover
|
61
|
+
return self.visit_generic(node)
|
62
|
+
|
63
|
+
def visit_index(self, node: expr.Index, /) -> _T_co: # pragma: no cover
|
64
|
+
return self.visit_generic(node)
|
65
|
+
|
66
|
+
|
67
|
+
class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
|
68
|
+
__slots__ = ()
|
69
|
+
|
70
|
+
def visit_var(self, node, /):
|
71
|
+
yield node
|
72
|
+
|
73
|
+
def visit_stretch(self, node, /):
|
74
|
+
yield from ()
|
75
|
+
|
76
|
+
def visit_value(self, node, /):
|
77
|
+
yield from ()
|
78
|
+
|
79
|
+
def visit_unary(self, node, /):
|
80
|
+
yield from node.operand.accept(self)
|
81
|
+
|
82
|
+
def visit_binary(self, node, /):
|
83
|
+
yield from node.left.accept(self)
|
84
|
+
yield from node.right.accept(self)
|
85
|
+
|
86
|
+
def visit_cast(self, node, /):
|
87
|
+
yield from node.operand.accept(self)
|
88
|
+
|
89
|
+
def visit_index(self, node, /):
|
90
|
+
yield from node.target.accept(self)
|
91
|
+
yield from node.index.accept(self)
|
92
|
+
|
93
|
+
|
94
|
+
class _IdentWalkerImpl(ExprVisitor[typing.Iterable[typing.Union[expr.Var, expr.Stretch]]]):
|
95
|
+
__slots__ = ()
|
96
|
+
|
97
|
+
def visit_var(self, node, /):
|
98
|
+
yield node
|
99
|
+
|
100
|
+
def visit_stretch(self, node, /):
|
101
|
+
yield node
|
102
|
+
|
103
|
+
def visit_value(self, node, /):
|
104
|
+
yield from ()
|
105
|
+
|
106
|
+
def visit_unary(self, node, /):
|
107
|
+
yield from node.operand.accept(self)
|
108
|
+
|
109
|
+
def visit_binary(self, node, /):
|
110
|
+
yield from node.left.accept(self)
|
111
|
+
yield from node.right.accept(self)
|
112
|
+
|
113
|
+
def visit_cast(self, node, /):
|
114
|
+
yield from node.operand.accept(self)
|
115
|
+
|
116
|
+
def visit_index(self, node, /):
|
117
|
+
yield from node.target.accept(self)
|
118
|
+
yield from node.index.accept(self)
|
119
|
+
|
120
|
+
|
121
|
+
_VAR_WALKER = _VarWalkerImpl()
|
122
|
+
_IDENT_WALKER = _IdentWalkerImpl()
|
123
|
+
|
124
|
+
|
125
|
+
def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
|
126
|
+
"""Get an iterator over the :class:`~.expr.Var` nodes referenced at any level in the given
|
127
|
+
:class:`~.expr.Expr`.
|
128
|
+
|
129
|
+
Examples:
|
130
|
+
Print out the name of each :class:`.ClassicalRegister` encountered::
|
131
|
+
|
132
|
+
from qiskit.circuit import ClassicalRegister
|
133
|
+
from qiskit.circuit.classical import expr
|
134
|
+
|
135
|
+
cr1 = ClassicalRegister(3, "a")
|
136
|
+
cr2 = ClassicalRegister(3, "b")
|
137
|
+
|
138
|
+
for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
|
139
|
+
if isinstance(node.var, ClassicalRegister):
|
140
|
+
print(node.var.name)
|
141
|
+
|
142
|
+
.. seealso::
|
143
|
+
:func:`iter_identifiers`
|
144
|
+
Get an iterator over all identifier nodes in the expression, including
|
145
|
+
both :class:`~.expr.Var` and :class:`~.expr.Stretch` nodes.
|
146
|
+
"""
|
147
|
+
yield from node.accept(_VAR_WALKER)
|
148
|
+
|
149
|
+
|
150
|
+
def iter_identifiers(node: expr.Expr) -> typing.Iterator[typing.Union[expr.Var, expr.Stretch]]:
|
151
|
+
"""Get an iterator over the :class:`~.expr.Var` and :class:`~.expr.Stretch`
|
152
|
+
nodes referenced at any level in the given :class:`~.expr.Expr`.
|
153
|
+
|
154
|
+
Examples:
|
155
|
+
Print out the name of each :class:`.ClassicalRegister` encountered::
|
156
|
+
|
157
|
+
from qiskit.circuit import ClassicalRegister
|
158
|
+
from qiskit.circuit.classical import expr
|
159
|
+
|
160
|
+
cr1 = ClassicalRegister(3, "a")
|
161
|
+
cr2 = ClassicalRegister(3, "b")
|
162
|
+
|
163
|
+
for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
|
164
|
+
if isinstance(node.var, ClassicalRegister):
|
165
|
+
print(node.var.name)
|
166
|
+
|
167
|
+
.. seealso::
|
168
|
+
:func:`iter_vars`
|
169
|
+
Get an iterator over just the :class:`~.expr.Var` nodes in the expression.
|
170
|
+
"""
|
171
|
+
yield from node.accept(_IDENT_WALKER)
|
172
|
+
|
173
|
+
|
174
|
+
class _StructuralEquivalenceImpl(ExprVisitor[bool]):
|
175
|
+
# The strategy here is to continue to do regular double dispatch through the visitor format,
|
176
|
+
# since we simply exit out with a ``False`` as soon as the structure of the two trees isn't the
|
177
|
+
# same; we never need to do any sort of "triple" dispatch. To recurse through both trees
|
178
|
+
# simultaneously, we hold a pointer to the "full" expression of the other (at the given depth)
|
179
|
+
# in the stack variables of each visit function, and pass the next "deeper" pointer via the
|
180
|
+
# `other` state in the class instance.
|
181
|
+
|
182
|
+
__slots__ = (
|
183
|
+
"self_key",
|
184
|
+
"other_key",
|
185
|
+
"other",
|
186
|
+
)
|
187
|
+
|
188
|
+
def __init__(self, other: expr.Expr, self_key, other_key):
|
189
|
+
self.self_key = self_key
|
190
|
+
self.other_key = other_key
|
191
|
+
self.other = other
|
192
|
+
|
193
|
+
def visit_var(self, node, /):
|
194
|
+
if self.other.__class__ is not node.__class__ or self.other.type != node.type:
|
195
|
+
return False
|
196
|
+
if self.self_key is None or (self_var := self.self_key(node.var)) is None:
|
197
|
+
self_var = node.var
|
198
|
+
if self.other_key is None or (other_var := self.other_key(self.other.var)) is None:
|
199
|
+
other_var = self.other.var
|
200
|
+
return self_var == other_var
|
201
|
+
|
202
|
+
def visit_stretch(self, node, /):
|
203
|
+
if self.other.__class__ is not node.__class__:
|
204
|
+
return False
|
205
|
+
return node.var == self.other.var
|
206
|
+
|
207
|
+
def visit_value(self, node, /):
|
208
|
+
return (
|
209
|
+
node.__class__ is self.other.__class__
|
210
|
+
and node.type == self.other.type
|
211
|
+
and node.value == self.other.value
|
212
|
+
)
|
213
|
+
|
214
|
+
def visit_unary(self, node, /):
|
215
|
+
if (
|
216
|
+
self.other.__class__ is not node.__class__
|
217
|
+
or self.other.op is not node.op
|
218
|
+
or self.other.type != node.type
|
219
|
+
):
|
220
|
+
return False
|
221
|
+
self.other = self.other.operand
|
222
|
+
return node.operand.accept(self)
|
223
|
+
|
224
|
+
def visit_binary(self, node, /):
|
225
|
+
if (
|
226
|
+
self.other.__class__ is not node.__class__
|
227
|
+
or self.other.op is not node.op
|
228
|
+
or self.other.type != node.type
|
229
|
+
):
|
230
|
+
return False
|
231
|
+
other = self.other
|
232
|
+
self.other = other.left
|
233
|
+
if not node.left.accept(self):
|
234
|
+
return False
|
235
|
+
self.other = other.right
|
236
|
+
return node.right.accept(self)
|
237
|
+
|
238
|
+
def visit_cast(self, node, /):
|
239
|
+
if self.other.__class__ is not node.__class__ or self.other.type != node.type:
|
240
|
+
return False
|
241
|
+
self.other = self.other.operand
|
242
|
+
return node.operand.accept(self)
|
243
|
+
|
244
|
+
def visit_index(self, node, /):
|
245
|
+
if self.other.__class__ is not node.__class__ or self.other.type != node.type:
|
246
|
+
return False
|
247
|
+
other = self.other
|
248
|
+
self.other = other.target
|
249
|
+
if not node.target.accept(self):
|
250
|
+
return False
|
251
|
+
self.other = other.index
|
252
|
+
return node.index.accept(self)
|
253
|
+
|
254
|
+
|
255
|
+
def structurally_equivalent(
|
256
|
+
left: expr.Expr,
|
257
|
+
right: expr.Expr,
|
258
|
+
left_var_key: typing.Callable[[typing.Any], typing.Any] | None = None,
|
259
|
+
right_var_key: typing.Callable[[typing.Any], typing.Any] | None = None,
|
260
|
+
) -> bool:
|
261
|
+
"""Do these two expressions have exactly the same tree structure, up to some key function for
|
262
|
+
the :class:`~.expr.Var` objects?
|
263
|
+
|
264
|
+
In other words, are these two expressions the exact same trees, except we compare the
|
265
|
+
:attr:`.Var.var` fields by calling the appropriate ``*_var_key`` function on them, and comparing
|
266
|
+
that output for equality. This function does not allow any semantic "equivalences" such as
|
267
|
+
asserting that ``a == b`` is equivalent to ``b == a``; the evaluation order of the operands
|
268
|
+
could, in general, cause such a statement to be false (consider hypothetical ``extern``
|
269
|
+
functions that access global state).
|
270
|
+
|
271
|
+
There's no requirements on the key functions, except that their outputs should have general
|
272
|
+
``__eq__`` methods. If a key function returns ``None``, the variable will be used verbatim
|
273
|
+
instead.
|
274
|
+
|
275
|
+
Args:
|
276
|
+
left: one of the :class:`~.expr.Expr` nodes.
|
277
|
+
right: the other :class:`~.expr.Expr` node.
|
278
|
+
left_var_key: a callable whose output should be used when comparing :attr:`.Var.var`
|
279
|
+
attributes. If this argument is ``None`` or its output is ``None`` for a given
|
280
|
+
variable in ``left``, the variable will be used verbatim.
|
281
|
+
right_var_key: same as ``left_var_key``, but used on the variables in ``right`` instead.
|
282
|
+
|
283
|
+
Examples:
|
284
|
+
Comparing two expressions for structural equivalence, with no remapping of the variables.
|
285
|
+
These are different because the different :class:`.Clbit` instances compare differently::
|
286
|
+
|
287
|
+
>>> from qiskit.circuit import Clbit
|
288
|
+
>>> from qiskit.circuit.classical import expr
|
289
|
+
>>> left_bits = [Clbit(), Clbit()]
|
290
|
+
>>> right_bits = [Clbit(), Clbit()]
|
291
|
+
>>> left = expr.logic_and(expr.logic_not(left_bits[0]), left_bits[1])
|
292
|
+
>>> right = expr.logic_and(expr.logic_not(right_bits[0]), right_bits[1])
|
293
|
+
>>> expr.structurally_equivalent(left, right)
|
294
|
+
False
|
295
|
+
|
296
|
+
Comparing the same two expressions, but this time using mapping functions that associate
|
297
|
+
the bits with simple indices::
|
298
|
+
|
299
|
+
>>> left_key = {var: i for i, var in enumerate(left_bits)}.get
|
300
|
+
>>> right_key = {var: i for i, var in enumerate(right_bits)}.get
|
301
|
+
>>> expr.structurally_equivalent(left, right, left_key, right_key)
|
302
|
+
True
|
303
|
+
"""
|
304
|
+
return left.accept(_StructuralEquivalenceImpl(right, left_var_key, right_var_key))
|
305
|
+
|
306
|
+
|
307
|
+
class _IsLValueImpl(ExprVisitor[bool]):
|
308
|
+
__slots__ = ()
|
309
|
+
|
310
|
+
def visit_var(self, node, /):
|
311
|
+
return True
|
312
|
+
|
313
|
+
def visit_stretch(self, node, /):
|
314
|
+
return False
|
315
|
+
|
316
|
+
def visit_value(self, node, /):
|
317
|
+
return False
|
318
|
+
|
319
|
+
def visit_unary(self, node, /):
|
320
|
+
return False
|
321
|
+
|
322
|
+
def visit_binary(self, node, /):
|
323
|
+
return False
|
324
|
+
|
325
|
+
def visit_cast(self, node, /):
|
326
|
+
return False
|
327
|
+
|
328
|
+
def visit_index(self, node, /):
|
329
|
+
return node.target.accept(self)
|
330
|
+
|
331
|
+
|
332
|
+
_IS_LVALUE = _IsLValueImpl()
|
333
|
+
|
334
|
+
|
335
|
+
def is_lvalue(node: expr.Expr, /) -> bool:
|
336
|
+
"""Return whether this expression can be used in l-value positions, that is, whether it has a
|
337
|
+
well-defined location in memory, such as one that might be writeable.
|
338
|
+
|
339
|
+
Being an l-value is a necessary but not sufficient for this location to be writeable; it is
|
340
|
+
permissible that a larger object containing this memory location may not allow writing from
|
341
|
+
the scope that attempts to write to it. This would be an access property of the containing
|
342
|
+
program, however, and not an inherent property of the expression system.
|
343
|
+
|
344
|
+
A constant expression is never an lvalue.
|
345
|
+
|
346
|
+
Examples:
|
347
|
+
Literal values are never l-values; there's no memory location associated with (for example)
|
348
|
+
the constant ``1``::
|
349
|
+
|
350
|
+
>>> from qiskit.circuit.classical import expr
|
351
|
+
>>> expr.is_lvalue(expr.lift(2))
|
352
|
+
False
|
353
|
+
|
354
|
+
:class:`~.expr.Var` nodes are always l-values, because they always have some associated
|
355
|
+
memory location::
|
356
|
+
|
357
|
+
>>> from qiskit.circuit.classical import types
|
358
|
+
>>> from qiskit.circuit import Clbit
|
359
|
+
>>> expr.is_lvalue(expr.Var.new("a", types.Bool()))
|
360
|
+
True
|
361
|
+
>>> expr.is_lvalue(expr.lift(Clbit()))
|
362
|
+
True
|
363
|
+
|
364
|
+
Currently there are no unary or binary operations on variables that can produce an l-value
|
365
|
+
expression, but it is likely in the future that some sort of "indexing" operation will be
|
366
|
+
added, which could produce l-values::
|
367
|
+
|
368
|
+
>>> a = expr.Var.new("a", types.Uint(8))
|
369
|
+
>>> b = expr.Var.new("b", types.Uint(8))
|
370
|
+
>>> expr.is_lvalue(a) and expr.is_lvalue(b)
|
371
|
+
True
|
372
|
+
>>> expr.is_lvalue(expr.bit_and(a, b))
|
373
|
+
False
|
374
|
+
"""
|
375
|
+
return node.accept(_IS_LVALUE)
|
@@ -0,0 +1,113 @@
|
|
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
|
+
"""
|
14
|
+
==============================================
|
15
|
+
Typing (:mod:`qiskit.circuit.classical.types`)
|
16
|
+
==============================================
|
17
|
+
|
18
|
+
Representation
|
19
|
+
==============
|
20
|
+
|
21
|
+
The type system of the expression tree is exposed through this module. This is inherently linked to
|
22
|
+
the expression system in the :mod:`~.classical.expr` module, as most expressions can only be
|
23
|
+
understood with the context of the types that they act on.
|
24
|
+
|
25
|
+
All types inherit from an abstract base class:
|
26
|
+
|
27
|
+
.. autoclass:: Type
|
28
|
+
|
29
|
+
Types should be considered immutable objects, and you must not mutate them. It is permissible to
|
30
|
+
reuse a :class:`Type` that you take from another object without copying it, and generally this will
|
31
|
+
be the best approach for performance. :class:`Type` objects are designed to be small amounts of
|
32
|
+
data, and it's best to point to the same instance of the data where possible rather than
|
33
|
+
heap-allocating a new version of the same thing. Where possible, the class constructors will return
|
34
|
+
singleton instances to facilitate this.
|
35
|
+
|
36
|
+
The :class:`Bool` type represents :class:`.Clbit` and the literals ``True`` and ``False``, the
|
37
|
+
:class:`Uint` type represents :class:`.ClassicalRegister` and Python integers, the :class:`Float`
|
38
|
+
type represents Python floats, and the :class:`Duration` type represents a duration for use in
|
39
|
+
timing-aware circuit operations.
|
40
|
+
|
41
|
+
.. autoclass:: Bool
|
42
|
+
.. autoclass:: Uint
|
43
|
+
.. autoclass:: Float
|
44
|
+
.. autoclass:: Duration
|
45
|
+
|
46
|
+
Working with types
|
47
|
+
==================
|
48
|
+
|
49
|
+
There are some additional functions on these types documented in the subsequent sections.
|
50
|
+
These are mostly expected to be used only in manipulations of the expression tree;
|
51
|
+
users who are building expressions using the
|
52
|
+
:ref:`user-facing construction interface <circuit-classical-expressions-expr-construction>` should
|
53
|
+
not need to use these.
|
54
|
+
|
55
|
+
Partial ordering of types
|
56
|
+
=========================
|
57
|
+
|
58
|
+
The type system is equipped with a partial ordering, where :math:`a < b` is interpreted as
|
59
|
+
":math:`a` is a strict subtype of :math:`b`". Note that the partial ordering is a subset of the
|
60
|
+
directed graph that describes the allowed explicit casting operations between types. The partial
|
61
|
+
ordering defines when one type may be lossless directly interpreted as another.
|
62
|
+
|
63
|
+
The low-level interface to querying the subtyping relationship is the :func:`order` function.
|
64
|
+
|
65
|
+
.. autofunction:: order
|
66
|
+
|
67
|
+
The return value is an enumeration :class:`Ordering` that describes what, if any, subtyping
|
68
|
+
relationship exists between the two types.
|
69
|
+
|
70
|
+
.. autoclass:: Ordering
|
71
|
+
:member-order: bysource
|
72
|
+
|
73
|
+
Some helper methods are then defined in terms of this low-level :func:`order` primitive:
|
74
|
+
|
75
|
+
.. autofunction:: is_subtype
|
76
|
+
.. autofunction:: is_supertype
|
77
|
+
.. autofunction:: greater
|
78
|
+
|
79
|
+
|
80
|
+
Casting between types
|
81
|
+
=====================
|
82
|
+
|
83
|
+
It is common to need to cast values of one type to another type. The casting rules for this are
|
84
|
+
embedded into the :mod:`types` module. You can query the casting kinds using :func:`cast_kind`:
|
85
|
+
|
86
|
+
.. autofunction:: cast_kind
|
87
|
+
|
88
|
+
The return values from this function are an enumeration explaining the types of cast that are
|
89
|
+
allowed from the left type to the right type.
|
90
|
+
|
91
|
+
Note that casts between :class:`Float` and :class:`Uint` are considered dangerous in either
|
92
|
+
direction, and must be done explicitly.
|
93
|
+
|
94
|
+
.. autoclass:: CastKind
|
95
|
+
"""
|
96
|
+
|
97
|
+
__all__ = [
|
98
|
+
"Type",
|
99
|
+
"Bool",
|
100
|
+
"Duration",
|
101
|
+
"Float",
|
102
|
+
"Uint",
|
103
|
+
"Ordering",
|
104
|
+
"order",
|
105
|
+
"is_subtype",
|
106
|
+
"is_supertype",
|
107
|
+
"greater",
|
108
|
+
"CastKind",
|
109
|
+
"cast_kind",
|
110
|
+
]
|
111
|
+
|
112
|
+
from .types import Type, Bool, Duration, Float, Uint
|
113
|
+
from .ordering import Ordering, order, is_subtype, is_supertype, greater, CastKind, cast_kind
|