qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,411 @@
|
|
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
|
+
"""Circuit operation representing an ``switch/case`` statement."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
__all__ = ("SwitchCaseOp", "CASE_DEFAULT")
|
18
|
+
|
19
|
+
import contextlib
|
20
|
+
from typing import Union, Iterable, Any, Tuple, Optional, List, Literal, TYPE_CHECKING
|
21
|
+
|
22
|
+
from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
|
23
|
+
from qiskit.circuit.classical import expr, types
|
24
|
+
from qiskit.circuit.exceptions import CircuitError
|
25
|
+
|
26
|
+
from .builder import InstructionPlaceholder, InstructionResources, ControlFlowBuilderBlock
|
27
|
+
from .control_flow import ControlFlowOp
|
28
|
+
from ._builder_utils import unify_circuit_resources, partition_registers, node_resources
|
29
|
+
|
30
|
+
if TYPE_CHECKING:
|
31
|
+
from qiskit.circuit import QuantumCircuit
|
32
|
+
|
33
|
+
|
34
|
+
class _DefaultCaseType:
|
35
|
+
# Note: Sphinx uses the docstring of this singleton class object as the documentation of the
|
36
|
+
# `CASE_DEFAULT` object.
|
37
|
+
|
38
|
+
"""A special object that represents the "default" case of a switch statement. If you use this
|
39
|
+
as a case target, it must be the last case, and will match anything that wasn't already matched.
|
40
|
+
When using the builder interface of :meth:`.QuantumCircuit.switch`, this can also be accessed as
|
41
|
+
the ``DEFAULT`` attribute of the bound case-builder object."""
|
42
|
+
|
43
|
+
def __repr__(self):
|
44
|
+
return "<default case>"
|
45
|
+
|
46
|
+
|
47
|
+
CASE_DEFAULT = _DefaultCaseType()
|
48
|
+
|
49
|
+
|
50
|
+
class SwitchCaseOp(ControlFlowOp):
|
51
|
+
"""A circuit operation that executes one particular circuit block based on matching a given
|
52
|
+
``target`` against an ordered list of ``values``. The special value :data:`.CASE_DEFAULT` can
|
53
|
+
be used to represent a default condition.
|
54
|
+
"""
|
55
|
+
|
56
|
+
def __init__(
|
57
|
+
self,
|
58
|
+
target: Clbit | ClassicalRegister | expr.Expr,
|
59
|
+
cases: Iterable[Tuple[Any, QuantumCircuit]],
|
60
|
+
*,
|
61
|
+
label: Optional[str] = None,
|
62
|
+
):
|
63
|
+
"""
|
64
|
+
Args:
|
65
|
+
target: the real-time value to switch on.
|
66
|
+
cases: an ordered iterable of the corresponding value of the ``target`` and the circuit
|
67
|
+
block that should be executed if this is matched. There is no fall-through between
|
68
|
+
blocks, and the order matters.
|
69
|
+
"""
|
70
|
+
# pylint: disable=cyclic-import
|
71
|
+
from qiskit.circuit import QuantumCircuit
|
72
|
+
|
73
|
+
if isinstance(target, expr.Expr):
|
74
|
+
if target.type.kind not in (types.Uint, types.Bool):
|
75
|
+
raise CircuitError(
|
76
|
+
"the switch target must be an expression with type 'Uint(n)' or 'Bool()',"
|
77
|
+
f" not '{target.type}'"
|
78
|
+
)
|
79
|
+
elif not isinstance(target, (Clbit, ClassicalRegister)):
|
80
|
+
raise CircuitError("the switch target must be a classical bit or register")
|
81
|
+
|
82
|
+
if isinstance(target, expr.Expr):
|
83
|
+
target_bits = 1 if target.type.kind is types.Bool else target.type.width
|
84
|
+
else:
|
85
|
+
target_bits = 1 if isinstance(target, Clbit) else len(target)
|
86
|
+
target_max = (1 << target_bits) - 1
|
87
|
+
|
88
|
+
case_ids = set()
|
89
|
+
num_qubits, num_clbits = None, None
|
90
|
+
self.target = target
|
91
|
+
self._case_map = {}
|
92
|
+
"""Mapping of individual jump values to block indices. This level of indirection is to let
|
93
|
+
us more easily track the case of multiple labels pointing to the same circuit object, so
|
94
|
+
it's easier for things like `assign_parameters`, which need to touch each circuit object
|
95
|
+
exactly once, to function."""
|
96
|
+
self._label_spec: List[Tuple[Union[int, Literal[CASE_DEFAULT]], ...]] = []
|
97
|
+
"""List of the normalized jump value specifiers. This is a list of tuples, where each tuple
|
98
|
+
contains the values, and the indexing is the same as the values of `_case_map` and
|
99
|
+
`_params`."""
|
100
|
+
self._params = []
|
101
|
+
"""List of the circuit bodies used. This form makes it simpler for things like
|
102
|
+
:meth:`.replace_blocks` and :class:`.QuantumCircuit.assign_parameters` to do their jobs
|
103
|
+
without accidentally mutating the same circuit instance more than once."""
|
104
|
+
for i, (value_spec, case_) in enumerate(cases):
|
105
|
+
values = tuple(value_spec) if isinstance(value_spec, (tuple, list)) else (value_spec,)
|
106
|
+
for value in values:
|
107
|
+
if value in self._case_map:
|
108
|
+
raise CircuitError(f"duplicate case value {value}")
|
109
|
+
if CASE_DEFAULT in self._case_map:
|
110
|
+
raise CircuitError("cases after the default are unreachable")
|
111
|
+
if value is not CASE_DEFAULT:
|
112
|
+
if not isinstance(value, int) or value < 0:
|
113
|
+
raise CircuitError("case values must be Booleans or non-negative integers")
|
114
|
+
if value > target_max:
|
115
|
+
raise CircuitError(
|
116
|
+
f"switch target '{target}' has {target_bits} bit(s) of precision,"
|
117
|
+
f" but case {value} is larger than the maximum of {target_max}."
|
118
|
+
)
|
119
|
+
self._case_map[value] = i
|
120
|
+
self._label_spec.append(values)
|
121
|
+
if not isinstance(case_, QuantumCircuit):
|
122
|
+
raise CircuitError("case blocks must be QuantumCircuit instances")
|
123
|
+
if id(case_) in case_ids:
|
124
|
+
raise CircuitError("ungrouped cases cannot point to the same block")
|
125
|
+
case_ids.add(id(case_))
|
126
|
+
if num_qubits is None:
|
127
|
+
num_qubits, num_clbits = case_.num_qubits, case_.num_clbits
|
128
|
+
if case_.num_qubits != num_qubits or case_.num_clbits != num_clbits:
|
129
|
+
raise CircuitError("incompatible bits between cases")
|
130
|
+
self._params.append(case_)
|
131
|
+
if not self._params:
|
132
|
+
# This condition also implies that `num_qubits` and `num_clbits` must be non-None.
|
133
|
+
raise CircuitError("must have at least one case to run")
|
134
|
+
|
135
|
+
super().__init__("switch_case", num_qubits, num_clbits, self._params, label=label)
|
136
|
+
|
137
|
+
def __eq__(self, other):
|
138
|
+
# The general __eq__ will compare the blocks in the right order, so we just need to ensure
|
139
|
+
# that all the labels point the right way as well.
|
140
|
+
return (
|
141
|
+
super().__eq__(other)
|
142
|
+
and self.target == other.target
|
143
|
+
and all(
|
144
|
+
set(labels_self) == set(labels_other)
|
145
|
+
for labels_self, labels_other in zip(self._label_spec, other._label_spec)
|
146
|
+
)
|
147
|
+
)
|
148
|
+
|
149
|
+
def cases_specifier(self) -> Iterable[Tuple[Tuple, QuantumCircuit]]:
|
150
|
+
"""Return an iterable where each element is a 2-tuple whose first element is a tuple of
|
151
|
+
jump values, and whose second is the single circuit block that is associated with those
|
152
|
+
values.
|
153
|
+
|
154
|
+
This is an abstract specification of the jump table suitable for creating new
|
155
|
+
:class:`.SwitchCaseOp` instances.
|
156
|
+
|
157
|
+
.. seealso::
|
158
|
+
:meth:`.SwitchCaseOp.cases`
|
159
|
+
Create a lookup table that you can use for your own purposes to jump from values to
|
160
|
+
the circuit that would be executed."""
|
161
|
+
return zip(self._label_spec, self._params)
|
162
|
+
|
163
|
+
def cases(self):
|
164
|
+
"""Return a lookup table from case labels to the circuit that would be executed in that
|
165
|
+
case. This object is not generally suitable for creating a new :class:`.SwitchCaseOp`
|
166
|
+
because any keys that point to the same object will not be grouped.
|
167
|
+
|
168
|
+
.. seealso::
|
169
|
+
:meth:`.SwitchCaseOp.cases_specifier`
|
170
|
+
An alternate method that produces its output in a suitable format for creating new
|
171
|
+
:class:`.SwitchCaseOp` instances.
|
172
|
+
"""
|
173
|
+
return {key: self._params[index] for key, index in self._case_map.items()}
|
174
|
+
|
175
|
+
@property
|
176
|
+
def blocks(self):
|
177
|
+
return tuple(self._params)
|
178
|
+
|
179
|
+
def replace_blocks(self, blocks: Iterable[QuantumCircuit]) -> "SwitchCaseOp":
|
180
|
+
blocks = tuple(blocks)
|
181
|
+
if len(blocks) != len(self._params):
|
182
|
+
raise CircuitError(f"needed {len(self._case_map)} blocks but received {len(blocks)}")
|
183
|
+
return SwitchCaseOp(self.target, zip(self._label_spec, blocks))
|
184
|
+
|
185
|
+
|
186
|
+
class SwitchCasePlaceholder(InstructionPlaceholder):
|
187
|
+
"""A placeholder instruction to use in control-flow context managers, when calculating the
|
188
|
+
number of resources this instruction should block is deferred until the construction of the
|
189
|
+
outer loop.
|
190
|
+
|
191
|
+
This generally should not be instantiated manually; only :obj:`.SwitchContext` should do it when
|
192
|
+
it needs to defer creation of the concrete instruction.
|
193
|
+
|
194
|
+
.. warning::
|
195
|
+
|
196
|
+
This is an internal interface and no part of it should be relied upon outside of Qiskit
|
197
|
+
Terra.
|
198
|
+
"""
|
199
|
+
|
200
|
+
def __init__(
|
201
|
+
self,
|
202
|
+
target: Clbit | ClassicalRegister | expr.Expr,
|
203
|
+
cases: List[Tuple[Any, ControlFlowBuilderBlock]],
|
204
|
+
*,
|
205
|
+
label: Optional[str] = None,
|
206
|
+
):
|
207
|
+
self.__target = target
|
208
|
+
self.__cases = cases
|
209
|
+
self.__resources = self._calculate_placeholder_resources()
|
210
|
+
super().__init__(
|
211
|
+
"switch_case",
|
212
|
+
len(self.__resources.qubits),
|
213
|
+
len(self.__resources.clbits),
|
214
|
+
[],
|
215
|
+
label=label,
|
216
|
+
)
|
217
|
+
|
218
|
+
def _calculate_placeholder_resources(self):
|
219
|
+
qubits = set()
|
220
|
+
clbits = set()
|
221
|
+
qregs = set()
|
222
|
+
cregs = set()
|
223
|
+
if isinstance(self.__target, Clbit):
|
224
|
+
clbits.add(self.__target)
|
225
|
+
elif isinstance(self.__target, ClassicalRegister):
|
226
|
+
clbits.update(self.__target)
|
227
|
+
cregs.add(self.__target)
|
228
|
+
else:
|
229
|
+
resources = node_resources(self.__target)
|
230
|
+
clbits.update(resources.clbits)
|
231
|
+
cregs.update(resources.cregs)
|
232
|
+
for _, body in self.__cases:
|
233
|
+
qubits |= body.qubits()
|
234
|
+
clbits |= body.clbits()
|
235
|
+
body_qregs, body_cregs = partition_registers(body.registers)
|
236
|
+
qregs |= body_qregs
|
237
|
+
cregs |= body_cregs
|
238
|
+
return InstructionResources(
|
239
|
+
qubits=tuple(qubits),
|
240
|
+
clbits=tuple(clbits),
|
241
|
+
qregs=tuple(qregs),
|
242
|
+
cregs=tuple(cregs),
|
243
|
+
)
|
244
|
+
|
245
|
+
def placeholder_resources(self):
|
246
|
+
return self.__resources
|
247
|
+
|
248
|
+
def concrete_instruction(self, qubits, clbits):
|
249
|
+
cases = [
|
250
|
+
(labels, unified_body)
|
251
|
+
for (labels, _), unified_body in zip(
|
252
|
+
self.__cases,
|
253
|
+
unify_circuit_resources(body.build(qubits, clbits) for _, body in self.__cases),
|
254
|
+
)
|
255
|
+
]
|
256
|
+
if cases:
|
257
|
+
resources = InstructionResources(
|
258
|
+
qubits=tuple(cases[0][1].qubits),
|
259
|
+
clbits=tuple(cases[0][1].clbits),
|
260
|
+
qregs=tuple(cases[0][1].qregs),
|
261
|
+
cregs=tuple(cases[0][1].cregs),
|
262
|
+
)
|
263
|
+
else:
|
264
|
+
resources = self.__resources
|
265
|
+
return (
|
266
|
+
SwitchCaseOp(self.__target, cases, label=self.label),
|
267
|
+
resources,
|
268
|
+
)
|
269
|
+
|
270
|
+
|
271
|
+
class SwitchContext:
|
272
|
+
"""A context manager for building up ``switch`` statements onto circuits in a natural order,
|
273
|
+
without having to construct the case bodies first.
|
274
|
+
|
275
|
+
The return value of this context manager can be used within the created context to build up the
|
276
|
+
individual ``case`` statements. No other instructions should be appended to the circuit during
|
277
|
+
the `switch` context.
|
278
|
+
|
279
|
+
This context should almost invariably be created by a :meth:`.QuantumCircuit.switch_case` call,
|
280
|
+
and the resulting instance is a "friend" of the calling circuit. The context will manipulate
|
281
|
+
the circuit's defined scopes when it is entered (by pushing a new scope onto the stack) and
|
282
|
+
exited (by popping its scope, building it, and appending the resulting :obj:`.SwitchCaseOp`).
|
283
|
+
|
284
|
+
.. warning::
|
285
|
+
|
286
|
+
This is an internal interface and no part of it should be relied upon outside of Qiskit
|
287
|
+
Terra.
|
288
|
+
"""
|
289
|
+
|
290
|
+
def __init__(
|
291
|
+
self,
|
292
|
+
circuit: QuantumCircuit,
|
293
|
+
target: Clbit | ClassicalRegister | expr.Expr,
|
294
|
+
*,
|
295
|
+
in_loop: bool,
|
296
|
+
label: Optional[str] = None,
|
297
|
+
):
|
298
|
+
self.circuit = circuit
|
299
|
+
self._target = target
|
300
|
+
if isinstance(target, Clbit):
|
301
|
+
self.target_clbits: tuple[Clbit, ...] = (target,)
|
302
|
+
self.target_cregs: tuple[ClassicalRegister, ...] = ()
|
303
|
+
elif isinstance(target, ClassicalRegister):
|
304
|
+
self.target_clbits = tuple(target)
|
305
|
+
self.target_cregs = (target,)
|
306
|
+
else:
|
307
|
+
resources = node_resources(target)
|
308
|
+
self.target_clbits = resources.clbits
|
309
|
+
self.target_cregs = resources.cregs
|
310
|
+
self.in_loop = in_loop
|
311
|
+
self.complete = False
|
312
|
+
self._op_label = label
|
313
|
+
self._cases: List[Tuple[Tuple[Any, ...], ControlFlowBuilderBlock]] = []
|
314
|
+
self._label_set = set()
|
315
|
+
|
316
|
+
def label_in_use(self, label):
|
317
|
+
"""Return whether a case label is already accounted for in the switch statement."""
|
318
|
+
return label in self._label_set
|
319
|
+
|
320
|
+
def add_case(
|
321
|
+
self, labels: Tuple[Union[int, Literal[CASE_DEFAULT]], ...], block: ControlFlowBuilderBlock
|
322
|
+
):
|
323
|
+
"""Add a sequence of conditions and the single block that should be run if they are
|
324
|
+
triggered to the context. The labels are assumed to have already been validated using
|
325
|
+
:meth:`label_in_use`."""
|
326
|
+
# The labels were already validated when the case scope was entered, so we don't need to do
|
327
|
+
# it again.
|
328
|
+
self._label_set.update(labels)
|
329
|
+
self._cases.append((labels, block))
|
330
|
+
|
331
|
+
def __enter__(self):
|
332
|
+
self.circuit._push_scope(forbidden_message="Cannot have instructions outside a case")
|
333
|
+
return CaseBuilder(self)
|
334
|
+
|
335
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
336
|
+
self.complete = True
|
337
|
+
# The popped scope should be the forbidden scope.
|
338
|
+
self.circuit._pop_scope()
|
339
|
+
if exc_type is not None:
|
340
|
+
return False
|
341
|
+
# If we're in a loop-builder context, we need to emit a placeholder so that any `break` or
|
342
|
+
# `continue`s in any of our cases can be expanded when the loop-builder. If we're not, we
|
343
|
+
# need to emit a concrete instruction immediately.
|
344
|
+
placeholder = SwitchCasePlaceholder(self._target, self._cases, label=self._op_label)
|
345
|
+
initial_resources = placeholder.placeholder_resources()
|
346
|
+
if self.in_loop:
|
347
|
+
self.circuit.append(placeholder, initial_resources.qubits, initial_resources.clbits)
|
348
|
+
else:
|
349
|
+
operation, resources = placeholder.concrete_instruction(
|
350
|
+
set(initial_resources.qubits), set(initial_resources.clbits)
|
351
|
+
)
|
352
|
+
self.circuit.append(operation, resources.qubits, resources.clbits)
|
353
|
+
return False
|
354
|
+
|
355
|
+
|
356
|
+
class CaseBuilder:
|
357
|
+
"""A child context manager for building up the ``case`` blocks of ``switch`` statements onto
|
358
|
+
circuits in a natural order, without having to construct the case bodies first.
|
359
|
+
|
360
|
+
This context should never need to be created manually by a user; it is the return value of the
|
361
|
+
:class:`.SwitchContext` context manager, which in turn should only be created by suitable
|
362
|
+
:meth:`.QuantumCircuit.switch_case` calls.
|
363
|
+
|
364
|
+
.. warning::
|
365
|
+
|
366
|
+
This is an internal interface and no part of it should be relied upon outside of Qiskit
|
367
|
+
Terra.
|
368
|
+
"""
|
369
|
+
|
370
|
+
DEFAULT = CASE_DEFAULT
|
371
|
+
"""Convenient re-exposure of the :data:`.CASE_DEFAULT` constant."""
|
372
|
+
|
373
|
+
def __init__(self, parent: SwitchContext):
|
374
|
+
self.switch = parent
|
375
|
+
self.entered = False
|
376
|
+
|
377
|
+
@contextlib.contextmanager
|
378
|
+
def __call__(self, *values):
|
379
|
+
if self.entered:
|
380
|
+
raise CircuitError(
|
381
|
+
"Cannot enter more than one case at once."
|
382
|
+
" If you want multiple labels to point to the same block,"
|
383
|
+
" pass them all to a single case context,"
|
384
|
+
" such as `with case(1, 2, 3):`."
|
385
|
+
)
|
386
|
+
if self.switch.complete:
|
387
|
+
raise CircuitError("Cannot add a new case to a completed switch statement.")
|
388
|
+
if not all(value is CASE_DEFAULT or isinstance(value, int) for value in values):
|
389
|
+
raise CircuitError("Case values must be integers or `CASE_DEFAULT`")
|
390
|
+
seen = set()
|
391
|
+
for value in values:
|
392
|
+
if self.switch.label_in_use(value) or value in seen:
|
393
|
+
raise CircuitError(f"duplicate case label: '{value}'")
|
394
|
+
seen.add(value)
|
395
|
+
self.switch.circuit._push_scope(
|
396
|
+
clbits=self.switch.target_clbits,
|
397
|
+
registers=self.switch.target_cregs,
|
398
|
+
allow_jumps=self.switch.in_loop,
|
399
|
+
)
|
400
|
+
|
401
|
+
try:
|
402
|
+
self.entered = True
|
403
|
+
yield
|
404
|
+
finally:
|
405
|
+
self.entered = False
|
406
|
+
block = self.switch.circuit._pop_scope()
|
407
|
+
|
408
|
+
# This is outside the `finally` because we only want to add the case to the switch if we're
|
409
|
+
# leaving it under normal circumstances. If there was an exception in the case block, we
|
410
|
+
# should discard anything happened during its construction.
|
411
|
+
self.switch.add_case(values, block)
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Circuit operation representing a ``while`` loop."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from typing import TYPE_CHECKING
|
18
|
+
|
19
|
+
from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
|
20
|
+
from qiskit.circuit.classical import expr
|
21
|
+
from qiskit.circuit.exceptions import CircuitError
|
22
|
+
from ._builder_utils import validate_condition, condition_resources
|
23
|
+
from .control_flow import ControlFlowOp
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from qiskit.circuit import QuantumCircuit
|
27
|
+
|
28
|
+
|
29
|
+
class WhileLoopOp(ControlFlowOp):
|
30
|
+
"""A circuit operation which repeatedly executes a subcircuit (``body``) until
|
31
|
+
a condition (``condition``) evaluates as False.
|
32
|
+
|
33
|
+
The classical bits used in ``condition`` must be a subset of those attached
|
34
|
+
to ``body``.
|
35
|
+
"""
|
36
|
+
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
condition: tuple[ClassicalRegister, int] | tuple[Clbit, int] | expr.Expr,
|
40
|
+
body: QuantumCircuit,
|
41
|
+
label: str | None = None,
|
42
|
+
):
|
43
|
+
"""
|
44
|
+
Args:
|
45
|
+
condition: A condition to be checked prior to executing ``body``. Can be
|
46
|
+
specified as either a tuple of a ``ClassicalRegister`` to be tested
|
47
|
+
for equality with a given ``int``, or as a tuple of a ``Clbit`` to
|
48
|
+
be compared to either a ``bool`` or an ``int``.
|
49
|
+
body: The loop body to be repeatedly executed.
|
50
|
+
label: An optional label for identifying the instruction.
|
51
|
+
"""
|
52
|
+
num_qubits = body.num_qubits
|
53
|
+
num_clbits = body.num_clbits
|
54
|
+
|
55
|
+
super().__init__("while_loop", num_qubits, num_clbits, [body], label=label)
|
56
|
+
self._condition = validate_condition(condition)
|
57
|
+
|
58
|
+
@property
|
59
|
+
def params(self):
|
60
|
+
return self._params
|
61
|
+
|
62
|
+
@property
|
63
|
+
def condition(self):
|
64
|
+
"""The condition for the while loop."""
|
65
|
+
return self._condition
|
66
|
+
|
67
|
+
@condition.setter
|
68
|
+
def condition(self, value):
|
69
|
+
self._condition = value
|
70
|
+
|
71
|
+
@params.setter
|
72
|
+
def params(self, parameters):
|
73
|
+
# pylint: disable=cyclic-import
|
74
|
+
from qiskit.circuit import QuantumCircuit
|
75
|
+
|
76
|
+
(body,) = parameters
|
77
|
+
|
78
|
+
if not isinstance(body, QuantumCircuit):
|
79
|
+
raise CircuitError(
|
80
|
+
"WhileLoopOp expects a body parameter of type "
|
81
|
+
f"QuantumCircuit, but received {type(body)}."
|
82
|
+
)
|
83
|
+
|
84
|
+
if body.num_qubits != self.num_qubits or body.num_clbits != self.num_clbits:
|
85
|
+
raise CircuitError(
|
86
|
+
"Attempted to assign a body parameter with a num_qubits or "
|
87
|
+
"num_clbits different than that of the WhileLoopOp. "
|
88
|
+
f"WhileLoopOp num_qubits/clbits: {self.num_qubits}/{self.num_clbits} "
|
89
|
+
f"Supplied body num_qubits/clbits: {body.num_qubits}/{body.num_clbits}."
|
90
|
+
)
|
91
|
+
|
92
|
+
self._params = [body]
|
93
|
+
|
94
|
+
@property
|
95
|
+
def blocks(self):
|
96
|
+
return (self._params[0],)
|
97
|
+
|
98
|
+
def replace_blocks(self, blocks):
|
99
|
+
(body,) = blocks
|
100
|
+
return WhileLoopOp(self._condition, body, label=self.label)
|
101
|
+
|
102
|
+
|
103
|
+
class WhileLoopContext:
|
104
|
+
"""A context manager for building up while loops onto circuits in a natural order, without
|
105
|
+
having to construct the loop body first.
|
106
|
+
|
107
|
+
Within the block, a lot of the bookkeeping is done for you; you do not need to keep track of
|
108
|
+
which qubits and clbits you are using, for example. All normal methods of accessing the qubits
|
109
|
+
on the underlying :obj:`~QuantumCircuit` will work correctly, and resolve into correct accesses
|
110
|
+
within the interior block.
|
111
|
+
|
112
|
+
You generally should never need to instantiate this object directly. Instead, use
|
113
|
+
:obj:`.QuantumCircuit.while_loop` in its context-manager form, i.e. by not supplying a ``body``
|
114
|
+
or sets of qubits and clbits.
|
115
|
+
|
116
|
+
Example usage::
|
117
|
+
|
118
|
+
from qiskit.circuit import QuantumCircuit, Clbit, Qubit
|
119
|
+
bits = [Qubit(), Qubit(), Clbit()]
|
120
|
+
qc = QuantumCircuit(bits)
|
121
|
+
|
122
|
+
with qc.while_loop((bits[2], 0)):
|
123
|
+
qc.h(0)
|
124
|
+
qc.cx(0, 1)
|
125
|
+
qc.measure(0, 0)
|
126
|
+
|
127
|
+
.. warning::
|
128
|
+
|
129
|
+
This is an internal interface and no part of it should be relied upon outside of Qiskit
|
130
|
+
Terra.
|
131
|
+
"""
|
132
|
+
|
133
|
+
__slots__ = ("_circuit", "_condition", "_label")
|
134
|
+
|
135
|
+
def __init__(
|
136
|
+
self,
|
137
|
+
circuit: QuantumCircuit,
|
138
|
+
condition: tuple[ClassicalRegister, int] | tuple[Clbit, int] | expr.Expr,
|
139
|
+
*,
|
140
|
+
label: str | None = None,
|
141
|
+
):
|
142
|
+
|
143
|
+
self._circuit = circuit
|
144
|
+
self._condition = validate_condition(condition)
|
145
|
+
self._label = label
|
146
|
+
|
147
|
+
def __enter__(self):
|
148
|
+
resources = condition_resources(self._condition)
|
149
|
+
self._circuit._push_scope(clbits=resources.clbits, registers=resources.cregs)
|
150
|
+
|
151
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
152
|
+
if exc_type is not None:
|
153
|
+
# If we're leaving the context manager because an exception was raised, there's nothing
|
154
|
+
# to do except restore the circuit state.
|
155
|
+
self._circuit._pop_scope()
|
156
|
+
return False
|
157
|
+
scope = self._circuit._pop_scope()
|
158
|
+
# Loops do not need to pass any further resources in, because this scope itself defines the
|
159
|
+
# extent of ``break`` and ``continue`` statements.
|
160
|
+
body = scope.build(scope.qubits(), scope.clbits())
|
161
|
+
self._circuit.append(
|
162
|
+
WhileLoopOp(self._condition, body, label=self._label),
|
163
|
+
body.qubits,
|
164
|
+
body.clbits,
|
165
|
+
)
|
166
|
+
return False
|