qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,312 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
"""Add control to operation if supported."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
from math import pi
|
17
|
+
from qiskit.circuit.exceptions import CircuitError
|
18
|
+
from qiskit.circuit.library import UnitaryGate
|
19
|
+
from qiskit.transpiler import PassManager
|
20
|
+
from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions
|
21
|
+
from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
|
22
|
+
|
23
|
+
from . import ControlledGate, Gate, QuantumRegister, QuantumCircuit
|
24
|
+
from ._utils import _ctrl_state_to_int
|
25
|
+
|
26
|
+
|
27
|
+
def add_control(
|
28
|
+
operation: Gate | ControlledGate,
|
29
|
+
num_ctrl_qubits: int,
|
30
|
+
label: str | None,
|
31
|
+
ctrl_state: str | int | None,
|
32
|
+
) -> ControlledGate:
|
33
|
+
"""For standard gates, if the controlled version already exists in the
|
34
|
+
library, it will be returned (e.g. XGate.control() = CnotGate().
|
35
|
+
|
36
|
+
For more generic gates, this method implements the controlled
|
37
|
+
version by first decomposing into the ['u1', 'u3', 'cx'] basis, then
|
38
|
+
controlling each gate in the decomposition.
|
39
|
+
|
40
|
+
Open controls are implemented by conjugating the control line with
|
41
|
+
X gates. Adds num_ctrl_qubits controls to operation.
|
42
|
+
|
43
|
+
This function is meant to be called from the
|
44
|
+
:method:`qiskit.circuit.gate.Gate.control()` method.
|
45
|
+
|
46
|
+
Args:
|
47
|
+
operation: The operation to be controlled.
|
48
|
+
num_ctrl_qubits: The number of controls to add to gate.
|
49
|
+
label: An optional gate label.
|
50
|
+
ctrl_state: The control state in decimal or as a bitstring
|
51
|
+
(e.g. '111'). If specified as a bitstring the length
|
52
|
+
must equal num_ctrl_qubits, MSB on left. If None, use
|
53
|
+
2**num_ctrl_qubits-1.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
Controlled version of gate.
|
57
|
+
|
58
|
+
"""
|
59
|
+
if isinstance(operation, UnitaryGate):
|
60
|
+
# attempt decomposition
|
61
|
+
operation._define()
|
62
|
+
cgate = control(operation, num_ctrl_qubits=num_ctrl_qubits, label=label, ctrl_state=ctrl_state)
|
63
|
+
if operation.label is not None:
|
64
|
+
cgate.base_gate = cgate.base_gate.to_mutable()
|
65
|
+
cgate.base_gate.label = operation.label
|
66
|
+
return cgate
|
67
|
+
|
68
|
+
|
69
|
+
def control(
|
70
|
+
operation: Gate | ControlledGate,
|
71
|
+
num_ctrl_qubits: int | None = 1,
|
72
|
+
label: str | None = None,
|
73
|
+
ctrl_state: str | int | None = None,
|
74
|
+
) -> ControlledGate:
|
75
|
+
"""Return controlled version of gate using controlled rotations. This function
|
76
|
+
first checks the name of the operation to see if it knows of a method from which
|
77
|
+
to generate a controlled version. Currently, these are ``x``, ``rx``, ``ry``, and ``rz``.
|
78
|
+
If a method is not directly known, it calls the unroller to convert to `u1`, `u3`,
|
79
|
+
and `cx` gates.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
operation: The gate used to create the ControlledGate.
|
83
|
+
num_ctrl_qubits: The number of controls to add to gate (default=1).
|
84
|
+
label: An optional gate label.
|
85
|
+
ctrl_state: The control state in decimal or as
|
86
|
+
a bitstring (e.g. '111'). If specified as a bitstring the length
|
87
|
+
must equal num_ctrl_qubits, MSB on left. If None, use
|
88
|
+
2**num_ctrl_qubits-1.
|
89
|
+
|
90
|
+
Returns:
|
91
|
+
Controlled version of gate.
|
92
|
+
|
93
|
+
Raises:
|
94
|
+
CircuitError: gate contains non-gate in definition
|
95
|
+
"""
|
96
|
+
|
97
|
+
# pylint: disable=cyclic-import
|
98
|
+
from qiskit.circuit import controlledgate
|
99
|
+
|
100
|
+
ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
|
101
|
+
|
102
|
+
q_control = QuantumRegister(num_ctrl_qubits, name="control")
|
103
|
+
q_target = QuantumRegister(operation.num_qubits, name="target")
|
104
|
+
controlled_circ = QuantumCircuit(q_control, q_target, name=f"c_{operation.name}")
|
105
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
106
|
+
original_ctrl_state = operation.ctrl_state
|
107
|
+
operation = operation.to_mutable()
|
108
|
+
operation.ctrl_state = None
|
109
|
+
|
110
|
+
global_phase = 0
|
111
|
+
|
112
|
+
basis = ["p", "u", "x", "z", "y", "h", "sx", "sxdg", "rx", "ry", "rz", "cx"]
|
113
|
+
|
114
|
+
if operation.name in basis:
|
115
|
+
apply_basic_controlled_gate(controlled_circ, operation, q_control, q_target[0])
|
116
|
+
else:
|
117
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
118
|
+
operation = operation.to_mutable()
|
119
|
+
operation.ctrl_state = None
|
120
|
+
|
121
|
+
unrolled_gate = _unroll_gate(operation, basis_gates=basis)
|
122
|
+
if unrolled_gate.definition.global_phase:
|
123
|
+
global_phase += unrolled_gate.definition.global_phase
|
124
|
+
|
125
|
+
definition = unrolled_gate.definition
|
126
|
+
bit_indices = {
|
127
|
+
bit: index
|
128
|
+
for bits in [definition.qubits, definition.clbits]
|
129
|
+
for index, bit in enumerate(bits)
|
130
|
+
}
|
131
|
+
|
132
|
+
for instruction in definition.data:
|
133
|
+
gate, qargs = instruction.operation, instruction.qubits
|
134
|
+
|
135
|
+
if len(qargs) == 1:
|
136
|
+
target = q_target[bit_indices[qargs[0]]]
|
137
|
+
else:
|
138
|
+
target = [q_target[bit_indices[qarg]] for qarg in qargs]
|
139
|
+
|
140
|
+
apply_basic_controlled_gate(controlled_circ, gate, q_control, target)
|
141
|
+
|
142
|
+
if gate.definition is not None and gate.definition.global_phase and gate.name != "rz":
|
143
|
+
global_phase += gate.definition.global_phase
|
144
|
+
|
145
|
+
# apply controlled global phase
|
146
|
+
if global_phase:
|
147
|
+
if len(q_control) < 2:
|
148
|
+
controlled_circ.p(global_phase, q_control)
|
149
|
+
else:
|
150
|
+
controlled_circ.mcp(global_phase, q_control[:-1], q_control[-1])
|
151
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
152
|
+
operation.ctrl_state = original_ctrl_state
|
153
|
+
new_num_ctrl_qubits = num_ctrl_qubits + operation.num_ctrl_qubits
|
154
|
+
new_ctrl_state = operation.ctrl_state << num_ctrl_qubits | ctrl_state
|
155
|
+
base_name = operation.base_gate.name
|
156
|
+
base_gate = operation.base_gate
|
157
|
+
else:
|
158
|
+
new_num_ctrl_qubits = num_ctrl_qubits
|
159
|
+
new_ctrl_state = ctrl_state
|
160
|
+
base_name = operation.name
|
161
|
+
base_gate = operation
|
162
|
+
|
163
|
+
# In order to maintain some backward compatibility with gate names this
|
164
|
+
# uses a naming convention where if the number of controls is <=2 the gate
|
165
|
+
# is named like "cc<base_gate.name>", else it is named like
|
166
|
+
# "c<num_ctrl_qubits><base_name>".
|
167
|
+
if new_num_ctrl_qubits > 2:
|
168
|
+
ctrl_substr = f"c{new_num_ctrl_qubits:d}"
|
169
|
+
else:
|
170
|
+
ctrl_substr = ("{0}" * new_num_ctrl_qubits).format("c")
|
171
|
+
new_name = f"{ctrl_substr}{base_name}"
|
172
|
+
cgate = controlledgate.ControlledGate(
|
173
|
+
new_name,
|
174
|
+
controlled_circ.num_qubits,
|
175
|
+
operation.params,
|
176
|
+
label=label,
|
177
|
+
num_ctrl_qubits=new_num_ctrl_qubits,
|
178
|
+
definition=controlled_circ,
|
179
|
+
ctrl_state=new_ctrl_state,
|
180
|
+
base_gate=base_gate,
|
181
|
+
)
|
182
|
+
return cgate
|
183
|
+
|
184
|
+
|
185
|
+
def apply_basic_controlled_gate(circuit, gate, controls, target):
|
186
|
+
"""Apply a controlled version of ``gate`` to the circuit.
|
187
|
+
|
188
|
+
This implements multi-control operations for the following basis gates:
|
189
|
+
|
190
|
+
["p", "u", "x", "z", "y", "h", "sx", "sxdg", "rx", "ry", "rz", "cx"]
|
191
|
+
|
192
|
+
"""
|
193
|
+
num_ctrl_qubits = len(controls)
|
194
|
+
|
195
|
+
if gate.name == "x":
|
196
|
+
circuit.mcx(controls, target)
|
197
|
+
|
198
|
+
elif gate.name == "rx":
|
199
|
+
circuit.mcrx(
|
200
|
+
gate.definition.data[0].operation.params[0],
|
201
|
+
controls,
|
202
|
+
target,
|
203
|
+
use_basis_gates=False,
|
204
|
+
)
|
205
|
+
elif gate.name == "ry":
|
206
|
+
circuit.mcry(
|
207
|
+
gate.definition.data[0].operation.params[0],
|
208
|
+
controls,
|
209
|
+
target,
|
210
|
+
mode="noancilla",
|
211
|
+
use_basis_gates=False,
|
212
|
+
)
|
213
|
+
elif gate.name == "rz":
|
214
|
+
circuit.mcrz(
|
215
|
+
gate.definition.data[0].operation.params[0],
|
216
|
+
controls,
|
217
|
+
target,
|
218
|
+
use_basis_gates=False,
|
219
|
+
)
|
220
|
+
# continue
|
221
|
+
elif gate.name == "p":
|
222
|
+
from qiskit.circuit.library import MCPhaseGate
|
223
|
+
|
224
|
+
circuit.append(
|
225
|
+
MCPhaseGate(gate.params[0], num_ctrl_qubits),
|
226
|
+
controls[:] + [target],
|
227
|
+
)
|
228
|
+
elif gate.name == "cx":
|
229
|
+
circuit.mcx(
|
230
|
+
controls[:] + [target[0]], # CX has two targets
|
231
|
+
target[1],
|
232
|
+
)
|
233
|
+
elif gate.name == "u":
|
234
|
+
theta, phi, lamb = gate.params
|
235
|
+
if num_ctrl_qubits == 1:
|
236
|
+
if theta == 0 and phi == 0:
|
237
|
+
circuit.cp(lamb, controls[0], target)
|
238
|
+
else:
|
239
|
+
circuit.cu(theta, phi, lamb, 0, controls[0], target)
|
240
|
+
else:
|
241
|
+
if phi == -pi / 2 and lamb == pi / 2:
|
242
|
+
circuit.mcrx(theta, controls, target, use_basis_gates=False)
|
243
|
+
elif phi == 0 and lamb == 0:
|
244
|
+
circuit.mcry(
|
245
|
+
theta,
|
246
|
+
controls,
|
247
|
+
target,
|
248
|
+
use_basis_gates=False,
|
249
|
+
)
|
250
|
+
elif theta == 0 and phi == 0:
|
251
|
+
circuit.mcp(lamb, controls, target)
|
252
|
+
else:
|
253
|
+
circuit.mcrz(lamb, controls, target, use_basis_gates=False)
|
254
|
+
circuit.mcry(theta, controls, target, use_basis_gates=False)
|
255
|
+
circuit.mcrz(phi, controls, target, use_basis_gates=False)
|
256
|
+
circuit.mcp((phi + lamb) / 2, controls[1:], controls[0])
|
257
|
+
|
258
|
+
elif gate.name == "z":
|
259
|
+
circuit.h(target)
|
260
|
+
circuit.mcx(controls, target)
|
261
|
+
circuit.h(target)
|
262
|
+
|
263
|
+
elif gate.name == "y":
|
264
|
+
circuit.sdg(target)
|
265
|
+
circuit.mcx(controls, target)
|
266
|
+
circuit.s(target)
|
267
|
+
|
268
|
+
elif gate.name == "h":
|
269
|
+
circuit.s(target)
|
270
|
+
circuit.h(target)
|
271
|
+
circuit.t(target)
|
272
|
+
circuit.mcx(controls, target)
|
273
|
+
circuit.tdg(target)
|
274
|
+
circuit.h(target)
|
275
|
+
circuit.sdg(target)
|
276
|
+
|
277
|
+
elif gate.name == "sx":
|
278
|
+
circuit.h(target)
|
279
|
+
circuit.mcp(pi / 2, controls, target)
|
280
|
+
circuit.h(target)
|
281
|
+
|
282
|
+
elif gate.name == "sxdg":
|
283
|
+
circuit.h(target)
|
284
|
+
circuit.mcp(3 * pi / 2, controls, target)
|
285
|
+
circuit.h(target)
|
286
|
+
|
287
|
+
else:
|
288
|
+
raise CircuitError(f"Gate {gate} not in supported basis.")
|
289
|
+
|
290
|
+
|
291
|
+
def _gate_to_circuit(operation):
|
292
|
+
"""Converts a gate instance to a QuantumCircuit"""
|
293
|
+
if hasattr(operation, "definition") and operation.definition is not None:
|
294
|
+
return operation.definition
|
295
|
+
|
296
|
+
qr = QuantumRegister(operation.num_qubits)
|
297
|
+
qc = QuantumCircuit(qr, name=operation.name)
|
298
|
+
qc.append(operation, qr)
|
299
|
+
return qc
|
300
|
+
|
301
|
+
|
302
|
+
def _unroll_gate(operation, basis_gates):
|
303
|
+
"""Unrolls a gate, possibly composite, to the target basis"""
|
304
|
+
circ = _gate_to_circuit(operation)
|
305
|
+
pm = PassManager(
|
306
|
+
[
|
307
|
+
UnrollCustomDefinitions(sel, basis_gates=basis_gates),
|
308
|
+
BasisTranslator(sel, target_basis=basis_gates),
|
309
|
+
]
|
310
|
+
)
|
311
|
+
opqc = pm.run(circ)
|
312
|
+
return opqc.to_gate()
|
@@ -0,0 +1,150 @@
|
|
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
|
+
"""Shared helper utility for mapping classical resources from one circuit or DAG to another."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import typing
|
18
|
+
|
19
|
+
from . import Bit, Clbit, ClassicalRegister # pylint: disable=cyclic-import
|
20
|
+
from .classical import expr
|
21
|
+
|
22
|
+
|
23
|
+
class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
24
|
+
"""Stateful helper class that manages the mapping of variables in conditions and expressions.
|
25
|
+
|
26
|
+
This is designed to be used by both :class:`.QuantumCircuit` and :class:`.DAGCircuit` when
|
27
|
+
managing operations that need to map classical resources from one circuit to another.
|
28
|
+
|
29
|
+
The general usage is to initialise this at the start of a many-block mapping operation, then
|
30
|
+
call its :meth:`map_condition`, :meth:`map_target` or :meth:`map_expr` methods as appropriate,
|
31
|
+
which will return the new object that should be used.
|
32
|
+
|
33
|
+
If an ``add_register`` callable is given to the initializer, the mapper will use it to attempt
|
34
|
+
to add new aliasing registers to the outer circuit object, if there is not already a suitable
|
35
|
+
register for the mapping available in the circuit. If this parameter is not given, a
|
36
|
+
``ValueError`` will be raised instead. The given ``add_register`` callable may choose to raise
|
37
|
+
its own exception."""
|
38
|
+
|
39
|
+
__slots__ = ("target_cregs", "register_map", "bit_map", "var_map", "add_register")
|
40
|
+
|
41
|
+
def __init__(
|
42
|
+
self,
|
43
|
+
target_cregs: typing.Iterable[ClassicalRegister],
|
44
|
+
bit_map: typing.Mapping[Bit, Bit],
|
45
|
+
var_map: typing.Mapping[expr.Var | expr.Stretch, expr.Var | expr.Stretch] | None = None,
|
46
|
+
*,
|
47
|
+
add_register: typing.Callable[[ClassicalRegister], None] | None = None,
|
48
|
+
):
|
49
|
+
self.target_cregs = tuple(target_cregs)
|
50
|
+
self.register_map = {}
|
51
|
+
self.bit_map = bit_map
|
52
|
+
self.var_map = var_map or {}
|
53
|
+
self.add_register = add_register
|
54
|
+
|
55
|
+
def _map_register(self, theirs: ClassicalRegister) -> ClassicalRegister:
|
56
|
+
"""Map the target's registers to suitable equivalents in the destination, adding an
|
57
|
+
extra one if there's no exact match."""
|
58
|
+
if (mapped_theirs := self.register_map.get(theirs.name)) is not None:
|
59
|
+
return mapped_theirs
|
60
|
+
mapped_bits = [self.bit_map[bit] for bit in theirs]
|
61
|
+
for ours in self.target_cregs:
|
62
|
+
if mapped_bits == list(ours):
|
63
|
+
mapped_theirs = ours
|
64
|
+
break
|
65
|
+
else:
|
66
|
+
if self.add_register is None:
|
67
|
+
raise ValueError(f"Register '{theirs.name}' has no counterpart in the destination.")
|
68
|
+
mapped_theirs = ClassicalRegister(bits=mapped_bits)
|
69
|
+
self.add_register(mapped_theirs)
|
70
|
+
self.register_map[theirs.name] = mapped_theirs
|
71
|
+
return mapped_theirs
|
72
|
+
|
73
|
+
def map_condition(self, condition, /, *, allow_reorder=False):
|
74
|
+
"""Map the given ``condition`` so that it only references variables in the destination
|
75
|
+
circuit (as given to this class on initialization).
|
76
|
+
|
77
|
+
If ``allow_reorder`` is ``True``, then when a legacy condition (the two-tuple form) is made
|
78
|
+
on a register that has a counterpart in the destination with all the same (mapped) bits but
|
79
|
+
in a different order, then that register will be used and the value suitably modified to
|
80
|
+
make the equality condition work. This is maintaining legacy (tested) behavior of
|
81
|
+
:meth:`.DAGCircuit.compose`; nowhere else does this, and in general this would require *far*
|
82
|
+
more complex classical rewriting than Terra needs to worry about in the full expression era.
|
83
|
+
"""
|
84
|
+
if condition is None:
|
85
|
+
return None
|
86
|
+
if isinstance(condition, expr.Expr):
|
87
|
+
return self.map_expr(condition)
|
88
|
+
target, value = condition
|
89
|
+
if isinstance(target, Clbit):
|
90
|
+
return (self.bit_map[target], value)
|
91
|
+
if not allow_reorder:
|
92
|
+
return (self._map_register(target), value)
|
93
|
+
# This is maintaining the legacy behavior of `DAGCircuit.compose`. We don't attempt to
|
94
|
+
# speed-up this lookup with a cache, since that would just make the more standard cases more
|
95
|
+
# annoying to deal with.
|
96
|
+
mapped_bits_order = [self.bit_map[bit] for bit in target]
|
97
|
+
mapped_bits_set = set(mapped_bits_order)
|
98
|
+
for register in self.target_cregs:
|
99
|
+
if mapped_bits_set == set(register):
|
100
|
+
mapped_theirs = register
|
101
|
+
break
|
102
|
+
else:
|
103
|
+
if self.add_register is None:
|
104
|
+
raise self.exc_type(
|
105
|
+
f"Register '{target.name}' has no counterpart in the destination."
|
106
|
+
)
|
107
|
+
mapped_theirs = ClassicalRegister(bits=mapped_bits_order)
|
108
|
+
self.add_register(mapped_theirs)
|
109
|
+
new_order = {bit: i for i, bit in enumerate(mapped_bits_order)}
|
110
|
+
value_bits = f"{value:0{len(target)}b}"[::-1] # Little-index-indexed binary bitstring.
|
111
|
+
mapped_value = int("".join(value_bits[new_order[bit]] for bit in mapped_theirs)[::-1], 2)
|
112
|
+
return (mapped_theirs, mapped_value)
|
113
|
+
|
114
|
+
def map_target(self, target, /):
|
115
|
+
"""Map the real-time variables in a ``target`` of a :class:`.SwitchCaseOp` to the new
|
116
|
+
circuit, as defined in the ``circuit`` argument of the initializer of this class."""
|
117
|
+
if isinstance(target, Clbit):
|
118
|
+
return self.bit_map[target]
|
119
|
+
if isinstance(target, ClassicalRegister):
|
120
|
+
return self._map_register(target)
|
121
|
+
return self.map_expr(target)
|
122
|
+
|
123
|
+
def map_expr(self, node: expr.Expr, /) -> expr.Expr:
|
124
|
+
"""Map the variables in an :class:`~.expr.Expr` node to the new circuit."""
|
125
|
+
return node.accept(self)
|
126
|
+
|
127
|
+
def visit_var(self, node, /):
|
128
|
+
if isinstance(node.var, Clbit):
|
129
|
+
return expr.Var(self.bit_map[node.var], node.type)
|
130
|
+
if isinstance(node.var, ClassicalRegister):
|
131
|
+
return expr.Var(self._map_register(node.var), node.type)
|
132
|
+
return self.var_map.get(node, node)
|
133
|
+
|
134
|
+
def visit_stretch(self, node, /):
|
135
|
+
return self.var_map.get(node, node)
|
136
|
+
|
137
|
+
def visit_value(self, node, /):
|
138
|
+
return expr.Value(node.value, node.type)
|
139
|
+
|
140
|
+
def visit_unary(self, node, /):
|
141
|
+
return expr.Unary(node.op, node.operand.accept(self), node.type)
|
142
|
+
|
143
|
+
def visit_binary(self, node, /):
|
144
|
+
return expr.Binary(node.op, node.left.accept(self), node.right.accept(self), node.type)
|
145
|
+
|
146
|
+
def visit_cast(self, node, /):
|
147
|
+
return expr.Cast(node.operand.accept(self), node.type, implicit=node.implicit)
|
148
|
+
|
149
|
+
def visit_index(self, node, /):
|
150
|
+
return expr.Index(node.target.accept(self), node.index.accept(self), node.type)
|