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,229 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Tools for working with the partial ordering of the type system."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
__all__ = [
|
18
|
+
"Ordering",
|
19
|
+
"is_subtype",
|
20
|
+
"is_supertype",
|
21
|
+
"order",
|
22
|
+
"greater",
|
23
|
+
"CastKind",
|
24
|
+
"cast_kind",
|
25
|
+
]
|
26
|
+
|
27
|
+
import enum
|
28
|
+
|
29
|
+
from .types import Type, Bool, Duration, Float, Uint
|
30
|
+
|
31
|
+
|
32
|
+
# While the type system is simple, it's overkill to represent the complete partial ordering graph of
|
33
|
+
# the set of types in an explicit graph form. The strategy here is to assume that two types have no
|
34
|
+
# ordering between them, and an ordering is defined by putting a function `Type * Type -> Ordering`
|
35
|
+
# into the `_ORDERERS`.
|
36
|
+
|
37
|
+
|
38
|
+
class Ordering(enum.Enum):
|
39
|
+
"""Enumeration listing the possible relations between two types. Types only have a partial
|
40
|
+
ordering, so it's possible for two types to have no sub-typing relationship.
|
41
|
+
|
42
|
+
Note that the sub-/supertyping relationship is not the same as whether a type can be explicitly
|
43
|
+
cast from one to another."""
|
44
|
+
|
45
|
+
LESS = enum.auto()
|
46
|
+
"""The left type is a strict subtype of the right type."""
|
47
|
+
EQUAL = enum.auto()
|
48
|
+
"""The two types are equal."""
|
49
|
+
GREATER = enum.auto()
|
50
|
+
"""The left type is a strict supertype of the right type."""
|
51
|
+
NONE = enum.auto()
|
52
|
+
"""There is no typing relationship between the two types."""
|
53
|
+
|
54
|
+
def __repr__(self):
|
55
|
+
return str(self)
|
56
|
+
|
57
|
+
|
58
|
+
def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
|
59
|
+
if left.width < right.width:
|
60
|
+
return Ordering.LESS
|
61
|
+
if left.width == right.width:
|
62
|
+
return Ordering.EQUAL
|
63
|
+
return Ordering.GREATER
|
64
|
+
|
65
|
+
|
66
|
+
_ORDERERS = {
|
67
|
+
(Bool, Bool): lambda _a, _b, /: Ordering.EQUAL,
|
68
|
+
(Uint, Uint): _order_uint_uint,
|
69
|
+
(Float, Float): lambda _a, _b, /: Ordering.EQUAL,
|
70
|
+
(Duration, Duration): lambda _a, _b, /: Ordering.EQUAL,
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
def order(left: Type, right: Type, /) -> Ordering:
|
75
|
+
"""Get the ordering relationship between the two types as an enumeration value.
|
76
|
+
|
77
|
+
Examples:
|
78
|
+
Compare two :class:`Uint` types of different widths::
|
79
|
+
|
80
|
+
>>> from qiskit.circuit.classical import types
|
81
|
+
>>> types.order(types.Uint(8), types.Uint(16))
|
82
|
+
Ordering.LESS
|
83
|
+
|
84
|
+
Compare two types that have no ordering between them::
|
85
|
+
|
86
|
+
>>> types.order(types.Uint(8), types.Bool())
|
87
|
+
Ordering.NONE
|
88
|
+
"""
|
89
|
+
if (orderer := _ORDERERS.get((left.kind, right.kind))) is None:
|
90
|
+
return Ordering.NONE
|
91
|
+
return orderer(left, right)
|
92
|
+
|
93
|
+
|
94
|
+
def is_subtype(left: Type, right: Type, /, strict: bool = False) -> bool:
|
95
|
+
r"""Does the relation :math:`\text{left} \le \text{right}` hold? If there is no ordering
|
96
|
+
relation between the two types, then this returns ``False``. If ``strict``, then the equality
|
97
|
+
is also forbidden.
|
98
|
+
|
99
|
+
Examples:
|
100
|
+
Check if one type is a subclass of another::
|
101
|
+
|
102
|
+
>>> from qiskit.circuit.classical import types
|
103
|
+
>>> types.is_subtype(types.Uint(8), types.Uint(16))
|
104
|
+
True
|
105
|
+
|
106
|
+
Check if one type is a strict subclass of another::
|
107
|
+
|
108
|
+
>>> types.is_subtype(types.Bool(), types.Bool())
|
109
|
+
True
|
110
|
+
>>> types.is_subtype(types.Bool(), types.Bool(), strict=True)
|
111
|
+
False
|
112
|
+
"""
|
113
|
+
order_ = order(left, right)
|
114
|
+
return order_ is Ordering.LESS or (not strict and order_ is Ordering.EQUAL)
|
115
|
+
|
116
|
+
|
117
|
+
def is_supertype(left: Type, right: Type, /, strict: bool = False) -> bool:
|
118
|
+
r"""Does the relation :math:`\text{left} \ge \text{right}` hold? If there is no ordering
|
119
|
+
relation between the two types, then this returns ``False``. If ``strict``, then the equality
|
120
|
+
is also forbidden.
|
121
|
+
|
122
|
+
Examples:
|
123
|
+
Check if one type is a superclass of another::
|
124
|
+
|
125
|
+
>>> from qiskit.circuit.classical import types
|
126
|
+
>>> types.is_supertype(types.Uint(8), types.Uint(16))
|
127
|
+
False
|
128
|
+
|
129
|
+
Check if one type is a strict superclass of another::
|
130
|
+
|
131
|
+
>>> types.is_supertype(types.Bool(), types.Bool())
|
132
|
+
True
|
133
|
+
>>> types.is_supertype(types.Bool(), types.Bool(), strict=True)
|
134
|
+
False
|
135
|
+
"""
|
136
|
+
order_ = order(left, right)
|
137
|
+
return order_ is Ordering.GREATER or (not strict and order_ is Ordering.EQUAL)
|
138
|
+
|
139
|
+
|
140
|
+
def greater(left: Type, right: Type, /) -> Type:
|
141
|
+
"""Get the greater of the two types, assuming that there is an ordering relation between them.
|
142
|
+
Technically, this is a slightly restricted version of the concept of the 'meet' of the two
|
143
|
+
types in that the return value must be one of the inputs. In practice in the type system there
|
144
|
+
is no concept of a 'sum' type, so the 'meet' exists if and only if there is an ordering between
|
145
|
+
the two types, and is equal to the greater of the two types.
|
146
|
+
|
147
|
+
Returns:
|
148
|
+
The greater of the two types.
|
149
|
+
|
150
|
+
Raises:
|
151
|
+
TypeError: if there is no ordering relation between the two types.
|
152
|
+
|
153
|
+
Examples:
|
154
|
+
Find the greater of two :class:`Uint` types::
|
155
|
+
|
156
|
+
>>> from qiskit.circuit.classical import types
|
157
|
+
>>> types.greater(types.Uint(8), types.Uint(16))
|
158
|
+
types.Uint(16)
|
159
|
+
"""
|
160
|
+
order_ = order(left, right)
|
161
|
+
if order_ is Ordering.NONE:
|
162
|
+
raise TypeError(f"no ordering exists between '{left}' and '{right}'")
|
163
|
+
return left if order_ is Ordering.GREATER else right
|
164
|
+
|
165
|
+
|
166
|
+
class CastKind(enum.Enum):
|
167
|
+
"""A return value indicating the type of cast that can occur from one type to another."""
|
168
|
+
|
169
|
+
EQUAL = enum.auto()
|
170
|
+
"""The two types are equal; no cast node is required at all."""
|
171
|
+
IMPLICIT = enum.auto()
|
172
|
+
"""The 'from' type can be cast to the 'to' type implicitly. A :class:`~.expr.Cast` node with
|
173
|
+
``implicit==True`` is the minimum required to specify this."""
|
174
|
+
LOSSLESS = enum.auto()
|
175
|
+
"""The 'from' type can be cast to the 'to' type explicitly, and the cast will be lossless. This
|
176
|
+
requires a :class:`~.expr.Cast`` node with ``implicit=False``, but there's no danger from
|
177
|
+
inserting one."""
|
178
|
+
DANGEROUS = enum.auto()
|
179
|
+
"""The 'from' type has a defined cast to the 'to' type, but depending on the value, it may lose
|
180
|
+
data. A user would need to manually specify casts."""
|
181
|
+
NONE = enum.auto()
|
182
|
+
"""There is no casting permitted from the 'from' type to the 'to' type."""
|
183
|
+
|
184
|
+
|
185
|
+
def _uint_cast(from_: Uint, to_: Uint, /) -> CastKind:
|
186
|
+
if from_.width == to_.width:
|
187
|
+
return CastKind.EQUAL
|
188
|
+
if from_.width < to_.width:
|
189
|
+
return CastKind.LOSSLESS
|
190
|
+
return CastKind.DANGEROUS
|
191
|
+
|
192
|
+
|
193
|
+
_ALLOWED_CASTS = {
|
194
|
+
(Bool, Bool): lambda _a, _b, /: CastKind.EQUAL,
|
195
|
+
(Bool, Uint): lambda _a, _b, /: CastKind.LOSSLESS,
|
196
|
+
(Bool, Float): lambda _a, _b, /: CastKind.LOSSLESS,
|
197
|
+
(Uint, Bool): lambda _a, _b, /: CastKind.IMPLICIT,
|
198
|
+
(Uint, Uint): _uint_cast,
|
199
|
+
(Uint, Float): lambda _a, _b, /: CastKind.DANGEROUS,
|
200
|
+
(Float, Float): lambda _a, _b, /: CastKind.EQUAL,
|
201
|
+
(Float, Uint): lambda _a, _b, /: CastKind.DANGEROUS,
|
202
|
+
(Float, Bool): lambda _a, _b, /: CastKind.DANGEROUS,
|
203
|
+
(Duration, Duration): lambda _a, _b, /: CastKind.EQUAL,
|
204
|
+
}
|
205
|
+
|
206
|
+
|
207
|
+
def cast_kind(from_: Type, to_: Type, /) -> CastKind:
|
208
|
+
"""Determine the sort of cast that is required to move from the left type to the right type.
|
209
|
+
|
210
|
+
Examples:
|
211
|
+
|
212
|
+
.. plot::
|
213
|
+
:include-source:
|
214
|
+
:nofigs:
|
215
|
+
|
216
|
+
|
217
|
+
>>> from qiskit.circuit.classical import types
|
218
|
+
>>> types.cast_kind(types.Bool(), types.Bool())
|
219
|
+
<CastKind.EQUAL: 1>
|
220
|
+
>>> types.cast_kind(types.Uint(8), types.Bool())
|
221
|
+
<CastKind.IMPLICIT: 2>
|
222
|
+
>>> types.cast_kind(types.Bool(), types.Uint(8))
|
223
|
+
<CastKind.LOSSLESS: 3>
|
224
|
+
>>> types.cast_kind(types.Uint(16), types.Uint(8))
|
225
|
+
<CastKind.DANGEROUS: 4>
|
226
|
+
"""
|
227
|
+
if (coercer := _ALLOWED_CASTS.get((from_.kind, to_.kind))) is None:
|
228
|
+
return CastKind.NONE
|
229
|
+
return coercer(from_, to_)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Type-system definition for the expression tree."""
|
14
|
+
|
15
|
+
|
16
|
+
__all__ = [
|
17
|
+
"Type",
|
18
|
+
"Bool",
|
19
|
+
"Duration",
|
20
|
+
"Float",
|
21
|
+
"Uint",
|
22
|
+
]
|
23
|
+
|
24
|
+
from qiskit._accelerate.circuit.classical.types import (
|
25
|
+
Type,
|
26
|
+
Bool,
|
27
|
+
Uint,
|
28
|
+
Float,
|
29
|
+
Duration,
|
30
|
+
) # pylint: disable=unused-import
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Code from commutative_analysis pass that checks commutation relations between DAG nodes."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import List, Union, Set, Optional
|
17
|
+
|
18
|
+
from qiskit.circuit.operation import Operation
|
19
|
+
from qiskit._accelerate.commutation_checker import CommutationChecker as RustChecker
|
20
|
+
|
21
|
+
|
22
|
+
class CommutationChecker:
|
23
|
+
r"""Check commutations of two operations.
|
24
|
+
|
25
|
+
Two unitaries :math:`A` and :math:`B` on :math:`n` qubits commute if
|
26
|
+
|
27
|
+
.. math::
|
28
|
+
|
29
|
+
\frac{2^n F_{\text{process}}(AB, BA) + 1}{2^n + 1} > 1 - \varepsilon,
|
30
|
+
|
31
|
+
where
|
32
|
+
|
33
|
+
.. math::
|
34
|
+
|
35
|
+
F_{\text{process}}(U_1, U_2) = \left|\frac{\mathrm{Tr}(U_1 U_2^\dagger)}{2^n} \right|^2,
|
36
|
+
|
37
|
+
and we set :math:`\varepsilon` to :math:`10^{-12}` to account for round-off errors on
|
38
|
+
few-qubit systems. This metric is chosen for consistency with other closeness checks in
|
39
|
+
Qiskit.
|
40
|
+
|
41
|
+
When possible, commutation relations are queried from a lookup table. This is the case
|
42
|
+
for standard gates without parameters (such as :class:`.XGate` or :class:`.HGate`) or
|
43
|
+
gates with free parameters (such as :class:`.RXGate` with a :class:`.ParameterExpression` as
|
44
|
+
angle). Otherwise, a matrix-based check is performed, where two operations are said to
|
45
|
+
commute, if the average gate fidelity of performing the commutation is above a certain threshold
|
46
|
+
(see ``approximation_degree``). The result of this commutation is then added to the
|
47
|
+
cached lookup table.
|
48
|
+
"""
|
49
|
+
|
50
|
+
def __init__(
|
51
|
+
self,
|
52
|
+
standard_gate_commutations: dict = None,
|
53
|
+
cache_max_entries: int = 10**6,
|
54
|
+
*,
|
55
|
+
gates: Optional[Set[str]] = None,
|
56
|
+
):
|
57
|
+
self.cc = RustChecker(standard_gate_commutations, cache_max_entries, gates)
|
58
|
+
|
59
|
+
def commute_nodes(
|
60
|
+
self,
|
61
|
+
op1,
|
62
|
+
op2,
|
63
|
+
max_num_qubits: int = 3,
|
64
|
+
approximation_degree: float = 1.0,
|
65
|
+
) -> bool:
|
66
|
+
"""Checks if two DAGOpNodes commute."""
|
67
|
+
return self.cc.commute_nodes(op1, op2, max_num_qubits, approximation_degree)
|
68
|
+
|
69
|
+
def commute(
|
70
|
+
self,
|
71
|
+
op1: Operation,
|
72
|
+
qargs1: List,
|
73
|
+
cargs1: List,
|
74
|
+
op2: Operation,
|
75
|
+
qargs2: List,
|
76
|
+
cargs2: List,
|
77
|
+
max_num_qubits: int = 3,
|
78
|
+
approximation_degree: float = 1.0,
|
79
|
+
) -> bool:
|
80
|
+
"""
|
81
|
+
Checks if two Operations commute. The return value of `True` means that the operations
|
82
|
+
truly commute, and the return value of `False` means that either the operations do not
|
83
|
+
commute or that the commutation check was skipped (for example, when the operations
|
84
|
+
have conditions or have too many qubits).
|
85
|
+
|
86
|
+
Args:
|
87
|
+
op1: first operation.
|
88
|
+
qargs1: first operation's qubits.
|
89
|
+
cargs1: first operation's clbits.
|
90
|
+
op2: second operation.
|
91
|
+
qargs2: second operation's qubits.
|
92
|
+
cargs2: second operation's clbits.
|
93
|
+
max_num_qubits: the maximum number of qubits to consider, the check may be skipped if
|
94
|
+
the number of qubits for either operation exceeds this amount.
|
95
|
+
approximation_degree: If the average gate fidelity in between the two operations
|
96
|
+
is above this number (up to ``1e-12``) they are assumed to commute.
|
97
|
+
|
98
|
+
Returns:
|
99
|
+
bool: whether two operations commute.
|
100
|
+
"""
|
101
|
+
return self.cc.commute(
|
102
|
+
op1, qargs1, cargs1, op2, qargs2, cargs2, max_num_qubits, approximation_degree
|
103
|
+
)
|
104
|
+
|
105
|
+
def num_cached_entries(self):
|
106
|
+
"""Returns number of cached entries"""
|
107
|
+
return self.cc.num_cached_entries()
|
108
|
+
|
109
|
+
def clear_cached_commutations(self):
|
110
|
+
"""Clears the dictionary holding cached commutations"""
|
111
|
+
self.cc.clear_cached_commutations()
|
112
|
+
|
113
|
+
def check_commutation_entries(
|
114
|
+
self,
|
115
|
+
first_op: Operation,
|
116
|
+
first_qargs: List,
|
117
|
+
second_op: Operation,
|
118
|
+
second_qargs: List,
|
119
|
+
) -> Union[bool, None]:
|
120
|
+
"""Returns stored commutation relation if any
|
121
|
+
|
122
|
+
Args:
|
123
|
+
first_op: first operation.
|
124
|
+
first_qargs: first operation's qubits.
|
125
|
+
second_op: second operation.
|
126
|
+
second_qargs: second operation's qubits.
|
127
|
+
|
128
|
+
Return:
|
129
|
+
bool: True if the gates commute and false if it is not the case.
|
130
|
+
"""
|
131
|
+
return self.cc.library.check_commutation_entries(
|
132
|
+
first_op, first_qargs, second_op, second_qargs
|
133
|
+
)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Provides a commutation checker that caches the determined commutation results during this session """
|
14
|
+
|
15
|
+
from qiskit.circuit import CommutationChecker
|
16
|
+
|
17
|
+
from qiskit.circuit._standard_gates_commutations import standard_gates_commutations
|
18
|
+
|
19
|
+
StandardGateCommutations = standard_gates_commutations
|
20
|
+
SessionCommutationChecker = CommutationChecker(StandardGateCommutations)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Instruction sub-classes for dynamic circuits."""
|
14
|
+
|
15
|
+
|
16
|
+
from ._builder_utils import condition_resources, node_resources, LegacyResources
|
17
|
+
from .control_flow import ControlFlowOp
|
18
|
+
from .continue_loop import ContinueLoopOp
|
19
|
+
from .break_loop import BreakLoopOp
|
20
|
+
|
21
|
+
from .box import BoxOp
|
22
|
+
from .if_else import IfElseOp
|
23
|
+
from .while_loop import WhileLoopOp
|
24
|
+
from .for_loop import ForLoopOp
|
25
|
+
from .switch_case import SwitchCaseOp, CASE_DEFAULT
|
26
|
+
|
27
|
+
|
28
|
+
CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case", "box"))
|
29
|
+
"""Set of the instruction names of Qiskit's known control-flow operations."""
|
30
|
+
|
31
|
+
|
32
|
+
def get_control_flow_name_mapping():
|
33
|
+
"""Return a dictionary mapping the names of control-flow operations
|
34
|
+
to their corresponding classes."
|
35
|
+
|
36
|
+
Examples:
|
37
|
+
|
38
|
+
.. code-block:: python
|
39
|
+
|
40
|
+
from qiskit.circuit import get_control_flow_name_mapping
|
41
|
+
|
42
|
+
ctrl_flow_name_map = get_control_flow_name_mapping()
|
43
|
+
if_else_object = ctrl_flow_name_map["if_else"]
|
44
|
+
|
45
|
+
print(if_else_object)
|
46
|
+
|
47
|
+
.. code-block:: text
|
48
|
+
|
49
|
+
<class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
|
50
|
+
"""
|
51
|
+
|
52
|
+
name_mapping = {
|
53
|
+
"if_else": IfElseOp,
|
54
|
+
"while_loop": WhileLoopOp,
|
55
|
+
"for_loop": ForLoopOp,
|
56
|
+
"switch_case": SwitchCaseOp,
|
57
|
+
"box": BoxOp,
|
58
|
+
}
|
59
|
+
return name_mapping
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
"""Private utility functions that are used by the builder interfaces."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import dataclasses
|
18
|
+
from typing import Iterable, Tuple, Set, Union, TypeVar, TYPE_CHECKING
|
19
|
+
|
20
|
+
from qiskit.circuit import ( # pylint: disable=cyclic-import
|
21
|
+
ClassicalRegister,
|
22
|
+
Clbit,
|
23
|
+
QuantumRegister,
|
24
|
+
)
|
25
|
+
from qiskit.circuit.classical import expr, types
|
26
|
+
from qiskit.circuit.exceptions import CircuitError
|
27
|
+
|
28
|
+
if TYPE_CHECKING:
|
29
|
+
from qiskit.circuit import QuantumCircuit, Register
|
30
|
+
|
31
|
+
_ConditionT = TypeVar(
|
32
|
+
"_ConditionT", bound=Union[Tuple[ClassicalRegister, int], Tuple[Clbit, int], expr.Expr]
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
def validate_condition(condition: _ConditionT) -> _ConditionT:
|
37
|
+
"""Validate that a condition is in a valid format and return it, but raise if it is invalid.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
condition: the condition to be tested for validity. Must be either the legacy 2-tuple
|
41
|
+
format, or a :class:`~.expr.Expr` that has `Bool` type.
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
CircuitError: if the condition is not in a valid format.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
The same condition as passed, if it was valid.
|
48
|
+
"""
|
49
|
+
if isinstance(condition, expr.Expr):
|
50
|
+
if condition.type.kind is not types.Bool:
|
51
|
+
raise CircuitError(
|
52
|
+
"Classical conditions must be expressions with the type 'Bool()',"
|
53
|
+
f" not '{condition.type}'."
|
54
|
+
)
|
55
|
+
return condition
|
56
|
+
try:
|
57
|
+
bits, value = condition
|
58
|
+
if isinstance(bits, (ClassicalRegister, Clbit)) and isinstance(value, int):
|
59
|
+
return (bits, value)
|
60
|
+
except (TypeError, ValueError):
|
61
|
+
pass
|
62
|
+
raise CircuitError(
|
63
|
+
"A classical condition should be a 2-tuple of `(ClassicalRegister | Clbit, int)`,"
|
64
|
+
f" but received '{condition!r}'."
|
65
|
+
)
|
66
|
+
|
67
|
+
|
68
|
+
@dataclasses.dataclass
|
69
|
+
class LegacyResources:
|
70
|
+
"""A pair of the :class:`.Clbit` and :class:`.ClassicalRegister` resources used by some other
|
71
|
+
object (such as a legacy condition or :class:`.expr.Expr` node)."""
|
72
|
+
|
73
|
+
clbits: tuple[Clbit, ...]
|
74
|
+
cregs: tuple[ClassicalRegister, ...]
|
75
|
+
|
76
|
+
|
77
|
+
def node_resources(node: expr.Expr) -> LegacyResources:
|
78
|
+
"""Get the legacy classical resources (:class:`.Clbit` and :class:`.ClassicalRegister`)
|
79
|
+
referenced by an :class:`~.expr.Expr`."""
|
80
|
+
# It's generally convenient for us to ensure that the resources are returned in some
|
81
|
+
# deterministic order. This uses the ordering of 'dict' objects to fake out an ordered set.
|
82
|
+
clbits = {}
|
83
|
+
cregs = {}
|
84
|
+
for var in expr.iter_vars(node):
|
85
|
+
if isinstance(var.var, Clbit):
|
86
|
+
clbits[var.var] = None
|
87
|
+
elif isinstance(var.var, ClassicalRegister):
|
88
|
+
clbits.update((bit, None) for bit in var.var)
|
89
|
+
cregs[var.var] = None
|
90
|
+
return LegacyResources(tuple(clbits), tuple(cregs))
|
91
|
+
|
92
|
+
|
93
|
+
def condition_resources(
|
94
|
+
condition: tuple[ClassicalRegister, int] | tuple[Clbit, int] | expr.Expr
|
95
|
+
) -> LegacyResources:
|
96
|
+
"""Get the legacy classical resources (:class:`.Clbit` and :class:`.ClassicalRegister`)
|
97
|
+
referenced by a legacy condition or an :class:`~.expr.Expr`."""
|
98
|
+
if isinstance(condition, expr.Expr):
|
99
|
+
return node_resources(condition)
|
100
|
+
target, _ = condition
|
101
|
+
if isinstance(target, ClassicalRegister):
|
102
|
+
return LegacyResources(tuple(target), (target,))
|
103
|
+
return LegacyResources((target,), ())
|
104
|
+
|
105
|
+
|
106
|
+
def partition_registers(
|
107
|
+
registers: Iterable[Register],
|
108
|
+
) -> Tuple[Set[QuantumRegister], Set[ClassicalRegister]]:
|
109
|
+
"""Partition a sequence of registers into its quantum and classical registers."""
|
110
|
+
qregs = set()
|
111
|
+
cregs = set()
|
112
|
+
for register in registers:
|
113
|
+
if isinstance(register, QuantumRegister):
|
114
|
+
qregs.add(register)
|
115
|
+
elif isinstance(register, ClassicalRegister):
|
116
|
+
cregs.add(register)
|
117
|
+
else:
|
118
|
+
# Purely defensive against Terra expansion.
|
119
|
+
raise CircuitError(f"Unknown register: {register}.")
|
120
|
+
return qregs, cregs
|
121
|
+
|
122
|
+
|
123
|
+
def unify_circuit_resources(circuits: Iterable[QuantumCircuit]) -> Iterable[QuantumCircuit]:
|
124
|
+
"""
|
125
|
+
Ensure that all the given ``circuits`` have all the same qubits, clbits and registers, and
|
126
|
+
that they are defined in the same order. The order is important for binding when the bodies are
|
127
|
+
used in the 3-tuple :obj:`.Instruction` context.
|
128
|
+
|
129
|
+
This function will preferentially try to mutate its inputs if they share an ordering, but if
|
130
|
+
not, it will rebuild two new circuits. This is to avoid coupling too tightly to the inner
|
131
|
+
class; there is no real support for deleting or re-ordering bits within a :obj:`.QuantumCircuit`
|
132
|
+
context, and we don't want to rely on the *current* behavior of the private APIs, since they
|
133
|
+
are very liable to change. No matter the method used, circuits with unified bits and registers
|
134
|
+
are returned.
|
135
|
+
"""
|
136
|
+
circuits = tuple(circuits)
|
137
|
+
if len(circuits) < 2:
|
138
|
+
return circuits
|
139
|
+
qubits = []
|
140
|
+
clbits = []
|
141
|
+
for circuit in circuits:
|
142
|
+
if circuit.qubits[: len(qubits)] != qubits:
|
143
|
+
return _unify_circuit_resources_rebuild(circuits)
|
144
|
+
if circuit.clbits[: len(qubits)] != clbits:
|
145
|
+
return _unify_circuit_resources_rebuild(circuits)
|
146
|
+
if circuit.num_qubits > len(qubits):
|
147
|
+
qubits = list(circuit.qubits)
|
148
|
+
if circuit.num_clbits > len(clbits):
|
149
|
+
clbits = list(circuit.clbits)
|
150
|
+
for circuit in circuits:
|
151
|
+
circuit.add_bits(qubits[circuit.num_qubits :])
|
152
|
+
circuit.add_bits(clbits[circuit.num_clbits :])
|
153
|
+
return _unify_circuit_registers(circuits)
|
154
|
+
|
155
|
+
|
156
|
+
def _unify_circuit_resources_rebuild( # pylint: disable=invalid-name # (it's too long?!)
|
157
|
+
circuits: Tuple[QuantumCircuit, ...]
|
158
|
+
) -> Tuple[QuantumCircuit, QuantumCircuit]:
|
159
|
+
"""
|
160
|
+
Ensure that all the given circuits have all the same qubits and clbits, and that they
|
161
|
+
are defined in the same order. The order is important for binding when the bodies are used in
|
162
|
+
the 3-tuple :obj:`.Instruction` context.
|
163
|
+
|
164
|
+
This function will always rebuild the objects into new :class:`.QuantumCircuit` instances.
|
165
|
+
"""
|
166
|
+
# pylint: disable=cyclic-import
|
167
|
+
from qiskit.circuit import QuantumCircuit
|
168
|
+
|
169
|
+
qubits, clbits = set(), set()
|
170
|
+
for circuit in circuits:
|
171
|
+
qubits.update(circuit.qubits)
|
172
|
+
clbits.update(circuit.clbits)
|
173
|
+
qubits, clbits = list(qubits), list(clbits)
|
174
|
+
|
175
|
+
# We use the inner `_append` method because everything is already resolved in the builders.
|
176
|
+
out_circuits = []
|
177
|
+
for circuit in circuits:
|
178
|
+
out = QuantumCircuit(
|
179
|
+
qubits,
|
180
|
+
clbits,
|
181
|
+
*circuit.qregs,
|
182
|
+
*circuit.cregs,
|
183
|
+
global_phase=circuit.global_phase,
|
184
|
+
inputs=circuit.iter_input_vars(),
|
185
|
+
captures=circuit.iter_captures(),
|
186
|
+
)
|
187
|
+
for var in circuit.iter_declared_vars():
|
188
|
+
out.add_uninitialized_var(var)
|
189
|
+
for stretch in circuit.iter_declared_stretches():
|
190
|
+
out.add_stretch(stretch)
|
191
|
+
for instruction in circuit.data:
|
192
|
+
out._append(instruction)
|
193
|
+
out_circuits.append(out)
|
194
|
+
return _unify_circuit_registers(out_circuits)
|
195
|
+
|
196
|
+
|
197
|
+
def _unify_circuit_registers(circuits: Iterable[QuantumCircuit]) -> Iterable[QuantumCircuit]:
|
198
|
+
"""
|
199
|
+
Ensure that ``true_body`` and ``false_body`` have the same registers defined within them. These
|
200
|
+
do not need to be in the same order between circuits. The two input circuits are returned,
|
201
|
+
mutated to have the same registers.
|
202
|
+
"""
|
203
|
+
circuits = tuple(circuits)
|
204
|
+
total_registers = set()
|
205
|
+
for circuit in circuits:
|
206
|
+
total_registers.update(circuit.qregs)
|
207
|
+
total_registers.update(circuit.cregs)
|
208
|
+
for circuit in circuits:
|
209
|
+
for register in total_registers - set(circuit.qregs) - set(circuit.cregs):
|
210
|
+
circuit.add_register(register)
|
211
|
+
return circuits
|