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,764 @@
|
|
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
|
+
"""User-space constructor functions for the expression tree, which do some of the inference and
|
14
|
+
lifting boilerplate work."""
|
15
|
+
|
16
|
+
# pylint: disable=redefined-builtin,redefined-outer-name
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"lift",
|
22
|
+
"cast",
|
23
|
+
"bit_not",
|
24
|
+
"logic_not",
|
25
|
+
"bit_and",
|
26
|
+
"bit_or",
|
27
|
+
"bit_xor",
|
28
|
+
"logic_and",
|
29
|
+
"logic_or",
|
30
|
+
"equal",
|
31
|
+
"not_equal",
|
32
|
+
"less",
|
33
|
+
"less_equal",
|
34
|
+
"greater",
|
35
|
+
"greater_equal",
|
36
|
+
"shift_left",
|
37
|
+
"shift_right",
|
38
|
+
"index",
|
39
|
+
"add",
|
40
|
+
"sub",
|
41
|
+
"mul",
|
42
|
+
"div",
|
43
|
+
"lift_legacy_condition",
|
44
|
+
]
|
45
|
+
|
46
|
+
import typing
|
47
|
+
|
48
|
+
from .expr import Expr, Var, Value, Unary, Binary, Cast, Index
|
49
|
+
from ..types import CastKind, cast_kind
|
50
|
+
from .. import types
|
51
|
+
|
52
|
+
if typing.TYPE_CHECKING:
|
53
|
+
import qiskit
|
54
|
+
|
55
|
+
|
56
|
+
def _coerce_lossless(expr: Expr, type: types.Type) -> Expr | None:
|
57
|
+
"""Coerce ``expr`` to ``type`` by inserting a suitable :class:`Cast` node, if the cast is
|
58
|
+
lossless. Otherwise, return ``None``."""
|
59
|
+
kind = cast_kind(expr.type, type)
|
60
|
+
if kind is CastKind.EQUAL:
|
61
|
+
return expr
|
62
|
+
if kind is CastKind.IMPLICIT:
|
63
|
+
return Cast(expr, type, implicit=True)
|
64
|
+
if kind is CastKind.LOSSLESS:
|
65
|
+
return Cast(expr, type, implicit=False)
|
66
|
+
return None
|
67
|
+
|
68
|
+
|
69
|
+
def lift_legacy_condition(
|
70
|
+
condition: tuple[qiskit.circuit.Clbit | qiskit.circuit.ClassicalRegister, int], /
|
71
|
+
) -> Expr:
|
72
|
+
"""Lift a legacy two-tuple equality condition into a new-style :class:`Expr`."""
|
73
|
+
from qiskit.circuit import Clbit # pylint: disable=cyclic-import
|
74
|
+
|
75
|
+
target, value = condition
|
76
|
+
if isinstance(target, Clbit):
|
77
|
+
bool_ = types.Bool()
|
78
|
+
return Var(target, bool_) if value else Unary(Unary.Op.LOGIC_NOT, Var(target, bool_), bool_)
|
79
|
+
left = Var(target, types.Uint(width=target.size))
|
80
|
+
if value.bit_length() > target.size:
|
81
|
+
left = Cast(left, types.Uint(width=value.bit_length()), implicit=True)
|
82
|
+
right = Value(value, left.type)
|
83
|
+
return Binary(Binary.Op.EQUAL, left, right, types.Bool())
|
84
|
+
|
85
|
+
|
86
|
+
def lift(value: typing.Any, /, type: types.Type | None = None) -> Expr:
|
87
|
+
"""Lift the given Python ``value`` to a :class:`~.expr.Value` or :class:`~.expr.Var`.
|
88
|
+
|
89
|
+
If an explicit ``type`` is given, the typing in the output will reflect that.
|
90
|
+
|
91
|
+
Examples:
|
92
|
+
Lifting simple circuit objects to be :class:`~.expr.Var` instances::
|
93
|
+
|
94
|
+
>>> from qiskit.circuit import Clbit, ClassicalRegister
|
95
|
+
>>> from qiskit.circuit.classical import expr
|
96
|
+
>>> expr.lift(Clbit())
|
97
|
+
Var(<clbit>, Bool())
|
98
|
+
>>> expr.lift(ClassicalRegister(3, "c"))
|
99
|
+
Var(ClassicalRegister(3, "c"), Uint(3))
|
100
|
+
|
101
|
+
The type of the return value can be influenced, if the given value could be interpreted
|
102
|
+
losslessly as the given type (use :func:`cast` to perform a full set of casting
|
103
|
+
operations, include lossy ones)::
|
104
|
+
|
105
|
+
>>> from qiskit.circuit import ClassicalRegister
|
106
|
+
>>> from qiskit.circuit.classical import expr, types
|
107
|
+
>>> expr.lift(ClassicalRegister(3, "c"), types.Uint(5))
|
108
|
+
Var(ClassicalRegister(3, "c"), Uint(5))
|
109
|
+
>>> expr.lift(5, types.Uint(4))
|
110
|
+
Value(5, Uint(4))
|
111
|
+
"""
|
112
|
+
if isinstance(value, Expr):
|
113
|
+
if type is not None:
|
114
|
+
raise ValueError("use 'cast' to cast existing expressions, not 'lift'")
|
115
|
+
return value
|
116
|
+
from qiskit.circuit import Clbit, ClassicalRegister, Duration # pylint: disable=cyclic-import
|
117
|
+
|
118
|
+
inferred: types.Type
|
119
|
+
if value is True or value is False or isinstance(value, Clbit):
|
120
|
+
inferred = types.Bool()
|
121
|
+
constructor = Value if value is True or value is False else Var
|
122
|
+
elif isinstance(value, ClassicalRegister):
|
123
|
+
inferred = types.Uint(width=value.size)
|
124
|
+
constructor = Var
|
125
|
+
elif isinstance(value, int):
|
126
|
+
if value < 0:
|
127
|
+
raise ValueError("cannot represent a negative value")
|
128
|
+
inferred = types.Uint(width=value.bit_length() or 1)
|
129
|
+
constructor = Value
|
130
|
+
elif isinstance(value, float):
|
131
|
+
inferred = types.Float()
|
132
|
+
constructor = Value
|
133
|
+
elif isinstance(value, Duration):
|
134
|
+
inferred = types.Duration()
|
135
|
+
constructor = Value
|
136
|
+
else:
|
137
|
+
raise TypeError(f"failed to infer a type for '{value}'")
|
138
|
+
if type is None:
|
139
|
+
type = inferred
|
140
|
+
if types.is_supertype(type, inferred):
|
141
|
+
return constructor(value, type)
|
142
|
+
raise TypeError(
|
143
|
+
f"the explicit type '{type}' is not suitable for representing '{value}';"
|
144
|
+
f" it must be non-strict supertype of '{inferred}'"
|
145
|
+
)
|
146
|
+
|
147
|
+
|
148
|
+
def cast(operand: typing.Any, type: types.Type, /) -> Expr:
|
149
|
+
"""Create an explicit cast from the given value to the given type.
|
150
|
+
|
151
|
+
Examples:
|
152
|
+
Add an explicit cast node that explicitly casts a higher precision type to a lower precision
|
153
|
+
one::
|
154
|
+
|
155
|
+
>>> from qiskit.circuit.classical import expr, types
|
156
|
+
>>> value = expr.value(5, types.Uint(32))
|
157
|
+
>>> expr.cast(value, types.Uint(8))
|
158
|
+
Cast(Value(5, types.Uint(32)), types.Uint(8), implicit=False)
|
159
|
+
"""
|
160
|
+
operand = lift(operand)
|
161
|
+
if cast_kind(operand.type, type) is CastKind.NONE:
|
162
|
+
raise TypeError(f"cannot cast '{operand}' to '{type}'")
|
163
|
+
return Cast(operand, type)
|
164
|
+
|
165
|
+
|
166
|
+
def bit_not(operand: typing.Any, /) -> Expr:
|
167
|
+
"""Create a bitwise 'not' expression node from the given value, resolving any implicit casts and
|
168
|
+
lifting the value into a :class:`Value` node if required.
|
169
|
+
|
170
|
+
Examples:
|
171
|
+
Bitwise negation of a :class:`.ClassicalRegister`::
|
172
|
+
|
173
|
+
>>> from qiskit.circuit import ClassicalRegister
|
174
|
+
>>> from qiskit.circuit.classical import expr
|
175
|
+
>>> expr.bit_not(ClassicalRegister(3, "c"))
|
176
|
+
Unary(Unary.Op.BIT_NOT, Var(ClassicalRegister(3, 'c'), Uint(3)), Uint(3))
|
177
|
+
"""
|
178
|
+
operand = lift(operand)
|
179
|
+
if operand.type.kind not in (types.Bool, types.Uint):
|
180
|
+
raise TypeError(f"cannot apply '{Unary.Op.BIT_NOT}' to type '{operand.type}'")
|
181
|
+
return Unary(Unary.Op.BIT_NOT, operand, operand.type)
|
182
|
+
|
183
|
+
|
184
|
+
def logic_not(operand: typing.Any, /) -> Expr:
|
185
|
+
"""Create a logical 'not' expression node from the given value, resolving any implicit casts and
|
186
|
+
lifting the value into a :class:`Value` node if required.
|
187
|
+
|
188
|
+
Examples:
|
189
|
+
Logical negation of a :class:`.ClassicalRegister`::
|
190
|
+
|
191
|
+
>>> from qiskit.circuit import ClassicalRegister
|
192
|
+
>>> from qiskit.circuit.classical import expr
|
193
|
+
>>> expr.logic_not(ClassicalRegister(3, "c"))
|
194
|
+
Unary(\
|
195
|
+
Unary.Op.LOGIC_NOT, \
|
196
|
+
Cast(Var(ClassicalRegister(3, 'c'), Uint(3)), \
|
197
|
+
Bool(), implicit=True), \
|
198
|
+
Bool())
|
199
|
+
"""
|
200
|
+
operand = lift(operand)
|
201
|
+
coerced_operand = _coerce_lossless(operand, types.Bool())
|
202
|
+
if coerced_operand is None:
|
203
|
+
raise TypeError(f"cannot apply '{Unary.Op.LOGIC_NOT}' to type '{operand.type}'")
|
204
|
+
return Unary(Unary.Op.LOGIC_NOT, coerced_operand, coerced_operand.type)
|
205
|
+
|
206
|
+
|
207
|
+
def _lift_binary_operands(left: typing.Any, right: typing.Any) -> tuple[Expr, Expr]:
|
208
|
+
"""Lift two binary operands simultaneously, inferring the widths of integer literals in either
|
209
|
+
position to match the other operand."""
|
210
|
+
left_int = isinstance(left, int) and not isinstance(left, bool)
|
211
|
+
right_int = isinstance(right, int) and not isinstance(right, bool)
|
212
|
+
if not (left_int or right_int):
|
213
|
+
left = lift(left)
|
214
|
+
right = lift(right)
|
215
|
+
elif not right_int:
|
216
|
+
right = lift(right)
|
217
|
+
if right.type.kind is types.Uint:
|
218
|
+
if left.bit_length() > right.type.width:
|
219
|
+
raise TypeError(
|
220
|
+
f"integer literal '{left}' is wider than the other operand '{right}'"
|
221
|
+
)
|
222
|
+
left = Value(left, right.type)
|
223
|
+
else:
|
224
|
+
left = lift(left)
|
225
|
+
elif not left_int:
|
226
|
+
left = lift(left)
|
227
|
+
if left.type.kind is types.Uint:
|
228
|
+
if right.bit_length() > left.type.width:
|
229
|
+
raise TypeError(
|
230
|
+
f"integer literal '{right}' is wider than the other operand '{left}'"
|
231
|
+
)
|
232
|
+
right = Value(right, left.type)
|
233
|
+
else:
|
234
|
+
right = lift(right)
|
235
|
+
else:
|
236
|
+
# Both are `int`, so we take our best case to make things work.
|
237
|
+
uint = types.Uint(max(left.bit_length(), right.bit_length(), 1))
|
238
|
+
left = Value(left, uint)
|
239
|
+
right = Value(right, uint)
|
240
|
+
return left, right
|
241
|
+
|
242
|
+
|
243
|
+
def _binary_bitwise(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
|
244
|
+
left, right = _lift_binary_operands(left, right)
|
245
|
+
type: types.Type
|
246
|
+
if left.type.kind is right.type.kind is types.Bool:
|
247
|
+
type = types.Bool()
|
248
|
+
elif left.type.kind is types.Uint and right.type.kind is types.Uint:
|
249
|
+
if left.type != right.type:
|
250
|
+
raise TypeError(
|
251
|
+
"binary bitwise operations are defined between unsigned integers of the same width,"
|
252
|
+
f" but got {left.type.width} and {right.type.width}."
|
253
|
+
)
|
254
|
+
type = left.type
|
255
|
+
else:
|
256
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
257
|
+
return Binary(op, left, right, type)
|
258
|
+
|
259
|
+
|
260
|
+
def bit_and(left: typing.Any, right: typing.Any, /) -> Expr:
|
261
|
+
"""Create a bitwise 'and' expression node from the given value, resolving any implicit casts and
|
262
|
+
lifting the values into :class:`Value` nodes if required.
|
263
|
+
|
264
|
+
Examples:
|
265
|
+
Bitwise 'and' of a classical register and an integer literal::
|
266
|
+
|
267
|
+
>>> from qiskit.circuit import ClassicalRegister
|
268
|
+
>>> from qiskit.circuit.classical import expr
|
269
|
+
>>> expr.bit_and(ClassicalRegister(3, "c"), 0b111)
|
270
|
+
Binary(\
|
271
|
+
Binary.Op.BIT_AND, \
|
272
|
+
Var(ClassicalRegister(3, 'c'), Uint(3)), \
|
273
|
+
Value(7, Uint(3)), \
|
274
|
+
Uint(3))
|
275
|
+
"""
|
276
|
+
return _binary_bitwise(Binary.Op.BIT_AND, left, right)
|
277
|
+
|
278
|
+
|
279
|
+
def bit_or(left: typing.Any, right: typing.Any, /) -> Expr:
|
280
|
+
"""Create a bitwise 'or' expression node from the given value, resolving any implicit casts and
|
281
|
+
lifting the values into :class:`Value` nodes if required.
|
282
|
+
|
283
|
+
Examples:
|
284
|
+
Bitwise 'or' of a classical register and an integer literal::
|
285
|
+
|
286
|
+
>>> from qiskit.circuit import ClassicalRegister
|
287
|
+
>>> from qiskit.circuit.classical import expr
|
288
|
+
>>> expr.bit_or(ClassicalRegister(3, "c"), 0b101)
|
289
|
+
Binary(\
|
290
|
+
Binary.Op.BIT_OR, \
|
291
|
+
Var(ClassicalRegister(3, 'c'), Uint(3)), \
|
292
|
+
Value(5, Uint(3)), \
|
293
|
+
Uint(3))
|
294
|
+
"""
|
295
|
+
return _binary_bitwise(Binary.Op.BIT_OR, left, right)
|
296
|
+
|
297
|
+
|
298
|
+
def bit_xor(left: typing.Any, right: typing.Any, /) -> Expr:
|
299
|
+
"""Create a bitwise 'exclusive or' expression node from the given value, resolving any implicit
|
300
|
+
casts and lifting the values into :class:`Value` nodes if required.
|
301
|
+
|
302
|
+
Examples:
|
303
|
+
Bitwise 'exclusive or' of a classical register and an integer literal::
|
304
|
+
|
305
|
+
>>> from qiskit.circuit import ClassicalRegister
|
306
|
+
>>> from qiskit.circuit.classical import expr
|
307
|
+
>>> expr.bit_xor(ClassicalRegister(3, "c"), 0b101)
|
308
|
+
Binary(\
|
309
|
+
Binary.Op.BIT_XOR, \
|
310
|
+
Var(ClassicalRegister(3, 'c'), Uint(3)), \
|
311
|
+
Value(5, Uint(3)), \
|
312
|
+
Uint(3))
|
313
|
+
"""
|
314
|
+
return _binary_bitwise(Binary.Op.BIT_XOR, left, right)
|
315
|
+
|
316
|
+
|
317
|
+
def _binary_logical(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
|
318
|
+
bool_ = types.Bool()
|
319
|
+
left = lift(left)
|
320
|
+
right = lift(right)
|
321
|
+
coerced_left = _coerce_lossless(left, bool_)
|
322
|
+
coerced_right = _coerce_lossless(right, bool_)
|
323
|
+
if coerced_left is None or coerced_right is None:
|
324
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
325
|
+
return Binary(op, coerced_left, coerced_right, bool_)
|
326
|
+
|
327
|
+
|
328
|
+
def logic_and(left: typing.Any, right: typing.Any, /) -> Expr:
|
329
|
+
"""Create a logical 'and' expression node from the given value, resolving any implicit casts and
|
330
|
+
lifting the values into :class:`Value` nodes if required.
|
331
|
+
|
332
|
+
Examples:
|
333
|
+
Logical 'and' of two classical bits::
|
334
|
+
|
335
|
+
>>> from qiskit.circuit import Clbit
|
336
|
+
>>> from qiskit.circuit.classical import expr
|
337
|
+
>>> expr.logical_and(Clbit(), Clbit())
|
338
|
+
Binary(Binary.Op.LOGIC_AND, Var(<clbit 0>, Bool()), Var(<clbit 1>, Bool()), Bool())
|
339
|
+
"""
|
340
|
+
return _binary_logical(Binary.Op.LOGIC_AND, left, right)
|
341
|
+
|
342
|
+
|
343
|
+
def logic_or(left: typing.Any, right: typing.Any, /) -> Expr:
|
344
|
+
"""Create a logical 'or' expression node from the given value, resolving any implicit casts and
|
345
|
+
lifting the values into :class:`Value` nodes if required.
|
346
|
+
|
347
|
+
Examples:
|
348
|
+
Logical 'or' of two classical bits
|
349
|
+
|
350
|
+
>>> from qiskit.circuit import Clbit
|
351
|
+
>>> from qiskit.circuit.classical import expr
|
352
|
+
>>> expr.logical_and(Clbit(), Clbit())
|
353
|
+
Binary(Binary.Op.LOGIC_OR, Var(<clbit 0>, Bool()), Var(<clbit 1>, Bool()), Bool())
|
354
|
+
"""
|
355
|
+
return _binary_logical(Binary.Op.LOGIC_OR, left, right)
|
356
|
+
|
357
|
+
|
358
|
+
def _equal_like(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
|
359
|
+
left, right = _lift_binary_operands(left, right)
|
360
|
+
if left.type.kind is not right.type.kind:
|
361
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
362
|
+
type = types.greater(left.type, right.type)
|
363
|
+
# Note that we don't check the return value of _coerce_lossless for these
|
364
|
+
# since 'left' and 'right' are guaranteed to be the same kind here.
|
365
|
+
return Binary(op, _coerce_lossless(left, type), _coerce_lossless(right, type), types.Bool())
|
366
|
+
|
367
|
+
|
368
|
+
def equal(left: typing.Any, right: typing.Any, /) -> Expr:
|
369
|
+
"""Create an 'equal' expression node from the given value, resolving any implicit casts and
|
370
|
+
lifting the values into :class:`Value` nodes if required.
|
371
|
+
|
372
|
+
Examples:
|
373
|
+
Equality between a classical register and an integer::
|
374
|
+
|
375
|
+
>>> from qiskit.circuit import ClassicalRegister
|
376
|
+
>>> from qiskit.circuit.classical import expr
|
377
|
+
>>> expr.equal(ClassicalRegister(3, "c"), 7)
|
378
|
+
Binary(Binary.Op.EQUAL, \
|
379
|
+
Var(ClassicalRegister(3, "c"), Uint(3)), \
|
380
|
+
Value(7, Uint(3)), \
|
381
|
+
Uint(3))
|
382
|
+
"""
|
383
|
+
return _equal_like(Binary.Op.EQUAL, left, right)
|
384
|
+
|
385
|
+
|
386
|
+
def not_equal(left: typing.Any, right: typing.Any, /) -> Expr:
|
387
|
+
"""Create a 'not equal' expression node from the given value, resolving any implicit casts and
|
388
|
+
lifting the values into :class:`Value` nodes if required.
|
389
|
+
|
390
|
+
Examples:
|
391
|
+
Inequality between a classical register and an integer::
|
392
|
+
|
393
|
+
>>> from qiskit.circuit import ClassicalRegister
|
394
|
+
>>> from qiskit.circuit.classical import expr
|
395
|
+
>>> expr.not_equal(ClassicalRegister(3, "c"), 7)
|
396
|
+
Binary(Binary.Op.NOT_EQUAL, \
|
397
|
+
Var(ClassicalRegister(3, "c"), Uint(3)), \
|
398
|
+
Value(7, Uint(3)), \
|
399
|
+
Uint(3))
|
400
|
+
"""
|
401
|
+
return _equal_like(Binary.Op.NOT_EQUAL, left, right)
|
402
|
+
|
403
|
+
|
404
|
+
def _binary_relation(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
|
405
|
+
left, right = _lift_binary_operands(left, right)
|
406
|
+
if left.type.kind is not right.type.kind or left.type.kind is types.Bool:
|
407
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
408
|
+
type = types.greater(left.type, right.type)
|
409
|
+
# Note that we don't check the return value of _coerce_lossless for these
|
410
|
+
# since 'left' and 'right' are guaranteed to be the same kind here.
|
411
|
+
return Binary(op, _coerce_lossless(left, type), _coerce_lossless(right, type), types.Bool())
|
412
|
+
|
413
|
+
|
414
|
+
def less(left: typing.Any, right: typing.Any, /) -> Expr:
|
415
|
+
"""Create a 'less than' expression node from the given value, resolving any implicit casts and
|
416
|
+
lifting the values into :class:`Value` nodes if required.
|
417
|
+
|
418
|
+
Examples:
|
419
|
+
Query if a classical register is less than an integer::
|
420
|
+
|
421
|
+
>>> from qiskit.circuit import ClassicalRegister
|
422
|
+
>>> from qiskit.circuit.classical import expr
|
423
|
+
>>> expr.less(ClassicalRegister(3, "c"), 5)
|
424
|
+
Binary(Binary.Op.LESS, \
|
425
|
+
Var(ClassicalRegister(3, "c"), Uint(3)), \
|
426
|
+
Value(5, Uint(3)), \
|
427
|
+
Uint(3))
|
428
|
+
"""
|
429
|
+
return _binary_relation(Binary.Op.LESS, left, right)
|
430
|
+
|
431
|
+
|
432
|
+
def less_equal(left: typing.Any, right: typing.Any, /) -> Expr:
|
433
|
+
"""Create a 'less than or equal to' expression node from the given value, resolving any implicit
|
434
|
+
casts and lifting the values into :class:`Value` nodes if required.
|
435
|
+
|
436
|
+
Examples:
|
437
|
+
Query if a classical register is less than or equal to another::
|
438
|
+
|
439
|
+
>>> from qiskit.circuit import ClassicalRegister
|
440
|
+
>>> from qiskit.circuit.classical import expr
|
441
|
+
>>> expr.less(ClassicalRegister(3, "a"), ClassicalRegister(3, "b"))
|
442
|
+
Binary(Binary.Op.LESS_EQUAL, \
|
443
|
+
Var(ClassicalRegister(3, "a"), Uint(3)), \
|
444
|
+
Var(ClassicalRegister(3, "b"), Uint(3)), \
|
445
|
+
Uint(3))
|
446
|
+
"""
|
447
|
+
return _binary_relation(Binary.Op.LESS_EQUAL, left, right)
|
448
|
+
|
449
|
+
|
450
|
+
def greater(left: typing.Any, right: typing.Any, /) -> Expr:
|
451
|
+
"""Create a 'greater than' expression node from the given value, resolving any implicit casts
|
452
|
+
and lifting the values into :class:`Value` nodes if required.
|
453
|
+
|
454
|
+
Examples:
|
455
|
+
Query if a classical register is greater than an integer::
|
456
|
+
|
457
|
+
>>> from qiskit.circuit import ClassicalRegister
|
458
|
+
>>> from qiskit.circuit.classical import expr
|
459
|
+
>>> expr.less(ClassicalRegister(3, "c"), 5)
|
460
|
+
Binary(Binary.Op.GREATER, \
|
461
|
+
Var(ClassicalRegister(3, "c"), Uint(3)), \
|
462
|
+
Value(5, Uint(3)), \
|
463
|
+
Uint(3))
|
464
|
+
"""
|
465
|
+
return _binary_relation(Binary.Op.GREATER, left, right)
|
466
|
+
|
467
|
+
|
468
|
+
def greater_equal(left: typing.Any, right: typing.Any, /) -> Expr:
|
469
|
+
"""Create a 'greater than or equal to' expression node from the given value, resolving any
|
470
|
+
implicit casts and lifting the values into :class:`Value` nodes if required.
|
471
|
+
|
472
|
+
Examples:
|
473
|
+
Query if a classical register is greater than or equal to another::
|
474
|
+
|
475
|
+
>>> from qiskit.circuit import ClassicalRegister
|
476
|
+
>>> from qiskit.circuit.classical import expr
|
477
|
+
>>> expr.less(ClassicalRegister(3, "a"), ClassicalRegister(3, "b"))
|
478
|
+
Binary(Binary.Op.GREATER_EQUAL, \
|
479
|
+
Var(ClassicalRegister(3, "a"), Uint(3)), \
|
480
|
+
Var(ClassicalRegister(3, "b"), Uint(3)), \
|
481
|
+
Uint(3))
|
482
|
+
"""
|
483
|
+
return _binary_relation(Binary.Op.GREATER_EQUAL, left, right)
|
484
|
+
|
485
|
+
|
486
|
+
def _shift_like(
|
487
|
+
op: Binary.Op, left: typing.Any, right: typing.Any, type: types.Type | None
|
488
|
+
) -> Expr:
|
489
|
+
if type is not None and type.kind is not types.Uint:
|
490
|
+
raise TypeError(f"type '{type}' is not a valid bitshift operand type")
|
491
|
+
if isinstance(left, Expr):
|
492
|
+
if type is not None:
|
493
|
+
coerced_left = _coerce_lossless(left, type)
|
494
|
+
if coerced_left is None:
|
495
|
+
raise TypeError(f"type '{type}' cannot losslessly represent '{left.type}'")
|
496
|
+
left = coerced_left
|
497
|
+
else:
|
498
|
+
left = lift(left, type)
|
499
|
+
right = lift(right)
|
500
|
+
if left.type.kind != types.Uint or right.type.kind != types.Uint:
|
501
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
502
|
+
return Binary(op, left, right, left.type)
|
503
|
+
|
504
|
+
|
505
|
+
def shift_left(left: typing.Any, right: typing.Any, /, type: types.Type | None = None) -> Expr:
|
506
|
+
"""Create a 'bitshift left' expression node from the given two values, resolving any implicit
|
507
|
+
casts and lifting the values into :class:`Value` nodes if required.
|
508
|
+
|
509
|
+
If ``type`` is given, the ``left`` operand will be coerced to it (if possible).
|
510
|
+
|
511
|
+
Examples:
|
512
|
+
Shift the value of a standalone variable left by some amount::
|
513
|
+
|
514
|
+
>>> from qiskit.circuit.classical import expr, types
|
515
|
+
>>> a = expr.Var.new("a", types.Uint(8))
|
516
|
+
>>> expr.shift_left(a, 4)
|
517
|
+
Binary(Binary.Op.SHIFT_LEFT, \
|
518
|
+
Var(<UUID>, Uint(8), name='a'), \
|
519
|
+
Value(4, Uint(3)), \
|
520
|
+
Uint(8))
|
521
|
+
|
522
|
+
Shift an integer literal by a variable amount, coercing the type of the literal::
|
523
|
+
|
524
|
+
>>> expr.shift_left(3, a, types.Uint(16))
|
525
|
+
Binary(Binary.Op.SHIFT_LEFT, \
|
526
|
+
Value(3, Uint(16)), \
|
527
|
+
Var(<UUID>, Uint(8), name='a'), \
|
528
|
+
Uint(16))
|
529
|
+
"""
|
530
|
+
return _shift_like(Binary.Op.SHIFT_LEFT, left, right, type)
|
531
|
+
|
532
|
+
|
533
|
+
def shift_right(left: typing.Any, right: typing.Any, /, type: types.Type | None = None) -> Expr:
|
534
|
+
"""Create a 'bitshift right' expression node from the given values, resolving any implicit casts
|
535
|
+
and lifting the values into :class:`Value` nodes if required.
|
536
|
+
|
537
|
+
If ``type`` is given, the ``left`` operand will be coerced to it (if possible).
|
538
|
+
|
539
|
+
Examples:
|
540
|
+
Shift the value of a classical register right by some amount::
|
541
|
+
|
542
|
+
>>> from qiskit.circuit import ClassicalRegister
|
543
|
+
>>> from qiskit.circuit.classical import expr
|
544
|
+
>>> expr.shift_right(ClassicalRegister(8, "a"), 4)
|
545
|
+
Binary(Binary.Op.SHIFT_RIGHT, \
|
546
|
+
Var(ClassicalRegister(8, "a"), Uint(8)), \
|
547
|
+
Value(4, Uint(3)), \
|
548
|
+
Uint(8))
|
549
|
+
"""
|
550
|
+
return _shift_like(Binary.Op.SHIFT_RIGHT, left, right, type)
|
551
|
+
|
552
|
+
|
553
|
+
def index(target: typing.Any, index: typing.Any, /) -> Expr:
|
554
|
+
"""Index into the ``target`` with the given integer ``index``, lifting the values into
|
555
|
+
:class:`Value` nodes if required.
|
556
|
+
|
557
|
+
This can be used as the target of a :class:`.Store`, if the ``target`` is itself an lvalue.
|
558
|
+
|
559
|
+
Examples:
|
560
|
+
Index into a classical register with a literal::
|
561
|
+
|
562
|
+
>>> from qiskit.circuit import ClassicalRegister
|
563
|
+
>>> from qiskit.circuit.classical import expr
|
564
|
+
>>> expr.index(ClassicalRegister(8, "a"), 3)
|
565
|
+
Index(Var(ClassicalRegister(8, "a"), Uint(8)), Value(3, Uint(2)), Bool())
|
566
|
+
"""
|
567
|
+
target, index = lift(target), lift(index)
|
568
|
+
if target.type.kind is not types.Uint or index.type.kind is not types.Uint:
|
569
|
+
raise TypeError(f"invalid types for indexing: '{target.type}' and '{index.type}'")
|
570
|
+
return Index(target, index, types.Bool())
|
571
|
+
|
572
|
+
|
573
|
+
def _binary_sum(op: Binary.Op, left: typing.Any, right: typing.Any) -> Expr:
|
574
|
+
left, right = _lift_binary_operands(left, right)
|
575
|
+
if left.type.kind is right.type.kind and left.type.kind in {
|
576
|
+
types.Uint,
|
577
|
+
types.Float,
|
578
|
+
types.Duration,
|
579
|
+
}:
|
580
|
+
type = types.greater(left.type, right.type)
|
581
|
+
return Binary(
|
582
|
+
op,
|
583
|
+
_coerce_lossless(left, type),
|
584
|
+
_coerce_lossless(right, type),
|
585
|
+
type,
|
586
|
+
)
|
587
|
+
raise TypeError(f"invalid types for '{op}': '{left.type}' and '{right.type}'")
|
588
|
+
|
589
|
+
|
590
|
+
def add(left: typing.Any, right: typing.Any, /) -> Expr:
|
591
|
+
"""Create an addition expression node from the given values, resolving any implicit casts and
|
592
|
+
lifting the values into :class:`Value` nodes if required.
|
593
|
+
|
594
|
+
Examples:
|
595
|
+
Addition of two floating point numbers::
|
596
|
+
|
597
|
+
>>> from qiskit.circuit.classical import expr
|
598
|
+
>>> expr.add(5.0, 2.0)
|
599
|
+
Binary(\
|
600
|
+
Binary.Op.ADD, \
|
601
|
+
Value(5.0, Float()), \
|
602
|
+
Value(2.0, Float()), \
|
603
|
+
Float())
|
604
|
+
|
605
|
+
Addition of two durations::
|
606
|
+
|
607
|
+
>>> from qiskit.circuit import Duration
|
608
|
+
>>> from qiskit.circuit.classical import expr
|
609
|
+
>>> expr.add(Duration.dt(1000), Duration.dt(1000))
|
610
|
+
Binary(\
|
611
|
+
Binary.Op.ADD, \
|
612
|
+
Value(Duration.dt(1000), Duration()), \
|
613
|
+
Value(Duration.dt(1000), Duration()), \
|
614
|
+
Duration())
|
615
|
+
"""
|
616
|
+
return _binary_sum(Binary.Op.ADD, left, right)
|
617
|
+
|
618
|
+
|
619
|
+
def sub(left: typing.Any, right: typing.Any, /) -> Expr:
|
620
|
+
"""Create a subtraction expression node from the given values, resolving any implicit casts and
|
621
|
+
lifting the values into :class:`Value` nodes if required.
|
622
|
+
|
623
|
+
Examples:
|
624
|
+
Subtraction of two floating point numbers::
|
625
|
+
|
626
|
+
>>> from qiskit.circuit.classical import expr
|
627
|
+
>>> expr.sub(5.0, 2.0)
|
628
|
+
Binary(\
|
629
|
+
Binary.Op.SUB, \
|
630
|
+
Value(5.0, Float()), \
|
631
|
+
Value(2.0, Float()), \
|
632
|
+
Float())
|
633
|
+
|
634
|
+
Subtraction of two durations::
|
635
|
+
|
636
|
+
>>> from qiskit.circuit import Duration
|
637
|
+
>>> from qiskit.circuit.classical import expr
|
638
|
+
>>> expr.add(Duration.dt(1000), Duration.dt(1000))
|
639
|
+
Binary(\
|
640
|
+
Binary.Op.SUB, \
|
641
|
+
Value(Duration.dt(1000), Duration()), \
|
642
|
+
Value(Duration.dt(1000), Duration()), \
|
643
|
+
Duration())
|
644
|
+
"""
|
645
|
+
return _binary_sum(Binary.Op.SUB, left, right)
|
646
|
+
|
647
|
+
|
648
|
+
def mul(left: typing.Any, right: typing.Any) -> Expr:
|
649
|
+
"""Create a multiplication expression node from the given values, resolving any implicit casts and
|
650
|
+
lifting the values into :class:`Value` nodes if required.
|
651
|
+
|
652
|
+
This can be used to multiply numeric operands of the same type kind, or to multiply a duration
|
653
|
+
operand by a numeric operand.
|
654
|
+
|
655
|
+
Examples:
|
656
|
+
Multiplication of two floating point numbers::
|
657
|
+
|
658
|
+
>>> from qiskit.circuit.classical import expr
|
659
|
+
>>> expr.mul(5.0, 2.0)
|
660
|
+
Binary(\
|
661
|
+
Binary.Op.MUL, \
|
662
|
+
Value(5.0, Float()), \
|
663
|
+
Value(2.0, Float()), \
|
664
|
+
Float())
|
665
|
+
|
666
|
+
Multiplication of a duration by a float::
|
667
|
+
|
668
|
+
>>> from qiskit.circuit import Duration
|
669
|
+
>>> from qiskit.circuit.classical import expr
|
670
|
+
>>> expr.mul(Duration.dt(1000), 0.5)
|
671
|
+
Binary(\
|
672
|
+
Binary.Op.MUL, \
|
673
|
+
Value(Duration.dt(1000), Duration()), \
|
674
|
+
Value(0.5, Float()), \
|
675
|
+
Duration())
|
676
|
+
"""
|
677
|
+
left, right = _lift_binary_operands(left, right)
|
678
|
+
type: types.Type
|
679
|
+
if left.type.kind is right.type.kind is types.Duration:
|
680
|
+
raise TypeError("cannot multiply two durations")
|
681
|
+
if left.type.kind is right.type.kind and left.type.kind in {types.Uint, types.Float}:
|
682
|
+
type = types.greater(left.type, right.type)
|
683
|
+
left = _coerce_lossless(left, type)
|
684
|
+
right = _coerce_lossless(right, type)
|
685
|
+
elif left.type.kind is types.Duration and right.type.kind in {types.Uint, types.Float}:
|
686
|
+
type = left.type
|
687
|
+
elif right.type.kind is types.Duration and left.type.kind in {types.Uint, types.Float}:
|
688
|
+
type = right.type
|
689
|
+
else:
|
690
|
+
raise TypeError(f"invalid types for '{Binary.Op.MUL}': '{left.type}' and '{right.type}'")
|
691
|
+
return Binary(
|
692
|
+
Binary.Op.MUL,
|
693
|
+
left,
|
694
|
+
right,
|
695
|
+
type,
|
696
|
+
)
|
697
|
+
|
698
|
+
|
699
|
+
def div(left: typing.Any, right: typing.Any) -> Expr:
|
700
|
+
"""Create a division expression node from the given values, resolving any implicit casts and
|
701
|
+
lifting the values into :class:`Value` nodes if required.
|
702
|
+
|
703
|
+
This can be used to divide numeric operands of the same type kind, to divide a
|
704
|
+
:class`~.types.Duration` operand by a numeric operand, or to divide two
|
705
|
+
:class`~.types.Duration` operands which yields an expression of type
|
706
|
+
:class:`~.types.Float`.
|
707
|
+
|
708
|
+
Examples:
|
709
|
+
Division of two floating point numbers::
|
710
|
+
|
711
|
+
>>> from qiskit.circuit.classical import expr
|
712
|
+
>>> expr.div(5.0, 2.0)
|
713
|
+
Binary(\
|
714
|
+
Binary.Op.DIV, \
|
715
|
+
Value(5.0, Float()), \
|
716
|
+
Value(2.0, Float()), \
|
717
|
+
Float())
|
718
|
+
|
719
|
+
Division of two durations::
|
720
|
+
|
721
|
+
>>> from qiskit.circuit import Duration
|
722
|
+
>>> from qiskit.circuit.classical import expr
|
723
|
+
>>> expr.div(Duration.dt(10000), Duration.dt(1000))
|
724
|
+
Binary(\
|
725
|
+
Binary.Op.DIV, \
|
726
|
+
Value(Duration.dt(10000), Duration()), \
|
727
|
+
Value(Duration.dt(1000), Duration()), \
|
728
|
+
Float())
|
729
|
+
|
730
|
+
|
731
|
+
Division of a duration by a float::
|
732
|
+
|
733
|
+
>>> from qiskit.circuit import Duration
|
734
|
+
>>> from qiskit.circuit.classical import expr
|
735
|
+
>>> expr.div(Duration.dt(10000), 12.0)
|
736
|
+
Binary(\
|
737
|
+
Binary.Op.DIV, \
|
738
|
+
Value(Duration.dt(10000), Duration()), \
|
739
|
+
Value(12.0, types.Float()), \
|
740
|
+
Duration())
|
741
|
+
"""
|
742
|
+
left, right = _lift_binary_operands(left, right)
|
743
|
+
type: types.Type
|
744
|
+
if left.type.kind is right.type.kind and left.type.kind in {
|
745
|
+
types.Duration,
|
746
|
+
types.Uint,
|
747
|
+
types.Float,
|
748
|
+
}:
|
749
|
+
if left.type.kind is types.Duration:
|
750
|
+
type = types.Float()
|
751
|
+
elif types.order(left.type, right.type) is not types.Ordering.NONE:
|
752
|
+
type = types.greater(left.type, right.type)
|
753
|
+
left = _coerce_lossless(left, type)
|
754
|
+
right = _coerce_lossless(right, type)
|
755
|
+
elif left.type.kind is types.Duration and right.type.kind in {types.Uint, types.Float}:
|
756
|
+
type = left.type
|
757
|
+
else:
|
758
|
+
raise TypeError(f"invalid types for '{Binary.Op.DIV}': '{left.type}' and '{right.type}'")
|
759
|
+
return Binary(
|
760
|
+
Binary.Op.DIV,
|
761
|
+
left,
|
762
|
+
right,
|
763
|
+
type,
|
764
|
+
)
|