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,719 @@
|
|
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
|
+
Optimized list of Pauli operators
|
14
|
+
"""
|
15
|
+
# pylint: disable=invalid-name
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import copy
|
19
|
+
from typing import Literal, TYPE_CHECKING
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.circuit import QuantumCircuit
|
24
|
+
from qiskit.circuit.barrier import Barrier
|
25
|
+
from qiskit.circuit.delay import Delay
|
26
|
+
from qiskit.exceptions import QiskitError
|
27
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
28
|
+
from qiskit.quantum_info.operators.mixins import AdjointMixin, MultiplyMixin
|
29
|
+
|
30
|
+
if TYPE_CHECKING:
|
31
|
+
from qiskit.quantum_info.operators.symplectic.clifford import Clifford
|
32
|
+
|
33
|
+
|
34
|
+
# utility for _to_matrix
|
35
|
+
_PARITY = np.array([-1 if bin(i).count("1") % 2 else 1 for i in range(256)], dtype=complex)
|
36
|
+
# Utility for `_to_label`
|
37
|
+
_TO_LABEL_CHARS = np.array([ord("I"), ord("X"), ord("Z"), ord("Y")], dtype=np.uint8)
|
38
|
+
|
39
|
+
|
40
|
+
class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
|
41
|
+
r"""Symplectic representation of a list of N-qubit Paulis.
|
42
|
+
|
43
|
+
Base class for Pauli and PauliList.
|
44
|
+
"""
|
45
|
+
|
46
|
+
def __init__(self, z: np.ndarray, x: np.ndarray, phase: np.ndarray):
|
47
|
+
"""Initialize the BasePauli.
|
48
|
+
|
49
|
+
This is an array of M N-qubit Paulis defined as
|
50
|
+
P = (-i)^phase Z^z X^x.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
z (np.ndarray): input z matrix.
|
54
|
+
x (np.ndarray): input x matrix.
|
55
|
+
phase (np.ndarray): input phase vector.
|
56
|
+
"""
|
57
|
+
self._z = z
|
58
|
+
self._x = x
|
59
|
+
self._phase = phase
|
60
|
+
self._num_paulis, num_qubits = self._z.shape
|
61
|
+
super().__init__(num_qubits=num_qubits)
|
62
|
+
|
63
|
+
def copy(self):
|
64
|
+
"""Make a deep copy of current operator."""
|
65
|
+
# Deepcopy has terrible performance on objects with Numpy arrays
|
66
|
+
# attributes so we make a shallow copy and then manually copy the
|
67
|
+
# Numpy arrays to efficiently mimic a deepcopy
|
68
|
+
ret = copy.copy(self)
|
69
|
+
ret._z = self._z.copy()
|
70
|
+
ret._x = self._x.copy()
|
71
|
+
ret._phase = self._phase.copy()
|
72
|
+
return ret
|
73
|
+
|
74
|
+
# ---------------------------------------------------------------------
|
75
|
+
# BaseOperator methods
|
76
|
+
# ---------------------------------------------------------------------
|
77
|
+
|
78
|
+
def tensor(self, other):
|
79
|
+
return self._tensor(self, other)
|
80
|
+
|
81
|
+
def expand(self, other):
|
82
|
+
return self._tensor(other, self)
|
83
|
+
|
84
|
+
@classmethod
|
85
|
+
def _tensor(cls, a, b):
|
86
|
+
x1 = cls._stack(a._x, b._num_paulis, False)
|
87
|
+
x2 = cls._stack(b._x, a._num_paulis)
|
88
|
+
z1 = cls._stack(a._z, b._num_paulis, False)
|
89
|
+
z2 = cls._stack(b._z, a._num_paulis)
|
90
|
+
phase1 = (
|
91
|
+
np.vstack(b._num_paulis * [a._phase])
|
92
|
+
.transpose(1, 0)
|
93
|
+
.reshape(a._num_paulis * b._num_paulis)
|
94
|
+
)
|
95
|
+
phase2 = cls._stack(b._phase, a._num_paulis)
|
96
|
+
z = np.hstack([z2, z1])
|
97
|
+
x = np.hstack([x2, x1])
|
98
|
+
phase = np.mod(phase1 + phase2, 4)
|
99
|
+
return BasePauli(z, x, phase)
|
100
|
+
|
101
|
+
def compose(self, other, qargs: list | None = None, front: bool = False, inplace=False):
|
102
|
+
"""Return the composition of Paulis.
|
103
|
+
|
104
|
+
Args:
|
105
|
+
a ({cls}): an operator object.
|
106
|
+
b ({cls}): an operator object.
|
107
|
+
qargs (list or None): Optional, qubits to apply dot product
|
108
|
+
on (default: None).
|
109
|
+
inplace (bool): If True update in-place (default: False).
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
{cls}: The operator a.compose(b)
|
113
|
+
|
114
|
+
Raises:
|
115
|
+
QiskitError: if number of qubits of other does not match qargs.
|
116
|
+
""".format(
|
117
|
+
cls=type(self).__name__
|
118
|
+
)
|
119
|
+
# Validation
|
120
|
+
if qargs is None and other.num_qubits != self.num_qubits:
|
121
|
+
raise QiskitError(f"other {type(self).__name__} must be on the same number of qubits.")
|
122
|
+
|
123
|
+
if qargs and other.num_qubits != len(qargs):
|
124
|
+
raise QiskitError(
|
125
|
+
f"Number of qubits of the other {type(self).__name__} does not match qargs."
|
126
|
+
)
|
127
|
+
|
128
|
+
if other._num_paulis not in [1, self._num_paulis]:
|
129
|
+
raise QiskitError(
|
130
|
+
"Incompatible BasePaulis. Second list must "
|
131
|
+
"either have 1 or the same number of Paulis."
|
132
|
+
)
|
133
|
+
|
134
|
+
# Compute phase shift
|
135
|
+
if qargs is not None:
|
136
|
+
x1, z1 = self._x[:, qargs], self._z[:, qargs]
|
137
|
+
else:
|
138
|
+
x1, z1 = self._x, self._z
|
139
|
+
x2, z2 = other._x, other._z
|
140
|
+
|
141
|
+
# Get phase shift
|
142
|
+
phase = self._phase + other._phase
|
143
|
+
if front:
|
144
|
+
phase += 2 * _count_y(x1, z2, dtype=phase.dtype)
|
145
|
+
else:
|
146
|
+
phase += 2 * _count_y(x2, z1, dtype=phase.dtype)
|
147
|
+
|
148
|
+
# Update Pauli
|
149
|
+
x = np.logical_xor(x1, x2)
|
150
|
+
z = np.logical_xor(z1, z2)
|
151
|
+
|
152
|
+
if qargs is None:
|
153
|
+
if not inplace:
|
154
|
+
return BasePauli(z, x, phase)
|
155
|
+
# Inplace update
|
156
|
+
self._x = x
|
157
|
+
self._z = z
|
158
|
+
self._phase = phase
|
159
|
+
return self
|
160
|
+
|
161
|
+
# Qargs update
|
162
|
+
ret = self if inplace else self.copy()
|
163
|
+
ret._x[:, qargs] = x
|
164
|
+
ret._z[:, qargs] = z
|
165
|
+
ret._phase = np.mod(phase, 4)
|
166
|
+
return ret
|
167
|
+
|
168
|
+
def _multiply(self, other):
|
169
|
+
"""Return the {cls} other * self.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
other (complex): a complex number in ``[1, -1j, -1, 1j]``.
|
173
|
+
|
174
|
+
Returns:
|
175
|
+
{cls}: the {cls} other * self.
|
176
|
+
|
177
|
+
Raises:
|
178
|
+
QiskitError: if the phase is not in the set ``[1, -1j, -1, 1j]``.
|
179
|
+
""".format(
|
180
|
+
cls=type(self).__name__
|
181
|
+
)
|
182
|
+
if isinstance(other, (np.ndarray, list, tuple)):
|
183
|
+
phase = np.array([self._phase_from_complex(phase) for phase in other])
|
184
|
+
else:
|
185
|
+
phase = self._phase_from_complex(other)
|
186
|
+
return BasePauli(self._z, self._x, np.mod(self._phase + phase, 4))
|
187
|
+
|
188
|
+
def conjugate(self):
|
189
|
+
"""Return the complex conjugate of the Pauli with respect to the Z basis."""
|
190
|
+
complex_phase = np.mod(self._phase, 2)
|
191
|
+
if np.all(complex_phase == 0):
|
192
|
+
return self
|
193
|
+
return BasePauli(self._z, self._x, np.mod(self._phase + 2 * complex_phase, 4))
|
194
|
+
|
195
|
+
def transpose(self):
|
196
|
+
"""Return the transpose of each Pauli in the list."""
|
197
|
+
# Transpose sets Y -> -Y. This has effect on changing the phase
|
198
|
+
parity_y = self._count_y(dtype=self._phase.dtype) % 2
|
199
|
+
if np.all(parity_y == 0):
|
200
|
+
return self
|
201
|
+
return BasePauli(self._z, self._x, np.mod(self._phase + 2 * parity_y, 4))
|
202
|
+
|
203
|
+
def commutes(self, other: BasePauli, qargs: list | None = None) -> np.ndarray:
|
204
|
+
"""Return ``True`` if Pauli commutes with ``other``.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
other (BasePauli): another BasePauli operator.
|
208
|
+
qargs (list): qubits to apply dot product on (default: ``None``).
|
209
|
+
|
210
|
+
Returns:
|
211
|
+
np.array: Boolean array of ``True`` if Paulis commute, ``False`` if
|
212
|
+
they anti-commute.
|
213
|
+
|
214
|
+
Raises:
|
215
|
+
QiskitError: if number of qubits of ``other`` does not match ``qargs``.
|
216
|
+
"""
|
217
|
+
if qargs is not None and len(qargs) != other.num_qubits:
|
218
|
+
raise QiskitError(
|
219
|
+
"Number of qubits of other Pauli does not match number of "
|
220
|
+
f"qargs ({other.num_qubits} != {len(qargs)})."
|
221
|
+
)
|
222
|
+
if qargs is None and self.num_qubits != other.num_qubits:
|
223
|
+
raise QiskitError(
|
224
|
+
"Number of qubits of other Pauli does not match the current "
|
225
|
+
f"Pauli ({other.num_qubits} != {self.num_qubits})."
|
226
|
+
)
|
227
|
+
if qargs is not None:
|
228
|
+
inds = list(qargs)
|
229
|
+
x1, z1 = self._x[:, inds], self._z[:, inds]
|
230
|
+
else:
|
231
|
+
x1, z1 = self._x, self._z
|
232
|
+
a_dot_b = np.mod(_count_y(x1, other._z), 2)
|
233
|
+
b_dot_a = np.mod(_count_y(other._x, z1), 2)
|
234
|
+
return a_dot_b == b_dot_a
|
235
|
+
|
236
|
+
def evolve(
|
237
|
+
self,
|
238
|
+
other: BasePauli | QuantumCircuit | Clifford,
|
239
|
+
qargs: list | None = None,
|
240
|
+
frame: Literal["h", "s"] = "h",
|
241
|
+
) -> BasePauli:
|
242
|
+
r"""Performs either Heisenberg (default) or Schrödinger picture
|
243
|
+
evolution of the Pauli by a Clifford and returns the evolved Pauli.
|
244
|
+
|
245
|
+
Schrödinger picture evolution can be chosen by passing parameter ``frame='s'``.
|
246
|
+
This option yields a faster calculation.
|
247
|
+
|
248
|
+
Heisenberg picture evolves the Pauli as :math:`P^\prime = C^\dagger.P.C`.
|
249
|
+
|
250
|
+
Schrödinger picture evolves the Pauli as :math:`P^\prime = C.P.C^\dagger`.
|
251
|
+
|
252
|
+
Args:
|
253
|
+
other (BasePauli or QuantumCircuit): The Clifford circuit to evolve by.
|
254
|
+
qargs (list): a list of qubits to apply the Clifford to.
|
255
|
+
frame (string): ``'h'`` for Heisenberg or ``'s'`` for Schrödinger framework.
|
256
|
+
|
257
|
+
Returns:
|
258
|
+
BasePauli: the Pauli :math:`C^\dagger.P.C` (Heisenberg picture)
|
259
|
+
or the Pauli :math:`C.P.C^\dagger` (Schrödinger picture).
|
260
|
+
|
261
|
+
Raises:
|
262
|
+
QiskitError: if the Clifford number of qubits and ``qargs`` don't match.
|
263
|
+
"""
|
264
|
+
# Check dimension
|
265
|
+
if qargs is not None and len(qargs) != other.num_qubits:
|
266
|
+
raise QiskitError(
|
267
|
+
f"Incorrect number of qubits for Clifford circuit ({other.num_qubits} != {len(qargs)})."
|
268
|
+
)
|
269
|
+
if qargs is None and self.num_qubits != other.num_qubits:
|
270
|
+
raise QiskitError(
|
271
|
+
f"Incorrect number of qubits for Clifford circuit "
|
272
|
+
f"({other.num_qubits} != {self.num_qubits})."
|
273
|
+
)
|
274
|
+
|
275
|
+
# Evolve via Pauli
|
276
|
+
if isinstance(other, BasePauli):
|
277
|
+
if frame == "s":
|
278
|
+
ret = self.compose(other, qargs=qargs)
|
279
|
+
ret = ret.compose(other.adjoint(), front=True, qargs=qargs)
|
280
|
+
else:
|
281
|
+
ret = self.compose(other.adjoint(), qargs=qargs)
|
282
|
+
ret = ret.compose(other, front=True, qargs=qargs)
|
283
|
+
return ret
|
284
|
+
|
285
|
+
# pylint: disable=cyclic-import
|
286
|
+
from qiskit.quantum_info.operators.symplectic.clifford import Clifford
|
287
|
+
|
288
|
+
# Convert Clifford to quantum circuits
|
289
|
+
if isinstance(other, Clifford):
|
290
|
+
return self._evolve_clifford(other, qargs=qargs, frame=frame)
|
291
|
+
|
292
|
+
# Otherwise evolve by the inverse circuit to compute C^dg.P.C
|
293
|
+
if frame == "s":
|
294
|
+
return self.copy()._append_circuit(other, qargs=qargs)
|
295
|
+
return self.copy()._append_circuit(other.inverse(), qargs=qargs)
|
296
|
+
|
297
|
+
def _evolve_clifford(self, other, qargs=None, frame="h"):
|
298
|
+
"""Heisenberg picture evolution of a Pauli by a Clifford."""
|
299
|
+
|
300
|
+
if frame == "s":
|
301
|
+
adj = other
|
302
|
+
else:
|
303
|
+
adj = other.adjoint()
|
304
|
+
|
305
|
+
if qargs is None:
|
306
|
+
qargs_ = slice(None)
|
307
|
+
else:
|
308
|
+
qargs_ = list(qargs)
|
309
|
+
|
310
|
+
# pylint: disable=cyclic-import
|
311
|
+
from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList
|
312
|
+
|
313
|
+
num_paulis = self._x.shape[0]
|
314
|
+
|
315
|
+
ret = self.copy()
|
316
|
+
ret._x[:, qargs_] = False
|
317
|
+
ret._z[:, qargs_] = False
|
318
|
+
|
319
|
+
idx = np.concatenate((self._x[:, qargs_], self._z[:, qargs_]), axis=1)
|
320
|
+
for idx_, row in zip(
|
321
|
+
idx.T,
|
322
|
+
PauliList.from_symplectic(z=adj.z, x=adj.x, phase=2 * adj.phase),
|
323
|
+
):
|
324
|
+
# most of the logic below is to properly index if self is a PauliList (2D),
|
325
|
+
# while not trying to index if the object is just a Pauli (1D).
|
326
|
+
if idx_.any():
|
327
|
+
if np.sum(idx_) == num_paulis:
|
328
|
+
ret.compose(row, qargs=qargs, inplace=True)
|
329
|
+
else:
|
330
|
+
ret[idx_] = ret[idx_].compose(row, qargs=qargs)
|
331
|
+
|
332
|
+
return ret
|
333
|
+
|
334
|
+
def _eq(self, other):
|
335
|
+
"""Entrywise comparison of Pauli equality."""
|
336
|
+
return (
|
337
|
+
self.num_qubits == other.num_qubits
|
338
|
+
and np.all(np.mod(self._phase, 4) == np.mod(other._phase, 4))
|
339
|
+
and np.all(self._z == other._z)
|
340
|
+
and np.all(self._x == other._x)
|
341
|
+
)
|
342
|
+
|
343
|
+
# ---------------------------------------------------------------------
|
344
|
+
# Helper Methods
|
345
|
+
# ---------------------------------------------------------------------
|
346
|
+
|
347
|
+
def __imul__(self, other):
|
348
|
+
return self.compose(other, front=True, inplace=True)
|
349
|
+
|
350
|
+
def __neg__(self):
|
351
|
+
ret = copy.copy(self)
|
352
|
+
ret._phase = np.mod(self._phase + 2, 4)
|
353
|
+
return ret
|
354
|
+
|
355
|
+
def _count_y(self, dtype=None):
|
356
|
+
"""Count the number of I Paulis"""
|
357
|
+
return _count_y(self._x, self._z, dtype=dtype)
|
358
|
+
|
359
|
+
@staticmethod
|
360
|
+
def _stack(array, size, vertical=True):
|
361
|
+
"""Stack array."""
|
362
|
+
if size == 1:
|
363
|
+
return array
|
364
|
+
if vertical:
|
365
|
+
return np.vstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
|
366
|
+
return np.hstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
|
367
|
+
|
368
|
+
@staticmethod
|
369
|
+
def _phase_from_complex(coeff):
|
370
|
+
"""Return the phase from a label"""
|
371
|
+
if np.isclose(coeff, 1):
|
372
|
+
return 0
|
373
|
+
if np.isclose(coeff, -1j):
|
374
|
+
return 1
|
375
|
+
if np.isclose(coeff, -1):
|
376
|
+
return 2
|
377
|
+
if np.isclose(coeff, 1j):
|
378
|
+
return 3
|
379
|
+
raise QiskitError("Pauli can only be multiplied by 1, -1j, -1, 1j.")
|
380
|
+
|
381
|
+
@staticmethod
|
382
|
+
def _from_array(z, x, phase=0):
|
383
|
+
"""Convert array data to BasePauli data."""
|
384
|
+
if isinstance(z, np.ndarray) and z.dtype == bool:
|
385
|
+
base_z = z
|
386
|
+
else:
|
387
|
+
base_z = np.asarray(z, dtype=bool)
|
388
|
+
if base_z.ndim == 1:
|
389
|
+
base_z = base_z.reshape((1, base_z.size))
|
390
|
+
elif base_z.ndim != 2:
|
391
|
+
raise QiskitError("Invalid Pauli z vector shape.")
|
392
|
+
|
393
|
+
if isinstance(x, np.ndarray) and x.dtype == bool:
|
394
|
+
base_x = x
|
395
|
+
else:
|
396
|
+
base_x = np.asarray(x, dtype=bool)
|
397
|
+
if base_x.ndim == 1:
|
398
|
+
base_x = base_x.reshape((1, base_x.size))
|
399
|
+
elif base_x.ndim != 2:
|
400
|
+
raise QiskitError("Invalid Pauli x vector shape.")
|
401
|
+
|
402
|
+
if base_z.shape != base_x.shape:
|
403
|
+
raise QiskitError("z and x vectors are different size.")
|
404
|
+
|
405
|
+
# Convert group phase convention to internal ZX-phase conversion.
|
406
|
+
dtype = getattr(phase, "dtype", None)
|
407
|
+
base_phase = np.mod(_count_y(base_x, base_z, dtype=dtype) + phase, 4)
|
408
|
+
return base_z, base_x, base_phase
|
409
|
+
|
410
|
+
@staticmethod
|
411
|
+
def _to_matrix(z, x, phase=0, group_phase=False, sparse=False):
|
412
|
+
"""Return the matrix from symplectic representation.
|
413
|
+
|
414
|
+
The Pauli is defined as :math:`P = (-i)^{phase + z.x} * Z^z.x^x`
|
415
|
+
where ``array = [x, z]``.
|
416
|
+
|
417
|
+
Args:
|
418
|
+
z (array): The symplectic representation z vector.
|
419
|
+
x (array): The symplectic representation x vector.
|
420
|
+
phase (int): Pauli phase.
|
421
|
+
group_phase (bool): Optional. If ``True`` use group-phase convention
|
422
|
+
instead of BasePauli ZX-phase convention.
|
423
|
+
(default: ``False``).
|
424
|
+
sparse (bool): Optional. Of ``True`` return a sparse CSR matrix,
|
425
|
+
otherwise return a dense Numpy array
|
426
|
+
(default: ``False``).
|
427
|
+
|
428
|
+
Returns:
|
429
|
+
array: if ``sparse=False``.
|
430
|
+
csr_matrix: if ``sparse=True``.
|
431
|
+
"""
|
432
|
+
num_qubits = z.size
|
433
|
+
|
434
|
+
# Convert to zx_phase
|
435
|
+
if group_phase:
|
436
|
+
phase += np.sum(x & z)
|
437
|
+
phase %= 4
|
438
|
+
|
439
|
+
dim = 2**num_qubits
|
440
|
+
twos_array = 1 << np.arange(num_qubits, dtype=np.uint)
|
441
|
+
x_indices = np.asarray(x).dot(twos_array)
|
442
|
+
z_indices = np.asarray(z).dot(twos_array)
|
443
|
+
|
444
|
+
indptr = np.arange(dim + 1, dtype=np.uint)
|
445
|
+
indices = indptr ^ x_indices
|
446
|
+
if phase:
|
447
|
+
coeff = (-1j) ** phase
|
448
|
+
else:
|
449
|
+
coeff = 1
|
450
|
+
|
451
|
+
# Compute parities of `z_indices & indptr`, i.e.,
|
452
|
+
# np.array([(-1) ** bin(i).count("1") for i in z_indices & indptr])
|
453
|
+
vec_u64 = z_indices & indptr
|
454
|
+
mat_u8 = np.zeros((vec_u64.size, 8), dtype=np.uint8)
|
455
|
+
for i in range(8):
|
456
|
+
mat_u8[:, i] = vec_u64 & 255
|
457
|
+
vec_u64 >>= 8
|
458
|
+
if np.all(vec_u64 == 0):
|
459
|
+
break
|
460
|
+
parity = _PARITY[np.bitwise_xor.reduce(mat_u8, axis=1)]
|
461
|
+
|
462
|
+
data = coeff * parity
|
463
|
+
if sparse:
|
464
|
+
# Return sparse matrix
|
465
|
+
from scipy.sparse import csr_matrix
|
466
|
+
|
467
|
+
return csr_matrix((data, indices, indptr), shape=(dim, dim), dtype=complex)
|
468
|
+
|
469
|
+
# Build dense matrix using csr format
|
470
|
+
mat = np.zeros((dim, dim), dtype=complex)
|
471
|
+
mat[range(dim), indices[:dim]] = data[:dim]
|
472
|
+
return mat
|
473
|
+
|
474
|
+
@staticmethod
|
475
|
+
def _to_label(z, x, phase, group_phase=False, full_group=True, return_phase=False):
|
476
|
+
"""Return the label string for a Pauli.
|
477
|
+
|
478
|
+
Args:
|
479
|
+
z (array): The symplectic representation z vector.
|
480
|
+
x (array): The symplectic representation x vector.
|
481
|
+
phase (int): Pauli phase.
|
482
|
+
group_phase (bool): Optional. If ``True`` use group-phase convention
|
483
|
+
instead of BasePauli ZX-phase convention.
|
484
|
+
(default: ``False``).
|
485
|
+
full_group (bool): If True return the Pauli label from the full Pauli group
|
486
|
+
including complex coefficient from [1, -1, 1j, -1j]. If
|
487
|
+
``False`` return the unsigned Pauli label with coefficient 1
|
488
|
+
(default: ``True``).
|
489
|
+
return_phase (bool): If ``True`` return the adjusted phase for the coefficient
|
490
|
+
of the returned Pauli label. This can be used even if
|
491
|
+
``full_group=False``.
|
492
|
+
|
493
|
+
Returns:
|
494
|
+
str: the Pauli label from the full Pauli group (if ``full_group=True``) or
|
495
|
+
from the unsigned Pauli group (if ``full_group=False``).
|
496
|
+
tuple[str, int]: if ``return_phase=True`` returns a tuple of the Pauli
|
497
|
+
label (from either the full or unsigned Pauli group) and
|
498
|
+
the phase ``q`` for the coefficient :math:`(-i)^(q + x.z)`
|
499
|
+
for the label from the full Pauli group.
|
500
|
+
"""
|
501
|
+
# Map each qubit to the {I: 0, X: 1, Z: 2, Y: 3} integer form, then use Numpy advanced
|
502
|
+
# indexing to get a new data buffer which is compatible with an ASCII string label.
|
503
|
+
index = z << 1
|
504
|
+
index += x
|
505
|
+
ascii_label = _TO_LABEL_CHARS[index[::-1]].data.tobytes()
|
506
|
+
phase = (int(phase) if group_phase else int(phase) - ascii_label.count(b"Y")) % 4
|
507
|
+
label = ascii_label.decode("ascii")
|
508
|
+
if phase and full_group:
|
509
|
+
label = ("", "-i", "-", "i")[phase] + label
|
510
|
+
if return_phase:
|
511
|
+
return label, phase
|
512
|
+
return label
|
513
|
+
|
514
|
+
def _append_circuit(self, circuit, qargs=None):
|
515
|
+
"""Update BasePauli inplace by applying a Clifford circuit.
|
516
|
+
|
517
|
+
Args:
|
518
|
+
circuit (QuantumCircuit or Instruction): the gate or composite gate to apply.
|
519
|
+
qargs (list or None): The qubits to apply gate to.
|
520
|
+
|
521
|
+
Returns:
|
522
|
+
BasePauli: the updated Pauli.
|
523
|
+
|
524
|
+
Raises:
|
525
|
+
QiskitError: if input gate cannot be decomposed into Clifford gates.
|
526
|
+
"""
|
527
|
+
if isinstance(circuit, (Barrier, Delay)):
|
528
|
+
return self
|
529
|
+
|
530
|
+
if qargs is None:
|
531
|
+
qargs = list(range(self.num_qubits))
|
532
|
+
|
533
|
+
if not isinstance(circuit, QuantumCircuit):
|
534
|
+
gate = circuit
|
535
|
+
|
536
|
+
if isinstance(gate, str):
|
537
|
+
# Check if gate is a valid Clifford basis gate string
|
538
|
+
if gate not in _basis_1q and gate not in _basis_2q:
|
539
|
+
raise QiskitError(f"Invalid Clifford gate name string {gate}")
|
540
|
+
name = gate
|
541
|
+
else:
|
542
|
+
# Assume gate is an Instruction
|
543
|
+
name = gate.name
|
544
|
+
|
545
|
+
# Apply gate if it is a Clifford basis gate
|
546
|
+
if name in _non_clifford:
|
547
|
+
raise QiskitError(f"Cannot update Pauli with non-Clifford gate {name}")
|
548
|
+
if name in _basis_1q:
|
549
|
+
if len(qargs) != 1:
|
550
|
+
raise QiskitError("Invalid qubits for 1-qubit gate.")
|
551
|
+
return _basis_1q[name](self, qargs[0])
|
552
|
+
if name in _basis_2q:
|
553
|
+
if len(qargs) != 2:
|
554
|
+
raise QiskitError("Invalid qubits for 2-qubit gate.")
|
555
|
+
return _basis_2q[name](self, qargs[0], qargs[1])
|
556
|
+
|
557
|
+
# If not a Clifford basis gate we try to unroll the gate and
|
558
|
+
# raise an exception if unrolling reaches a non-Clifford gate.
|
559
|
+
if gate.definition is None:
|
560
|
+
raise QiskitError(f"Cannot apply Instruction: {gate.name}")
|
561
|
+
if not isinstance(gate.definition, QuantumCircuit):
|
562
|
+
raise QiskitError(
|
563
|
+
f"{gate.name} instruction definition is {type(gate.definition)};"
|
564
|
+
f" expected QuantumCircuit"
|
565
|
+
)
|
566
|
+
|
567
|
+
circuit = gate.definition
|
568
|
+
|
569
|
+
for instruction in circuit:
|
570
|
+
if instruction.clbits:
|
571
|
+
raise QiskitError(
|
572
|
+
f"Cannot apply Instruction with classical bits: {instruction.operation.name}"
|
573
|
+
)
|
574
|
+
# Get the integer position of the flat register
|
575
|
+
new_qubits = [qargs[circuit.find_bit(qb)[0]] for qb in instruction.qubits]
|
576
|
+
self._append_circuit(instruction.operation, new_qubits)
|
577
|
+
|
578
|
+
# Since the individual gate evolution functions don't take mod
|
579
|
+
# of phase we update it at the end
|
580
|
+
self._phase %= 4
|
581
|
+
return self
|
582
|
+
|
583
|
+
|
584
|
+
# ---------------------------------------------------------------------
|
585
|
+
# Evolution by Clifford gates
|
586
|
+
# ---------------------------------------------------------------------
|
587
|
+
|
588
|
+
|
589
|
+
def _evolve_h(base_pauli, qubit):
|
590
|
+
"""Update P -> H.P.H"""
|
591
|
+
x = base_pauli._x[:, qubit].copy()
|
592
|
+
z = base_pauli._z[:, qubit].copy()
|
593
|
+
base_pauli._x[:, qubit] = z
|
594
|
+
base_pauli._z[:, qubit] = x
|
595
|
+
base_pauli._phase += 2 * np.logical_and(x, z).T.astype(base_pauli._phase.dtype)
|
596
|
+
return base_pauli
|
597
|
+
|
598
|
+
|
599
|
+
def _evolve_s(base_pauli, qubit):
|
600
|
+
"""Update P -> S.P.Sdg"""
|
601
|
+
x = base_pauli._x[:, qubit]
|
602
|
+
base_pauli._z[:, qubit] ^= x
|
603
|
+
base_pauli._phase += x.T.astype(base_pauli._phase.dtype)
|
604
|
+
return base_pauli
|
605
|
+
|
606
|
+
|
607
|
+
def _evolve_sdg(base_pauli, qubit):
|
608
|
+
"""Update P -> Sdg.P.S"""
|
609
|
+
x = base_pauli._x[:, qubit]
|
610
|
+
base_pauli._z[:, qubit] ^= x
|
611
|
+
base_pauli._phase -= x.T.astype(base_pauli._phase.dtype)
|
612
|
+
return base_pauli
|
613
|
+
|
614
|
+
|
615
|
+
# pylint: disable=unused-argument
|
616
|
+
def _evolve_i(base_pauli, qubit):
|
617
|
+
"""Update P -> P"""
|
618
|
+
return base_pauli
|
619
|
+
|
620
|
+
|
621
|
+
def _evolve_x(base_pauli, qubit):
|
622
|
+
"""Update P -> X.P.X"""
|
623
|
+
base_pauli._phase += 2 * base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
|
624
|
+
return base_pauli
|
625
|
+
|
626
|
+
|
627
|
+
def _evolve_y(base_pauli, qubit):
|
628
|
+
"""Update P -> Y.P.Y"""
|
629
|
+
xp = base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
|
630
|
+
zp = base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
|
631
|
+
base_pauli._phase += 2 * (xp + zp)
|
632
|
+
return base_pauli
|
633
|
+
|
634
|
+
|
635
|
+
def _evolve_z(base_pauli, qubit):
|
636
|
+
"""Update P -> Z.P.Z"""
|
637
|
+
base_pauli._phase += 2 * base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
|
638
|
+
return base_pauli
|
639
|
+
|
640
|
+
|
641
|
+
def _evolve_cx(base_pauli, qctrl, qtrgt):
|
642
|
+
"""Update P -> CX.P.CX"""
|
643
|
+
base_pauli._x[:, qtrgt] ^= base_pauli._x[:, qctrl]
|
644
|
+
base_pauli._z[:, qctrl] ^= base_pauli._z[:, qtrgt]
|
645
|
+
return base_pauli
|
646
|
+
|
647
|
+
|
648
|
+
def _evolve_cz(base_pauli, q1, q2):
|
649
|
+
"""Update P -> CZ.P.CZ"""
|
650
|
+
x1 = base_pauli._x[:, q1].copy()
|
651
|
+
x2 = base_pauli._x[:, q2].copy()
|
652
|
+
base_pauli._z[:, q1] ^= x2
|
653
|
+
base_pauli._z[:, q2] ^= x1
|
654
|
+
base_pauli._phase += 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
|
655
|
+
return base_pauli
|
656
|
+
|
657
|
+
|
658
|
+
def _evolve_cy(base_pauli, qctrl, qtrgt):
|
659
|
+
"""Update P -> CY.P.CY"""
|
660
|
+
x1 = base_pauli._x[:, qctrl].copy()
|
661
|
+
x2 = base_pauli._x[:, qtrgt].copy()
|
662
|
+
z2 = base_pauli._z[:, qtrgt].copy()
|
663
|
+
base_pauli._x[:, qtrgt] ^= x1
|
664
|
+
base_pauli._z[:, qtrgt] ^= x1
|
665
|
+
base_pauli._z[:, qctrl] ^= np.logical_xor(x2, z2)
|
666
|
+
base_pauli._phase += x1 + 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
|
667
|
+
return base_pauli
|
668
|
+
|
669
|
+
|
670
|
+
def _evolve_swap(base_pauli, q1, q2):
|
671
|
+
"""Update P -> SWAP.P.SWAP"""
|
672
|
+
x1 = base_pauli._x[:, q1].copy()
|
673
|
+
z1 = base_pauli._z[:, q1].copy()
|
674
|
+
base_pauli._x[:, q1] = base_pauli._x[:, q2]
|
675
|
+
base_pauli._z[:, q1] = base_pauli._z[:, q2]
|
676
|
+
base_pauli._x[:, q2] = x1
|
677
|
+
base_pauli._z[:, q2] = z1
|
678
|
+
return base_pauli
|
679
|
+
|
680
|
+
|
681
|
+
def _evolve_ecr(base_pauli, q1, q2):
|
682
|
+
"""Update P -> ECR.P.ECR"""
|
683
|
+
base_pauli = _evolve_s(base_pauli, q1)
|
684
|
+
base_pauli = _evolve_h(base_pauli, q2)
|
685
|
+
base_pauli = _evolve_s(base_pauli, q2)
|
686
|
+
base_pauli = _evolve_h(base_pauli, q2)
|
687
|
+
base_pauli = _evolve_cx(base_pauli, q1, q2)
|
688
|
+
base_pauli = _evolve_x(base_pauli, q1)
|
689
|
+
return base_pauli
|
690
|
+
|
691
|
+
|
692
|
+
def _count_y(x, z, dtype=None):
|
693
|
+
"""Count the number of I Paulis"""
|
694
|
+
return (x & z).sum(axis=1, dtype=dtype)
|
695
|
+
|
696
|
+
|
697
|
+
# Basis Clifford Gates
|
698
|
+
_basis_1q = {
|
699
|
+
"i": _evolve_i,
|
700
|
+
"id": _evolve_i,
|
701
|
+
"iden": _evolve_i,
|
702
|
+
"x": _evolve_x,
|
703
|
+
"y": _evolve_y,
|
704
|
+
"z": _evolve_z,
|
705
|
+
"h": _evolve_h,
|
706
|
+
"s": _evolve_s,
|
707
|
+
"sdg": _evolve_sdg,
|
708
|
+
"sinv": _evolve_sdg,
|
709
|
+
}
|
710
|
+
_basis_2q = {
|
711
|
+
"cx": _evolve_cx,
|
712
|
+
"cz": _evolve_cz,
|
713
|
+
"cy": _evolve_cy,
|
714
|
+
"swap": _evolve_swap,
|
715
|
+
"ecr": _evolve_ecr,
|
716
|
+
}
|
717
|
+
|
718
|
+
# Non-Clifford gates
|
719
|
+
_non_clifford = ["t", "tdg", "ccx", "ccz"]
|