qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,977 @@
|
|
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
|
+
"""
|
14
|
+
Statevector quantum state class.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
import copy as _copy
|
18
|
+
import math
|
19
|
+
import re
|
20
|
+
from numbers import Number
|
21
|
+
from typing import TYPE_CHECKING
|
22
|
+
|
23
|
+
import numpy as np
|
24
|
+
|
25
|
+
from qiskit import _numpy_compat
|
26
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
27
|
+
from qiskit.circuit.instruction import Instruction
|
28
|
+
from qiskit.exceptions import QiskitError
|
29
|
+
from qiskit.quantum_info.states.quantum_state import QuantumState
|
30
|
+
from qiskit.quantum_info.operators.mixins.tolerances import TolerancesMixin
|
31
|
+
from qiskit.quantum_info.operators.operator import Operator, BaseOperator
|
32
|
+
from qiskit.quantum_info.operators.symplectic import Pauli, SparsePauliOp
|
33
|
+
from qiskit.quantum_info.operators.op_shape import OpShape
|
34
|
+
from qiskit.quantum_info.operators.predicates import matrix_equal
|
35
|
+
|
36
|
+
from qiskit._accelerate.pauli_expval import (
|
37
|
+
expval_pauli_no_x,
|
38
|
+
expval_pauli_with_x,
|
39
|
+
)
|
40
|
+
|
41
|
+
if TYPE_CHECKING:
|
42
|
+
from qiskit import circuit
|
43
|
+
|
44
|
+
|
45
|
+
class Statevector(QuantumState, TolerancesMixin):
|
46
|
+
"""Statevector class"""
|
47
|
+
|
48
|
+
def __init__(
|
49
|
+
self,
|
50
|
+
data: (
|
51
|
+
np.ndarray
|
52
|
+
| list
|
53
|
+
| Statevector
|
54
|
+
| Operator
|
55
|
+
| QuantumCircuit
|
56
|
+
| circuit.instruction.Instruction
|
57
|
+
),
|
58
|
+
dims: int | tuple | list | None = None,
|
59
|
+
):
|
60
|
+
"""Initialize a statevector object.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
data: Data from which the statevector can be constructed. This can be either a complex
|
64
|
+
vector, another statevector, a ``Operator`` with only one column or a
|
65
|
+
``QuantumCircuit`` or ``Instruction``. If the data is a circuit or instruction,
|
66
|
+
the statevector is constructed by assuming that all qubits are initialized to the
|
67
|
+
zero state.
|
68
|
+
dims: The subsystem dimension of the state (See additional information).
|
69
|
+
|
70
|
+
Raises:
|
71
|
+
QiskitError: if input data is not valid.
|
72
|
+
|
73
|
+
Additional Information:
|
74
|
+
The ``dims`` kwarg can be None, an integer, or an iterable of
|
75
|
+
integers.
|
76
|
+
|
77
|
+
* ``Iterable`` -- the subsystem dimensions are the values in the list
|
78
|
+
with the total number of subsystems given by the length of the list.
|
79
|
+
|
80
|
+
* ``Int`` or ``None`` -- the length of the input vector
|
81
|
+
specifies the total dimension of the density matrix. If it is a
|
82
|
+
power of two the state will be initialized as an N-qubit state.
|
83
|
+
If it is not a power of two the state will have a single
|
84
|
+
d-dimensional subsystem.
|
85
|
+
"""
|
86
|
+
if isinstance(data, (list, np.ndarray)):
|
87
|
+
# Finally we check if the input is a raw vector in either a
|
88
|
+
# python list or numpy array format.
|
89
|
+
self._data = np.asarray(data, dtype=complex)
|
90
|
+
elif isinstance(data, Statevector):
|
91
|
+
self._data = data._data
|
92
|
+
if dims is None:
|
93
|
+
dims = data._op_shape._dims_l
|
94
|
+
elif isinstance(data, Operator):
|
95
|
+
# We allow conversion of column-vector operators to Statevectors
|
96
|
+
input_dim, _ = data.dim
|
97
|
+
if input_dim != 1:
|
98
|
+
raise QiskitError("Input Operator is not a column-vector.")
|
99
|
+
self._data = np.ravel(data.data)
|
100
|
+
elif isinstance(data, (QuantumCircuit, Instruction)):
|
101
|
+
self._data = Statevector.from_instruction(data).data
|
102
|
+
else:
|
103
|
+
raise QiskitError("Invalid input data format for Statevector")
|
104
|
+
# Check that the input is a numpy vector or column-vector numpy
|
105
|
+
# matrix. If it is a column-vector matrix reshape to a vector.
|
106
|
+
ndim = self._data.ndim
|
107
|
+
shape = self._data.shape
|
108
|
+
if ndim != 1:
|
109
|
+
if ndim == 2 and shape[1] == 1:
|
110
|
+
self._data = np.reshape(self._data, shape[0])
|
111
|
+
shape = self._data.shape
|
112
|
+
elif ndim != 2 or shape[1] != 1:
|
113
|
+
raise QiskitError("Invalid input: not a vector or column-vector.")
|
114
|
+
super().__init__(op_shape=OpShape.auto(shape=shape, dims_l=dims, num_qubits_r=0))
|
115
|
+
|
116
|
+
def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
117
|
+
dtype = self.data.dtype if dtype is None else dtype
|
118
|
+
return np.array(self.data, dtype=dtype, copy=copy)
|
119
|
+
|
120
|
+
def __eq__(self, other):
|
121
|
+
return super().__eq__(other) and np.allclose(
|
122
|
+
self._data, other._data, rtol=self.rtol, atol=self.atol
|
123
|
+
)
|
124
|
+
|
125
|
+
def __repr__(self):
|
126
|
+
prefix = "Statevector("
|
127
|
+
pad = len(prefix) * " "
|
128
|
+
return (
|
129
|
+
f"{prefix}{np.array2string(self._data, separator=', ', prefix=prefix)},\n{pad}"
|
130
|
+
f"dims={self._op_shape.dims_l()})"
|
131
|
+
)
|
132
|
+
|
133
|
+
@property
|
134
|
+
def settings(self) -> dict:
|
135
|
+
"""Return settings."""
|
136
|
+
return {"data": self._data, "dims": self._op_shape.dims_l()}
|
137
|
+
|
138
|
+
def draw(self, output: str | None = None, **drawer_args):
|
139
|
+
"""Return a visualization of the Statevector.
|
140
|
+
|
141
|
+
**repr**: ASCII TextMatrix of the state's ``__repr__``.
|
142
|
+
|
143
|
+
**text**: ASCII TextMatrix that can be printed in the console.
|
144
|
+
|
145
|
+
**latex**: An IPython Latex object for displaying in Jupyter Notebooks.
|
146
|
+
|
147
|
+
**latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
|
148
|
+
|
149
|
+
**qsphere**: Matplotlib figure, rendering of statevector using `plot_state_qsphere()`.
|
150
|
+
|
151
|
+
**hinton**: Matplotlib figure, rendering of statevector using `plot_state_hinton()`.
|
152
|
+
|
153
|
+
**bloch**: Matplotlib figure, rendering of statevector using `plot_bloch_multivector()`.
|
154
|
+
|
155
|
+
**city**: Matplotlib figure, rendering of statevector using `plot_state_city()`.
|
156
|
+
|
157
|
+
**paulivec**: Matplotlib figure, rendering of statevector using `plot_state_paulivec()`.
|
158
|
+
|
159
|
+
Args:
|
160
|
+
output (str): Select the output method to use for drawing the
|
161
|
+
state. Valid choices are `repr`, `text`, `latex`, `latex_source`,
|
162
|
+
`qsphere`, `hinton`, `bloch`, `city`, or `paulivec`. Default is `repr`.
|
163
|
+
Default can be changed by adding the line ``state_drawer = <default>`` to
|
164
|
+
``~/.qiskit/settings.conf`` under ``[default]``.
|
165
|
+
drawer_args: Arguments to be passed directly to the relevant drawing
|
166
|
+
function or constructor (`TextMatrix()`, `array_to_latex()`,
|
167
|
+
`plot_state_qsphere()`, `plot_state_hinton()` or `plot_bloch_multivector()`).
|
168
|
+
See the relevant function under `qiskit.visualization` for that function's
|
169
|
+
documentation.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
:class:`matplotlib.Figure` or :class:`str` or
|
173
|
+
:class:`TextMatrix` or :class:`IPython.display.Latex`:
|
174
|
+
Drawing of the Statevector.
|
175
|
+
|
176
|
+
Raises:
|
177
|
+
ValueError: when an invalid output method is selected.
|
178
|
+
|
179
|
+
Examples:
|
180
|
+
|
181
|
+
Plot one of the Bell states
|
182
|
+
|
183
|
+
.. plot::
|
184
|
+
:alt: Output from the previous code.
|
185
|
+
:include-source:
|
186
|
+
|
187
|
+
from numpy import sqrt
|
188
|
+
from qiskit.quantum_info import Statevector
|
189
|
+
sv=Statevector([1/sqrt(2), 0, 0, -1/sqrt(2)])
|
190
|
+
sv.draw(output='hinton')
|
191
|
+
|
192
|
+
"""
|
193
|
+
# pylint: disable=cyclic-import
|
194
|
+
from qiskit.visualization.state_visualization import state_drawer
|
195
|
+
|
196
|
+
return state_drawer(self, output=output, **drawer_args)
|
197
|
+
|
198
|
+
def _ipython_display_(self):
|
199
|
+
out = self.draw()
|
200
|
+
if isinstance(out, str):
|
201
|
+
print(out) # pylint: disable=bad-builtin
|
202
|
+
else:
|
203
|
+
from IPython.display import display
|
204
|
+
|
205
|
+
display(out)
|
206
|
+
|
207
|
+
def __getitem__(self, key: int | str) -> np.complex128:
|
208
|
+
"""Return Statevector item either by index or binary label
|
209
|
+
Args:
|
210
|
+
key (int or str): index or corresponding binary label, e.g. '01' = 1.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
numpy.complex128: Statevector item.
|
214
|
+
|
215
|
+
Raises:
|
216
|
+
QiskitError: if key is not valid.
|
217
|
+
"""
|
218
|
+
if isinstance(key, str):
|
219
|
+
try:
|
220
|
+
key = int(key, 2)
|
221
|
+
except ValueError:
|
222
|
+
raise QiskitError(f"Key '{key}' is not a valid binary string.") from None
|
223
|
+
if isinstance(key, int):
|
224
|
+
if key >= self.dim:
|
225
|
+
raise QiskitError(f"Key {key} is greater than Statevector dimension {self.dim}.")
|
226
|
+
if key < 0:
|
227
|
+
raise QiskitError(f"Key {key} is not a valid positive value.")
|
228
|
+
return self._data[key]
|
229
|
+
else:
|
230
|
+
raise QiskitError("Key must be int or a valid binary string.")
|
231
|
+
|
232
|
+
def __iter__(self):
|
233
|
+
yield from self._data
|
234
|
+
|
235
|
+
def __len__(self):
|
236
|
+
return len(self._data)
|
237
|
+
|
238
|
+
@property
|
239
|
+
def data(self) -> np.ndarray:
|
240
|
+
"""Return data."""
|
241
|
+
return self._data
|
242
|
+
|
243
|
+
def is_valid(self, atol: float | None = None, rtol: float | None = None) -> bool:
|
244
|
+
"""Return True if a Statevector has norm 1."""
|
245
|
+
if atol is None:
|
246
|
+
atol = self.atol
|
247
|
+
if rtol is None:
|
248
|
+
rtol = self.rtol
|
249
|
+
norm = np.linalg.norm(self.data)
|
250
|
+
return np.allclose(norm, 1, rtol=rtol, atol=atol)
|
251
|
+
|
252
|
+
def to_operator(self) -> Operator:
|
253
|
+
"""Convert state to a rank-1 projector operator"""
|
254
|
+
mat = np.outer(self.data, np.conj(self.data))
|
255
|
+
return Operator(mat, input_dims=self.dims(), output_dims=self.dims())
|
256
|
+
|
257
|
+
def conjugate(self) -> Statevector:
|
258
|
+
"""Return the conjugate of the operator."""
|
259
|
+
return Statevector(np.conj(self.data), dims=self.dims())
|
260
|
+
|
261
|
+
def trace(self) -> np.float64:
|
262
|
+
"""Return the trace of the quantum state as a density matrix."""
|
263
|
+
return np.sum(np.abs(self.data) ** 2)
|
264
|
+
|
265
|
+
def purity(self) -> np.float64:
|
266
|
+
"""Return the purity of the quantum state."""
|
267
|
+
# For a valid statevector the purity is always 1, however if we simply
|
268
|
+
# have an arbitrary vector (not correctly normalized) then the
|
269
|
+
# purity is equivalent to the trace squared:
|
270
|
+
# P(|psi>) = Tr[|psi><psi|psi><psi|] = |<psi|psi>|^2
|
271
|
+
return self.trace() ** 2
|
272
|
+
|
273
|
+
def tensor(self, other: Statevector) -> Statevector:
|
274
|
+
"""Return the tensor product state self ⊗ other.
|
275
|
+
|
276
|
+
Args:
|
277
|
+
other (Statevector): a quantum state object.
|
278
|
+
|
279
|
+
Returns:
|
280
|
+
Statevector: the tensor product operator self ⊗ other.
|
281
|
+
|
282
|
+
Raises:
|
283
|
+
QiskitError: if other is not a quantum state.
|
284
|
+
"""
|
285
|
+
if not isinstance(other, Statevector):
|
286
|
+
other = Statevector(other)
|
287
|
+
ret = _copy.copy(self)
|
288
|
+
ret._op_shape = self._op_shape.tensor(other._op_shape)
|
289
|
+
ret._data = np.kron(self._data, other._data)
|
290
|
+
return ret
|
291
|
+
|
292
|
+
def inner(self, other: Statevector) -> np.complex128:
|
293
|
+
r"""Return the inner product of self and other as
|
294
|
+
:math:`\langle self| other \rangle`.
|
295
|
+
|
296
|
+
Args:
|
297
|
+
other (Statevector): a quantum state object.
|
298
|
+
|
299
|
+
Returns:
|
300
|
+
np.complex128: the inner product of self and other, :math:`\langle self| other \rangle`.
|
301
|
+
|
302
|
+
Raises:
|
303
|
+
QiskitError: if other is not a quantum state or has different dimension.
|
304
|
+
"""
|
305
|
+
if not isinstance(other, Statevector):
|
306
|
+
other = Statevector(other)
|
307
|
+
if self.dims() != other.dims():
|
308
|
+
raise QiskitError(
|
309
|
+
f"Statevector dimensions do not match: {self.dims()} and {other.dims()}."
|
310
|
+
)
|
311
|
+
inner = np.vdot(self.data, other.data)
|
312
|
+
return inner
|
313
|
+
|
314
|
+
def expand(self, other: Statevector) -> Statevector:
|
315
|
+
"""Return the tensor product state other ⊗ self.
|
316
|
+
|
317
|
+
Args:
|
318
|
+
other (Statevector): a quantum state object.
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
Statevector: the tensor product state other ⊗ self.
|
322
|
+
|
323
|
+
Raises:
|
324
|
+
QiskitError: if other is not a quantum state.
|
325
|
+
"""
|
326
|
+
if not isinstance(other, Statevector):
|
327
|
+
other = Statevector(other)
|
328
|
+
ret = _copy.copy(self)
|
329
|
+
ret._op_shape = self._op_shape.expand(other._op_shape)
|
330
|
+
ret._data = np.kron(other._data, self._data)
|
331
|
+
return ret
|
332
|
+
|
333
|
+
def _add(self, other):
|
334
|
+
"""Return the linear combination self + other.
|
335
|
+
|
336
|
+
Args:
|
337
|
+
other (Statevector): a quantum state object.
|
338
|
+
|
339
|
+
Returns:
|
340
|
+
Statevector: the linear combination self + other.
|
341
|
+
|
342
|
+
Raises:
|
343
|
+
QiskitError: if other is not a quantum state, or has
|
344
|
+
incompatible dimensions.
|
345
|
+
"""
|
346
|
+
if not isinstance(other, Statevector):
|
347
|
+
other = Statevector(other)
|
348
|
+
self._op_shape._validate_add(other._op_shape)
|
349
|
+
ret = _copy.copy(self)
|
350
|
+
ret._data = self.data + other.data
|
351
|
+
return ret
|
352
|
+
|
353
|
+
def _multiply(self, other):
|
354
|
+
"""Return the scalar multiplied state self * other.
|
355
|
+
|
356
|
+
Args:
|
357
|
+
other (complex): a complex number.
|
358
|
+
|
359
|
+
Returns:
|
360
|
+
Statevector: the scalar multiplied state other * self.
|
361
|
+
|
362
|
+
Raises:
|
363
|
+
QiskitError: if other is not a valid complex number.
|
364
|
+
"""
|
365
|
+
if not isinstance(other, Number):
|
366
|
+
raise QiskitError("other is not a number")
|
367
|
+
ret = _copy.copy(self)
|
368
|
+
ret._data = other * self.data
|
369
|
+
return ret
|
370
|
+
|
371
|
+
def evolve(
|
372
|
+
self, other: Operator | QuantumCircuit | Instruction, qargs: list[int] | None = None
|
373
|
+
) -> Statevector:
|
374
|
+
"""Evolve a quantum state by the operator.
|
375
|
+
|
376
|
+
Args:
|
377
|
+
other (Operator | QuantumCircuit | circuit.Instruction): The operator to evolve by.
|
378
|
+
qargs (list): a list of Statevector subsystem positions to apply
|
379
|
+
the operator on.
|
380
|
+
|
381
|
+
Returns:
|
382
|
+
Statevector: the output quantum state.
|
383
|
+
|
384
|
+
Raises:
|
385
|
+
QiskitError: if the operator dimension does not match the
|
386
|
+
specified Statevector subsystem dimensions.
|
387
|
+
"""
|
388
|
+
if qargs is None:
|
389
|
+
qargs = getattr(other, "qargs", None)
|
390
|
+
|
391
|
+
# Get return vector
|
392
|
+
ret = _copy.copy(self)
|
393
|
+
|
394
|
+
# Evolution by a circuit or instruction
|
395
|
+
if isinstance(other, QuantumCircuit):
|
396
|
+
other = other.to_instruction()
|
397
|
+
if isinstance(other, Instruction):
|
398
|
+
if self.num_qubits is None:
|
399
|
+
raise QiskitError("Cannot apply QuantumCircuit to non-qubit Statevector.")
|
400
|
+
return self._evolve_instruction(ret, other, qargs=qargs)
|
401
|
+
|
402
|
+
# Evolution by an Operator
|
403
|
+
if not isinstance(other, Operator):
|
404
|
+
dims = self.dims(qargs=qargs)
|
405
|
+
other = Operator(other, input_dims=dims, output_dims=dims)
|
406
|
+
|
407
|
+
# check dimension
|
408
|
+
if self.dims(qargs) != other.input_dims():
|
409
|
+
raise QiskitError(
|
410
|
+
"Operator input dimensions are not equal to statevector subsystem dimensions."
|
411
|
+
)
|
412
|
+
return Statevector._evolve_operator(ret, other, qargs=qargs)
|
413
|
+
|
414
|
+
def equiv(
|
415
|
+
self, other: Statevector, rtol: float | None = None, atol: float | None = None
|
416
|
+
) -> bool:
|
417
|
+
"""Return True if other is equivalent as a statevector up to global phase.
|
418
|
+
|
419
|
+
.. note::
|
420
|
+
|
421
|
+
If other is not a Statevector, but can be used to initialize a statevector object,
|
422
|
+
this will check that Statevector(other) is equivalent to the current statevector up
|
423
|
+
to global phase.
|
424
|
+
|
425
|
+
Args:
|
426
|
+
other (Statevector): an object from which a ``Statevector`` can be constructed.
|
427
|
+
rtol (float): relative tolerance value for comparison.
|
428
|
+
atol (float): absolute tolerance value for comparison.
|
429
|
+
|
430
|
+
Returns:
|
431
|
+
bool: True if statevectors are equivalent up to global phase.
|
432
|
+
"""
|
433
|
+
if not isinstance(other, Statevector):
|
434
|
+
try:
|
435
|
+
other = Statevector(other)
|
436
|
+
except QiskitError:
|
437
|
+
return False
|
438
|
+
if self.dim != other.dim:
|
439
|
+
return False
|
440
|
+
if atol is None:
|
441
|
+
atol = self.atol
|
442
|
+
if rtol is None:
|
443
|
+
rtol = self.rtol
|
444
|
+
return matrix_equal(self.data, other.data, ignore_phase=True, rtol=rtol, atol=atol)
|
445
|
+
|
446
|
+
def reverse_qargs(self) -> Statevector:
|
447
|
+
r"""Return a Statevector with reversed subsystem ordering.
|
448
|
+
|
449
|
+
For a tensor product state this is equivalent to reversing the order
|
450
|
+
of tensor product subsystems. For a statevector
|
451
|
+
:math:`|\psi \rangle = |\psi_{n-1} \rangle \otimes ... \otimes |\psi_0 \rangle`
|
452
|
+
the returned statevector will be
|
453
|
+
:math:`|\psi_{0} \rangle \otimes ... \otimes |\psi_{n-1} \rangle`.
|
454
|
+
|
455
|
+
Returns:
|
456
|
+
Statevector: the Statevector with reversed subsystem order.
|
457
|
+
"""
|
458
|
+
ret = _copy.copy(self)
|
459
|
+
axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
|
460
|
+
ret._data = np.reshape(
|
461
|
+
np.transpose(np.reshape(self.data, self._op_shape.tensor_shape), axes),
|
462
|
+
self._op_shape.shape,
|
463
|
+
)
|
464
|
+
ret._op_shape = self._op_shape.reverse()
|
465
|
+
return ret
|
466
|
+
|
467
|
+
def _expectation_value_pauli(self, pauli, qargs=None):
|
468
|
+
"""Compute the expectation value of a Pauli.
|
469
|
+
|
470
|
+
Args:
|
471
|
+
pauli (Pauli): a Pauli operator to evaluate expval of.
|
472
|
+
qargs (None or list): subsystems to apply operator on.
|
473
|
+
|
474
|
+
Returns:
|
475
|
+
complex: the expectation value.
|
476
|
+
"""
|
477
|
+
n_pauli = len(pauli)
|
478
|
+
if qargs is None:
|
479
|
+
qubits = np.arange(n_pauli)
|
480
|
+
else:
|
481
|
+
qubits = np.array(qargs)
|
482
|
+
|
483
|
+
x_mask = np.dot(1 << qubits, pauli.x)
|
484
|
+
z_mask = np.dot(1 << qubits, pauli.z)
|
485
|
+
pauli_phase = (-1j) ** pauli.phase if pauli.phase else 1
|
486
|
+
|
487
|
+
if x_mask + z_mask == 0:
|
488
|
+
return pauli_phase * np.linalg.norm(self.data) ** 2
|
489
|
+
|
490
|
+
if x_mask == 0:
|
491
|
+
return pauli_phase * expval_pauli_no_x(self.data, self.num_qubits, z_mask)
|
492
|
+
|
493
|
+
x_max = qubits[pauli.x][-1]
|
494
|
+
y_phase = (-1j) ** pauli._count_y()
|
495
|
+
y_phase = y_phase[0]
|
496
|
+
|
497
|
+
return pauli_phase * expval_pauli_with_x(
|
498
|
+
self.data, self.num_qubits, z_mask, x_mask, y_phase, x_max
|
499
|
+
)
|
500
|
+
|
501
|
+
def expectation_value(
|
502
|
+
self, oper: BaseOperator | QuantumCircuit | Instruction, qargs: None | list[int] = None
|
503
|
+
) -> complex:
|
504
|
+
"""Compute the expectation value of an operator.
|
505
|
+
|
506
|
+
Args:
|
507
|
+
oper (Operator): an operator to evaluate expval of.
|
508
|
+
qargs (None or list): subsystems to apply operator on.
|
509
|
+
|
510
|
+
Returns:
|
511
|
+
complex: the expectation value.
|
512
|
+
"""
|
513
|
+
if isinstance(oper, Pauli):
|
514
|
+
return self._expectation_value_pauli(oper, qargs)
|
515
|
+
|
516
|
+
if isinstance(oper, SparsePauliOp):
|
517
|
+
return sum(
|
518
|
+
coeff * self._expectation_value_pauli(Pauli((z, x)), qargs)
|
519
|
+
for z, x, coeff in zip(oper.paulis.z, oper.paulis.x, oper.coeffs)
|
520
|
+
)
|
521
|
+
|
522
|
+
val = self.evolve(oper, qargs=qargs)
|
523
|
+
conj = self.conjugate()
|
524
|
+
return np.dot(conj.data, val.data)
|
525
|
+
|
526
|
+
def probabilities(
|
527
|
+
self, qargs: None | list[int] = None, decimals: None | int = None
|
528
|
+
) -> np.ndarray:
|
529
|
+
"""Return the subsystem measurement probability vector.
|
530
|
+
|
531
|
+
Measurement probabilities are with respect to measurement in the
|
532
|
+
computation (diagonal) basis.
|
533
|
+
|
534
|
+
Args:
|
535
|
+
qargs (None or list): subsystems to return probabilities for,
|
536
|
+
if None return for all subsystems (Default: None).
|
537
|
+
decimals (None or int): the number of decimal places to round
|
538
|
+
values. If None no rounding is done (Default: None).
|
539
|
+
|
540
|
+
Returns:
|
541
|
+
np.array: The Numpy vector array of probabilities.
|
542
|
+
|
543
|
+
Examples:
|
544
|
+
|
545
|
+
Consider a 2-qubit product state
|
546
|
+
:math:`|\\psi\\rangle=|+\\rangle\\otimes|0\\rangle`.
|
547
|
+
|
548
|
+
.. plot::
|
549
|
+
:include-source:
|
550
|
+
:nofigs:
|
551
|
+
|
552
|
+
from qiskit.quantum_info import Statevector
|
553
|
+
|
554
|
+
psi = Statevector.from_label('+0')
|
555
|
+
|
556
|
+
# Probabilities for measuring both qubits
|
557
|
+
probs = psi.probabilities()
|
558
|
+
print('probs: {}'.format(probs))
|
559
|
+
|
560
|
+
# Probabilities for measuring only qubit-0
|
561
|
+
probs_qubit_0 = psi.probabilities([0])
|
562
|
+
print('Qubit-0 probs: {}'.format(probs_qubit_0))
|
563
|
+
|
564
|
+
# Probabilities for measuring only qubit-1
|
565
|
+
probs_qubit_1 = psi.probabilities([1])
|
566
|
+
print('Qubit-1 probs: {}'.format(probs_qubit_1))
|
567
|
+
|
568
|
+
.. code-block:: text
|
569
|
+
|
570
|
+
probs: [0.5 0. 0.5 0. ]
|
571
|
+
Qubit-0 probs: [1. 0.]
|
572
|
+
Qubit-1 probs: [0.5 0.5]
|
573
|
+
|
574
|
+
We can also permute the order of qubits in the ``qargs`` list
|
575
|
+
to change the qubit position in the probabilities output
|
576
|
+
|
577
|
+
.. plot::
|
578
|
+
:include-source:
|
579
|
+
:nofigs:
|
580
|
+
|
581
|
+
from qiskit.quantum_info import Statevector
|
582
|
+
|
583
|
+
psi = Statevector.from_label('+0')
|
584
|
+
|
585
|
+
# Probabilities for measuring both qubits
|
586
|
+
probs = psi.probabilities([0, 1])
|
587
|
+
print('probs: {}'.format(probs))
|
588
|
+
|
589
|
+
# Probabilities for measuring both qubits
|
590
|
+
# but swapping qubits 0 and 1 in output
|
591
|
+
probs_swapped = psi.probabilities([1, 0])
|
592
|
+
print('Swapped probs: {}'.format(probs_swapped))
|
593
|
+
|
594
|
+
.. code-block:: text
|
595
|
+
|
596
|
+
probs: [0.5 0. 0.5 0. ]
|
597
|
+
Swapped probs: [0.5 0.5 0. 0. ]
|
598
|
+
|
599
|
+
"""
|
600
|
+
probs = self._subsystem_probabilities(
|
601
|
+
np.abs(self.data) ** 2, self._op_shape.dims_l(), qargs=qargs
|
602
|
+
)
|
603
|
+
|
604
|
+
# to account for roundoff errors, we clip
|
605
|
+
probs = np.clip(probs, a_min=0, a_max=1)
|
606
|
+
|
607
|
+
if decimals is not None:
|
608
|
+
probs = probs.round(decimals=decimals)
|
609
|
+
|
610
|
+
return probs
|
611
|
+
|
612
|
+
def reset(self, qargs: list[int] | None = None) -> Statevector:
|
613
|
+
"""Reset state or subsystems to the 0-state.
|
614
|
+
|
615
|
+
Args:
|
616
|
+
qargs (list or None): subsystems to reset, if None all
|
617
|
+
subsystems will be reset to their 0-state
|
618
|
+
(Default: None).
|
619
|
+
|
620
|
+
Returns:
|
621
|
+
Statevector: the reset state.
|
622
|
+
|
623
|
+
Additional Information:
|
624
|
+
If all subsystems are reset this will return the ground state
|
625
|
+
on all subsystems. If only a some subsystems are reset this
|
626
|
+
function will perform a measurement on those subsystems and
|
627
|
+
evolve the subsystems so that the collapsed post-measurement
|
628
|
+
states are rotated to the 0-state. The RNG seed for this
|
629
|
+
sampling can be set using the :meth:`seed` method.
|
630
|
+
"""
|
631
|
+
if qargs is None:
|
632
|
+
# Resetting all qubits does not require sampling or RNG
|
633
|
+
ret = _copy.copy(self)
|
634
|
+
state = np.zeros(self._op_shape.shape, dtype=complex)
|
635
|
+
state[0] = 1
|
636
|
+
ret._data = state
|
637
|
+
return ret
|
638
|
+
|
639
|
+
# Sample a single measurement outcome
|
640
|
+
dims = self.dims(qargs)
|
641
|
+
probs = self.probabilities(qargs)
|
642
|
+
sample = self._rng.choice(len(probs), p=probs, size=1)
|
643
|
+
|
644
|
+
# Convert to projector for state update
|
645
|
+
proj = np.zeros(len(probs), dtype=complex)
|
646
|
+
proj[sample] = 1 / np.sqrt(probs[sample])
|
647
|
+
|
648
|
+
# Rotate outcome to 0
|
649
|
+
reset = np.eye(len(probs))
|
650
|
+
reset[0, 0] = 0
|
651
|
+
reset[sample, sample] = 0
|
652
|
+
reset[0, sample] = 1
|
653
|
+
|
654
|
+
# compose with reset projection
|
655
|
+
reset = np.dot(reset, np.diag(proj))
|
656
|
+
return self.evolve(Operator(reset, input_dims=dims, output_dims=dims), qargs=qargs)
|
657
|
+
|
658
|
+
@classmethod
|
659
|
+
def from_label(cls, label: str) -> Statevector:
|
660
|
+
"""Return a tensor product of Pauli X,Y,Z eigenstates.
|
661
|
+
|
662
|
+
.. list-table:: Single-qubit state labels
|
663
|
+
:header-rows: 1
|
664
|
+
|
665
|
+
* - Label
|
666
|
+
- Statevector
|
667
|
+
* - ``"0"``
|
668
|
+
- :math:`[1, 0]`
|
669
|
+
* - ``"1"``
|
670
|
+
- :math:`[0, 1]`
|
671
|
+
* - ``"+"``
|
672
|
+
- :math:`[1 / \\sqrt{2}, 1 / \\sqrt{2}]`
|
673
|
+
* - ``"-"``
|
674
|
+
- :math:`[1 / \\sqrt{2}, -1 / \\sqrt{2}]`
|
675
|
+
* - ``"r"``
|
676
|
+
- :math:`[1 / \\sqrt{2}, i / \\sqrt{2}]`
|
677
|
+
* - ``"l"``
|
678
|
+
- :math:`[1 / \\sqrt{2}, -i / \\sqrt{2}]`
|
679
|
+
|
680
|
+
Args:
|
681
|
+
label (string): a eigenstate string ket label (see table for
|
682
|
+
allowed values).
|
683
|
+
|
684
|
+
Returns:
|
685
|
+
Statevector: The N-qubit basis state density matrix.
|
686
|
+
|
687
|
+
Raises:
|
688
|
+
QiskitError: if the label contains invalid characters, or the
|
689
|
+
length of the label is larger than an explicitly
|
690
|
+
specified num_qubits.
|
691
|
+
"""
|
692
|
+
# Check label is valid
|
693
|
+
if re.match(r"^[01rl\-+]+$", label) is None:
|
694
|
+
raise QiskitError("Label contains invalid characters.")
|
695
|
+
# We can prepare Z-eigenstates by converting the computational
|
696
|
+
# basis bit-string to an integer and preparing that unit vector
|
697
|
+
# However, for X-basis states, we will prepare a Z-eigenstate first
|
698
|
+
# then apply Hadamard gates to rotate 0 and 1s to + and -.
|
699
|
+
z_label = label
|
700
|
+
xy_states = False
|
701
|
+
if re.match("^[01]+$", label) is None:
|
702
|
+
# We have X or Y eigenstates so replace +,r with 0 and
|
703
|
+
# -,l with 1 and prepare the corresponding Z state
|
704
|
+
xy_states = True
|
705
|
+
z_label = z_label.replace("+", "0")
|
706
|
+
z_label = z_label.replace("r", "0")
|
707
|
+
z_label = z_label.replace("-", "1")
|
708
|
+
z_label = z_label.replace("l", "1")
|
709
|
+
# Initialize Z eigenstate vector
|
710
|
+
num_qubits = len(label)
|
711
|
+
data = np.zeros(1 << num_qubits, dtype=complex)
|
712
|
+
pos = int(z_label, 2)
|
713
|
+
data[pos] = 1
|
714
|
+
state = Statevector(data)
|
715
|
+
if xy_states:
|
716
|
+
# Apply hadamards to all qubits in X eigenstates
|
717
|
+
x_mat = np.array([[1, 1], [1, -1]], dtype=complex) / math.sqrt(2)
|
718
|
+
# Apply S.H to qubits in Y eigenstates
|
719
|
+
y_mat = np.dot(np.diag([1, 1j]), x_mat)
|
720
|
+
for qubit, char in enumerate(reversed(label)):
|
721
|
+
if char in ["+", "-"]:
|
722
|
+
state = state.evolve(x_mat, qargs=[qubit])
|
723
|
+
elif char in ["r", "l"]:
|
724
|
+
state = state.evolve(y_mat, qargs=[qubit])
|
725
|
+
return state
|
726
|
+
|
727
|
+
@staticmethod
|
728
|
+
def from_int(i: int, dims: int | tuple | list) -> Statevector:
|
729
|
+
"""Return a computational basis statevector.
|
730
|
+
|
731
|
+
Args:
|
732
|
+
i (int): the basis state element.
|
733
|
+
dims (int or tuple or list): The subsystem dimensions of the statevector
|
734
|
+
(See additional information).
|
735
|
+
|
736
|
+
Returns:
|
737
|
+
Statevector: The computational basis state :math:`|i\\rangle`.
|
738
|
+
|
739
|
+
Additional Information:
|
740
|
+
The ``dims`` kwarg can be an integer or an iterable of integers.
|
741
|
+
|
742
|
+
* ``Iterable`` -- the subsystem dimensions are the values in the list
|
743
|
+
with the total number of subsystems given by the length of the list.
|
744
|
+
|
745
|
+
* ``Int`` -- the integer specifies the total dimension of the
|
746
|
+
state. If it is a power of two the state will be initialized
|
747
|
+
as an N-qubit state. If it is not a power of two the state
|
748
|
+
will have a single d-dimensional subsystem.
|
749
|
+
"""
|
750
|
+
size = np.prod(dims)
|
751
|
+
state = np.zeros(size, dtype=complex)
|
752
|
+
state[i] = 1.0
|
753
|
+
return Statevector(state, dims=dims)
|
754
|
+
|
755
|
+
@classmethod
|
756
|
+
def from_instruction(cls, instruction: Instruction | QuantumCircuit) -> Statevector:
|
757
|
+
"""Return the output statevector of an instruction.
|
758
|
+
|
759
|
+
The statevector is initialized in the state :math:`|{0,\\ldots,0}\\rangle` of the
|
760
|
+
same number of qubits as the input instruction or circuit, evolved
|
761
|
+
by the input instruction, and the output statevector returned.
|
762
|
+
|
763
|
+
Args:
|
764
|
+
instruction (qiskit.circuit.Instruction or QuantumCircuit): instruction or circuit
|
765
|
+
|
766
|
+
Returns:
|
767
|
+
Statevector: The final statevector.
|
768
|
+
|
769
|
+
Raises:
|
770
|
+
QiskitError: if the instruction contains invalid instructions for
|
771
|
+
the statevector simulation.
|
772
|
+
"""
|
773
|
+
# Convert circuit to an instruction
|
774
|
+
if isinstance(instruction, QuantumCircuit):
|
775
|
+
instruction = instruction.to_instruction()
|
776
|
+
# Initialize an the statevector in the all |0> state
|
777
|
+
init = np.zeros(2**instruction.num_qubits, dtype=complex)
|
778
|
+
init[0] = 1.0
|
779
|
+
vec = Statevector(init, dims=instruction.num_qubits * (2,))
|
780
|
+
return Statevector._evolve_instruction(vec, instruction)
|
781
|
+
|
782
|
+
def to_dict(self, decimals: None | int = None) -> dict:
|
783
|
+
r"""Convert the statevector to dictionary form.
|
784
|
+
|
785
|
+
This dictionary representation uses a Ket-like notation where the
|
786
|
+
dictionary keys are qudit strings for the subsystem basis vectors.
|
787
|
+
If any subsystem has a dimension greater than 10 comma delimiters are
|
788
|
+
inserted between integers so that subsystems can be distinguished.
|
789
|
+
|
790
|
+
Args:
|
791
|
+
decimals (None or int): the number of decimal places to round
|
792
|
+
values. If None no rounding is done
|
793
|
+
(Default: None).
|
794
|
+
|
795
|
+
Returns:
|
796
|
+
dict: the dictionary form of the Statevector.
|
797
|
+
|
798
|
+
Example:
|
799
|
+
|
800
|
+
The ket-form of a 2-qubit statevector
|
801
|
+
:math:`|\psi\rangle = |-\rangle\otimes |0\rangle`
|
802
|
+
|
803
|
+
.. plot::
|
804
|
+
:include-source:
|
805
|
+
:nofigs:
|
806
|
+
|
807
|
+
from qiskit.quantum_info import Statevector
|
808
|
+
|
809
|
+
psi = Statevector.from_label('-0')
|
810
|
+
print(psi.to_dict())
|
811
|
+
|
812
|
+
.. code-block:: text
|
813
|
+
|
814
|
+
{'00': (0.7071067811865475+0j), '10': (-0.7071067811865475+0j)}
|
815
|
+
|
816
|
+
For non-qubit subsystems the integer range can go from 0 to 9. For
|
817
|
+
example in a qutrit system
|
818
|
+
|
819
|
+
.. plot::
|
820
|
+
:include-source:
|
821
|
+
:nofigs:
|
822
|
+
|
823
|
+
import numpy as np
|
824
|
+
from qiskit.quantum_info import Statevector
|
825
|
+
|
826
|
+
vec = np.zeros(9)
|
827
|
+
vec[0] = 1 / np.sqrt(2)
|
828
|
+
vec[-1] = 1 / np.sqrt(2)
|
829
|
+
psi = Statevector(vec, dims=(3, 3))
|
830
|
+
print(psi.to_dict())
|
831
|
+
|
832
|
+
.. code-block:: text
|
833
|
+
|
834
|
+
{'00': (0.7071067811865475+0j), '22': (0.7071067811865475+0j)}
|
835
|
+
|
836
|
+
For large subsystem dimensions delimiters are required. The
|
837
|
+
following example is for a 20-dimensional system consisting of
|
838
|
+
a qubit and 10-dimensional qudit.
|
839
|
+
|
840
|
+
.. plot::
|
841
|
+
:include-source:
|
842
|
+
:nofigs:
|
843
|
+
|
844
|
+
import numpy as np
|
845
|
+
from qiskit.quantum_info import Statevector
|
846
|
+
|
847
|
+
vec = np.zeros(2 * 10)
|
848
|
+
vec[0] = 1 / np.sqrt(2)
|
849
|
+
vec[-1] = 1 / np.sqrt(2)
|
850
|
+
psi = Statevector(vec, dims=(2, 10))
|
851
|
+
print(psi.to_dict())
|
852
|
+
|
853
|
+
.. code-block:: text
|
854
|
+
|
855
|
+
{'00': (0.7071067811865475+0j), '91': (0.7071067811865475+0j)}
|
856
|
+
|
857
|
+
"""
|
858
|
+
return self._vector_to_dict(
|
859
|
+
self.data, self._op_shape.dims_l(), decimals=decimals, string_labels=True
|
860
|
+
)
|
861
|
+
|
862
|
+
@staticmethod
|
863
|
+
def _evolve_operator(statevec, oper, qargs=None):
|
864
|
+
"""Evolve a qudit statevector"""
|
865
|
+
new_shape = statevec._op_shape.compose(oper._op_shape, qargs=qargs)
|
866
|
+
if qargs is None:
|
867
|
+
# Full system evolution
|
868
|
+
statevec._data = np.dot(oper._data, statevec._data)
|
869
|
+
statevec._op_shape = new_shape
|
870
|
+
return statevec
|
871
|
+
|
872
|
+
# Get transpose axes
|
873
|
+
num_qargs = statevec._op_shape.num_qargs[0]
|
874
|
+
indices = [num_qargs - 1 - i for i in reversed(qargs)]
|
875
|
+
axes = indices + [i for i in range(num_qargs) if i not in indices]
|
876
|
+
axes_inv = np.argsort(axes).tolist()
|
877
|
+
|
878
|
+
# Calculate contraction dimensions
|
879
|
+
contract_dim = oper._op_shape.shape[1]
|
880
|
+
contract_shape = (contract_dim, statevec._op_shape.shape[0] // contract_dim)
|
881
|
+
|
882
|
+
# Reshape and transpose input array for contraction
|
883
|
+
tensor = np.transpose(
|
884
|
+
np.reshape(statevec.data, statevec._op_shape.tensor_shape),
|
885
|
+
axes,
|
886
|
+
)
|
887
|
+
tensor_shape = tensor.shape
|
888
|
+
|
889
|
+
# Perform contraction
|
890
|
+
tensor = np.reshape(
|
891
|
+
np.dot(oper.data, np.reshape(tensor, contract_shape)),
|
892
|
+
tensor_shape,
|
893
|
+
)
|
894
|
+
|
895
|
+
# Transpose back to original subsystem spec and flatten
|
896
|
+
statevec._data = np.reshape(np.transpose(tensor, axes_inv), new_shape.shape[0])
|
897
|
+
|
898
|
+
# Update dimension
|
899
|
+
statevec._op_shape = new_shape
|
900
|
+
return statevec
|
901
|
+
|
902
|
+
@staticmethod
|
903
|
+
def _evolve_instruction(statevec, obj, qargs=None):
|
904
|
+
"""Update the current Statevector by applying an instruction."""
|
905
|
+
from qiskit.circuit.reset import Reset
|
906
|
+
from qiskit.circuit.barrier import Barrier
|
907
|
+
|
908
|
+
# pylint complains about a cyclic import since the following Initialize file
|
909
|
+
# imports the StatePreparation, which again requires the Statevector (this file),
|
910
|
+
# but as this is a local import, it's not actually an issue and can be ignored
|
911
|
+
# pylint: disable=cyclic-import
|
912
|
+
from qiskit.circuit.library.data_preparation.initializer import Initialize
|
913
|
+
|
914
|
+
mat = Operator._instruction_to_matrix(obj)
|
915
|
+
if mat is not None:
|
916
|
+
# Perform the composition and inplace update the current state
|
917
|
+
# of the operator
|
918
|
+
return Statevector._evolve_operator(statevec, Operator(mat), qargs=qargs)
|
919
|
+
|
920
|
+
# Special instruction types
|
921
|
+
if isinstance(obj, Reset):
|
922
|
+
statevec._data = statevec.reset(qargs)._data
|
923
|
+
return statevec
|
924
|
+
if isinstance(obj, Barrier):
|
925
|
+
return statevec
|
926
|
+
if isinstance(obj, Initialize):
|
927
|
+
# state is initialized to labels in the initialize object
|
928
|
+
if all(isinstance(param, str) for param in obj.params):
|
929
|
+
initialization = Statevector.from_label("".join(obj.params))._data
|
930
|
+
# state is initialized to an integer
|
931
|
+
# here we're only checking the length as (1) a length-1 object necessarily means the
|
932
|
+
# state is described by an integer (as labels were already covered) and (2) the int
|
933
|
+
# was cast to a complex and we cannot do an int typecheck anyways
|
934
|
+
elif len(obj.params) == 1:
|
935
|
+
state = int(np.real(obj.params[0]))
|
936
|
+
initialization = Statevector.from_int(state, (2,) * obj.num_qubits)._data
|
937
|
+
# state is initialized to the statevector
|
938
|
+
else:
|
939
|
+
initialization = np.asarray(obj.params, dtype=complex)
|
940
|
+
|
941
|
+
if qargs is None:
|
942
|
+
statevec._data = initialization
|
943
|
+
else:
|
944
|
+
# if we act on a subsystem we first need to reset and then apply the
|
945
|
+
# state preparation
|
946
|
+
statevec._data = statevec.reset(qargs)._data
|
947
|
+
mat = np.zeros((2 ** len(qargs), 2 ** len(qargs)), dtype=complex)
|
948
|
+
mat[:, 0] = initialization
|
949
|
+
statevec = Statevector._evolve_operator(statevec, Operator(mat), qargs=qargs)
|
950
|
+
|
951
|
+
return statevec
|
952
|
+
|
953
|
+
# If the instruction doesn't have a matrix defined we use its
|
954
|
+
# circuit decomposition definition if it exists, otherwise we
|
955
|
+
# cannot compose this gate and raise an error.
|
956
|
+
if obj.definition is None:
|
957
|
+
raise QiskitError(f"Cannot apply Instruction: {obj.name}")
|
958
|
+
if not isinstance(obj.definition, QuantumCircuit):
|
959
|
+
raise QiskitError(
|
960
|
+
f"{obj.name} instruction definition is {type(obj.definition)}; expected QuantumCircuit"
|
961
|
+
)
|
962
|
+
|
963
|
+
if obj.definition.global_phase:
|
964
|
+
statevec._data *= np.exp(1j * float(obj.definition.global_phase))
|
965
|
+
qubits = {qubit: i for i, qubit in enumerate(obj.definition.qubits)}
|
966
|
+
for instruction in obj.definition:
|
967
|
+
if instruction.clbits:
|
968
|
+
raise QiskitError(
|
969
|
+
f"Cannot apply instruction with classical bits: {instruction.operation.name}"
|
970
|
+
)
|
971
|
+
# Get the integer position of the flat register
|
972
|
+
if qargs is None:
|
973
|
+
new_qargs = [qubits[tup] for tup in instruction.qubits]
|
974
|
+
else:
|
975
|
+
new_qargs = [qargs[qubits[tup]] for tup in instruction.qubits]
|
976
|
+
Statevector._evolve_instruction(statevec, instruction.operation, qargs=new_qargs)
|
977
|
+
return statevec
|