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,503 @@
|
|
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
|
+
Abstract QuantumState class.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import copy
|
19
|
+
from abc import abstractmethod
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
24
|
+
from qiskit.quantum_info.operators.channel.quantum_channel import QuantumChannel
|
25
|
+
from qiskit.quantum_info.operators.op_shape import OpShape
|
26
|
+
from qiskit.quantum_info.operators.operator import Operator
|
27
|
+
from qiskit.result.counts import Counts
|
28
|
+
|
29
|
+
|
30
|
+
class QuantumState:
|
31
|
+
"""Abstract quantum state base class"""
|
32
|
+
|
33
|
+
def __init__(self, op_shape: OpShape | None = None):
|
34
|
+
"""Initialize a QuantumState object.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
op_shape (OpShape): Optional, an OpShape object for state dimensions.
|
38
|
+
|
39
|
+
.. note::
|
40
|
+
|
41
|
+
If `op_shape`` is specified it will take precedence over other
|
42
|
+
kwargs.
|
43
|
+
"""
|
44
|
+
self._op_shape = op_shape
|
45
|
+
# RNG for measure functions
|
46
|
+
self._rng_generator = None
|
47
|
+
|
48
|
+
# Set higher priority than Numpy array and matrix classes
|
49
|
+
__array_priority__ = 20
|
50
|
+
|
51
|
+
def __eq__(self, other):
|
52
|
+
return isinstance(other, self.__class__) and self.dims() == other.dims()
|
53
|
+
|
54
|
+
@property
|
55
|
+
def dim(self):
|
56
|
+
"""Return total state dimension."""
|
57
|
+
return self._op_shape.shape[0]
|
58
|
+
|
59
|
+
@property
|
60
|
+
def num_qubits(self):
|
61
|
+
"""Return the number of qubits if a N-qubit state or None otherwise."""
|
62
|
+
return self._op_shape.num_qubits
|
63
|
+
|
64
|
+
@property
|
65
|
+
def _rng(self):
|
66
|
+
if self._rng_generator is None:
|
67
|
+
return np.random.default_rng()
|
68
|
+
return self._rng_generator
|
69
|
+
|
70
|
+
def dims(self, qargs=None):
|
71
|
+
"""Return tuple of input dimension for specified subsystems."""
|
72
|
+
return self._op_shape.dims_l(qargs)
|
73
|
+
|
74
|
+
def copy(self):
|
75
|
+
"""Make a copy of current operator."""
|
76
|
+
return copy.deepcopy(self)
|
77
|
+
|
78
|
+
def seed(self, value=None):
|
79
|
+
"""Set the seed for the quantum state RNG."""
|
80
|
+
if value is None:
|
81
|
+
self._rng_generator = None
|
82
|
+
elif isinstance(value, np.random.Generator):
|
83
|
+
self._rng_generator = value
|
84
|
+
else:
|
85
|
+
self._rng_generator = np.random.default_rng(value)
|
86
|
+
|
87
|
+
@abstractmethod
|
88
|
+
def is_valid(self, atol=None, rtol=None):
|
89
|
+
"""Return True if a valid quantum state."""
|
90
|
+
pass
|
91
|
+
|
92
|
+
@abstractmethod
|
93
|
+
def to_operator(self):
|
94
|
+
"""Convert state to matrix operator class"""
|
95
|
+
pass
|
96
|
+
|
97
|
+
@abstractmethod
|
98
|
+
def conjugate(self):
|
99
|
+
"""Return the conjugate of the operator."""
|
100
|
+
pass
|
101
|
+
|
102
|
+
@abstractmethod
|
103
|
+
def trace(self):
|
104
|
+
"""Return the trace of the quantum state as a density matrix."""
|
105
|
+
pass
|
106
|
+
|
107
|
+
@abstractmethod
|
108
|
+
def purity(self):
|
109
|
+
"""Return the purity of the quantum state."""
|
110
|
+
pass
|
111
|
+
|
112
|
+
@abstractmethod
|
113
|
+
def tensor(self, other: QuantumState) -> QuantumState:
|
114
|
+
"""Return the tensor product state self ⊗ other.
|
115
|
+
|
116
|
+
Args:
|
117
|
+
other (QuantumState): a quantum state object.
|
118
|
+
|
119
|
+
Returns:
|
120
|
+
QuantumState: the tensor product operator self ⊗ other.
|
121
|
+
|
122
|
+
Raises:
|
123
|
+
QiskitError: if other is not a quantum state.
|
124
|
+
"""
|
125
|
+
pass
|
126
|
+
|
127
|
+
@abstractmethod
|
128
|
+
def expand(self, other: QuantumState) -> QuantumState:
|
129
|
+
"""Return the tensor product state other ⊗ self.
|
130
|
+
|
131
|
+
Args:
|
132
|
+
other (QuantumState): a quantum state object.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
QuantumState: the tensor product state other ⊗ self.
|
136
|
+
|
137
|
+
Raises:
|
138
|
+
QiskitError: if other is not a quantum state.
|
139
|
+
"""
|
140
|
+
pass
|
141
|
+
|
142
|
+
def _add(self, other):
|
143
|
+
"""Return the linear combination self + other.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
other (QuantumState): a state object.
|
147
|
+
|
148
|
+
Returns:
|
149
|
+
QuantumState: the linear combination self + other.
|
150
|
+
|
151
|
+
Raises:
|
152
|
+
NotImplementedError: if subclass does not support addition.
|
153
|
+
"""
|
154
|
+
raise NotImplementedError(f"{type(self)} does not support addition")
|
155
|
+
|
156
|
+
def _multiply(self, other):
|
157
|
+
"""Return the scalar multipled state other * self.
|
158
|
+
|
159
|
+
Args:
|
160
|
+
other (complex): a complex number.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
QuantumState: the scalar multipled state other * self.
|
164
|
+
|
165
|
+
Raises:
|
166
|
+
NotImplementedError: if subclass does not support scala
|
167
|
+
multiplication.
|
168
|
+
"""
|
169
|
+
raise NotImplementedError(f"{type(self)} does not support scalar multiplication")
|
170
|
+
|
171
|
+
@abstractmethod
|
172
|
+
def evolve(self, other: Operator | QuantumChannel, qargs: list | None = None) -> QuantumState:
|
173
|
+
"""Evolve a quantum state by the operator.
|
174
|
+
|
175
|
+
Args:
|
176
|
+
other (Operator or QuantumChannel): The operator to evolve by.
|
177
|
+
qargs (list): a list of QuantumState subsystem positions to apply
|
178
|
+
the operator on.
|
179
|
+
|
180
|
+
Returns:
|
181
|
+
QuantumState: the output quantum state.
|
182
|
+
|
183
|
+
Raises:
|
184
|
+
QiskitError: if the operator dimension does not match the
|
185
|
+
specified QuantumState subsystem dimensions.
|
186
|
+
"""
|
187
|
+
pass
|
188
|
+
|
189
|
+
@abstractmethod
|
190
|
+
def expectation_value(self, oper: BaseOperator, qargs: None | list = None) -> complex:
|
191
|
+
"""Compute the expectation value of an operator.
|
192
|
+
|
193
|
+
Args:
|
194
|
+
oper (BaseOperator): an operator to evaluate expval.
|
195
|
+
qargs (None or list): subsystems to apply the operator on.
|
196
|
+
|
197
|
+
Returns:
|
198
|
+
complex: the expectation value.
|
199
|
+
"""
|
200
|
+
pass
|
201
|
+
|
202
|
+
@abstractmethod
|
203
|
+
def probabilities(self, qargs: None | list = None, decimals: None | int = None) -> np.ndarray:
|
204
|
+
"""Return the subsystem measurement probability vector.
|
205
|
+
|
206
|
+
Measurement probabilities are with respect to measurement in the
|
207
|
+
computation (diagonal) basis.
|
208
|
+
|
209
|
+
Args:
|
210
|
+
qargs (None or list): subsystems to return probabilities for,
|
211
|
+
if None return for all subsystems (Default: None).
|
212
|
+
decimals (None or int): the number of decimal places to round
|
213
|
+
values. If None no rounding is done (Default: None).
|
214
|
+
|
215
|
+
Returns:
|
216
|
+
np.array: The Numpy vector array of probabilities.
|
217
|
+
"""
|
218
|
+
pass
|
219
|
+
|
220
|
+
def probabilities_dict(self, qargs: None | list = None, decimals: None | int = None) -> dict:
|
221
|
+
"""Return the subsystem measurement probability dictionary.
|
222
|
+
|
223
|
+
Measurement probabilities are with respect to measurement in the
|
224
|
+
computation (diagonal) basis.
|
225
|
+
|
226
|
+
This dictionary representation uses a Ket-like notation where the
|
227
|
+
dictionary keys are qudit strings for the subsystem basis vectors.
|
228
|
+
If any subsystem has a dimension greater than 10 comma delimiters are
|
229
|
+
inserted between integers so that subsystems can be distinguished.
|
230
|
+
|
231
|
+
Args:
|
232
|
+
qargs (None or list): subsystems to return probabilities for,
|
233
|
+
if None return for all subsystems (Default: None).
|
234
|
+
decimals (None or int): the number of decimal places to round
|
235
|
+
values. If None no rounding is done (Default: None).
|
236
|
+
|
237
|
+
Returns:
|
238
|
+
dict: The measurement probabilities in dict (ket) form.
|
239
|
+
"""
|
240
|
+
return self._vector_to_dict(
|
241
|
+
self.probabilities(qargs=qargs, decimals=decimals),
|
242
|
+
self.dims(qargs),
|
243
|
+
string_labels=True,
|
244
|
+
)
|
245
|
+
|
246
|
+
def sample_memory(self, shots: int, qargs: None | list = None) -> np.ndarray:
|
247
|
+
"""Sample a list of qubit measurement outcomes in the computational basis.
|
248
|
+
|
249
|
+
Args:
|
250
|
+
shots (int): number of samples to generate.
|
251
|
+
qargs (None or list): subsystems to sample measurements for,
|
252
|
+
if None sample measurement of all
|
253
|
+
subsystems (Default: None).
|
254
|
+
|
255
|
+
Returns:
|
256
|
+
np.array: list of sampled counts if the order sampled.
|
257
|
+
|
258
|
+
Additional Information:
|
259
|
+
|
260
|
+
This function *samples* measurement outcomes using the measure
|
261
|
+
:meth:`probabilities` for the current state and `qargs`. It does
|
262
|
+
not actually implement the measurement so the current state is
|
263
|
+
not modified.
|
264
|
+
|
265
|
+
The seed for random number generator used for sampling can be
|
266
|
+
set to a fixed value by using the stats :meth:`seed` method.
|
267
|
+
"""
|
268
|
+
# Get measurement probabilities for measured qubits
|
269
|
+
probs = self.probabilities(qargs)
|
270
|
+
|
271
|
+
# Generate list of possible outcome string labels
|
272
|
+
labels = self._index_to_ket_array(
|
273
|
+
np.arange(len(probs)), self.dims(qargs), string_labels=True
|
274
|
+
)
|
275
|
+
return self._rng.choice(labels, p=probs, size=shots)
|
276
|
+
|
277
|
+
def sample_counts(self, shots: int, qargs: None | list = None) -> Counts:
|
278
|
+
"""Sample a dict of qubit measurement outcomes in the computational basis.
|
279
|
+
|
280
|
+
Args:
|
281
|
+
shots (int): number of samples to generate.
|
282
|
+
qargs (None or list): subsystems to sample measurements for,
|
283
|
+
if None sample measurement of all
|
284
|
+
subsystems (Default: None).
|
285
|
+
|
286
|
+
Returns:
|
287
|
+
Counts: sampled counts dictionary.
|
288
|
+
|
289
|
+
Additional Information:
|
290
|
+
|
291
|
+
This function *samples* measurement outcomes using the measure
|
292
|
+
:meth:`probabilities` for the current state and `qargs`. It does
|
293
|
+
not actually implement the measurement so the current state is
|
294
|
+
not modified.
|
295
|
+
|
296
|
+
The seed for random number generator used for sampling can be
|
297
|
+
set to a fixed value by using the stats :meth:`seed` method.
|
298
|
+
"""
|
299
|
+
# Sample list of outcomes
|
300
|
+
samples = self.sample_memory(shots, qargs=qargs)
|
301
|
+
|
302
|
+
# Combine all samples into a counts dictionary
|
303
|
+
inds, counts = np.unique(samples, return_counts=True)
|
304
|
+
return Counts(zip(inds, counts))
|
305
|
+
|
306
|
+
def measure(self, qargs: list | None = None) -> tuple:
|
307
|
+
"""Measure subsystems and return outcome and post-measure state.
|
308
|
+
|
309
|
+
Note that this function uses the QuantumStates internal random
|
310
|
+
number generator for sampling the measurement outcome. The RNG
|
311
|
+
seed can be set using the :meth:`seed` method.
|
312
|
+
|
313
|
+
Args:
|
314
|
+
qargs (list or None): subsystems to sample measurements for,
|
315
|
+
if None sample measurement of all
|
316
|
+
subsystems (Default: None).
|
317
|
+
|
318
|
+
Returns:
|
319
|
+
tuple: the pair ``(outcome, state)`` where ``outcome`` is the
|
320
|
+
measurement outcome string label, and ``state`` is the
|
321
|
+
collapsed post-measurement state for the corresponding
|
322
|
+
outcome.
|
323
|
+
"""
|
324
|
+
# Sample a single measurement outcome from probabilities
|
325
|
+
dims = self.dims(qargs)
|
326
|
+
probs = self.probabilities(qargs)
|
327
|
+
sample = self._rng.choice(len(probs), p=probs, size=1)
|
328
|
+
|
329
|
+
# Format outcome
|
330
|
+
outcome = self._index_to_ket_array(sample, self.dims(qargs), string_labels=True)[0]
|
331
|
+
|
332
|
+
# Convert to projector for state update
|
333
|
+
proj = np.zeros(len(probs), dtype=complex)
|
334
|
+
proj[sample] = 1 / np.sqrt(probs[sample])
|
335
|
+
|
336
|
+
# Update state object
|
337
|
+
# TODO: implement a more efficient state update method for
|
338
|
+
# diagonal matrix multiplication
|
339
|
+
ret = self.evolve(Operator(np.diag(proj), input_dims=dims, output_dims=dims), qargs=qargs)
|
340
|
+
|
341
|
+
return outcome, ret
|
342
|
+
|
343
|
+
@staticmethod
|
344
|
+
def _index_to_ket_array(
|
345
|
+
inds: np.ndarray, dims: tuple, string_labels: bool = False
|
346
|
+
) -> np.ndarray:
|
347
|
+
"""Convert an index array into a ket array.
|
348
|
+
|
349
|
+
Args:
|
350
|
+
inds (np.array): an integer index array.
|
351
|
+
dims (tuple): a list of subsystem dimensions.
|
352
|
+
string_labels (bool): return ket as string if True, otherwise
|
353
|
+
return as index array (Default: False).
|
354
|
+
|
355
|
+
Returns:
|
356
|
+
np.array: an array of ket strings if string_label=True, otherwise
|
357
|
+
an array of ket lists.
|
358
|
+
"""
|
359
|
+
shifts = [1]
|
360
|
+
for dim in dims[:-1]:
|
361
|
+
shifts.append(shifts[-1] * dim)
|
362
|
+
kets = np.array([(inds // shift) % dim for dim, shift in zip(dims, shifts)])
|
363
|
+
|
364
|
+
if string_labels:
|
365
|
+
max_dim = max(dims)
|
366
|
+
char_kets = np.asarray(kets, dtype=np.str_)
|
367
|
+
str_kets = char_kets[0]
|
368
|
+
for row in char_kets[1:]:
|
369
|
+
if max_dim > 10:
|
370
|
+
str_kets = np.char.add(",", str_kets)
|
371
|
+
str_kets = np.char.add(row, str_kets)
|
372
|
+
return str_kets.T
|
373
|
+
|
374
|
+
return kets.T
|
375
|
+
|
376
|
+
@staticmethod
|
377
|
+
def _vector_to_dict(vec, dims, decimals=None, string_labels=False):
|
378
|
+
"""Convert a vector to a ket dictionary.
|
379
|
+
|
380
|
+
This representation will not show zero values in the output dict.
|
381
|
+
|
382
|
+
Args:
|
383
|
+
vec (array): a Numpy vector array.
|
384
|
+
dims (tuple): subsystem dimensions.
|
385
|
+
decimals (None or int): number of decimal places to round to.
|
386
|
+
(See Numpy.round), if None no rounding
|
387
|
+
is done (Default: None).
|
388
|
+
string_labels (bool): return ket as string if True, otherwise
|
389
|
+
return as index array (Default: False).
|
390
|
+
|
391
|
+
Returns:
|
392
|
+
dict: the vector in dictionary `ket` form.
|
393
|
+
"""
|
394
|
+
# Get indices of non-zero elements
|
395
|
+
vals = vec if decimals is None else vec.round(decimals=decimals)
|
396
|
+
(inds,) = vals.nonzero()
|
397
|
+
|
398
|
+
# Convert to ket tuple based on subsystem dimensions
|
399
|
+
kets = QuantumState._index_to_ket_array(inds, dims, string_labels=string_labels)
|
400
|
+
|
401
|
+
# Make dict of tuples
|
402
|
+
if string_labels:
|
403
|
+
return dict(zip(kets, vec[inds]))
|
404
|
+
|
405
|
+
return {tuple(ket): val for ket, val in zip(kets, vals[inds])}
|
406
|
+
|
407
|
+
@staticmethod
|
408
|
+
def _matrix_to_dict(mat, dims, decimals=None, string_labels=False):
|
409
|
+
"""Convert a matrix to a ket dictionary.
|
410
|
+
|
411
|
+
This representation will not show zero values in the output dict.
|
412
|
+
|
413
|
+
Args:
|
414
|
+
mat (array): a Numpy matrix array.
|
415
|
+
dims (tuple): subsystem dimensions.
|
416
|
+
decimals (None or int): number of decimal places to round to.
|
417
|
+
(See Numpy.round), if None no rounding
|
418
|
+
is done (Default: None).
|
419
|
+
string_labels (bool): return ket as string if True, otherwise
|
420
|
+
return as index array (Default: False).
|
421
|
+
|
422
|
+
Returns:
|
423
|
+
dict: the matrix in dictionary `ket` form.
|
424
|
+
"""
|
425
|
+
# Get indices of non-zero elements
|
426
|
+
vals = mat if decimals is None else mat.round(decimals=decimals)
|
427
|
+
(
|
428
|
+
inds_row,
|
429
|
+
inds_col,
|
430
|
+
) = vals.nonzero()
|
431
|
+
|
432
|
+
# Convert to ket tuple based on subsystem dimensions
|
433
|
+
bras = QuantumState._index_to_ket_array(inds_row, dims, string_labels=string_labels)
|
434
|
+
kets = QuantumState._index_to_ket_array(inds_col, dims, string_labels=string_labels)
|
435
|
+
|
436
|
+
# Make dict of tuples
|
437
|
+
if string_labels:
|
438
|
+
return {
|
439
|
+
f"{ket}|{bra}": val for ket, bra, val in zip(kets, bras, vals[inds_row, inds_col])
|
440
|
+
}
|
441
|
+
|
442
|
+
return {
|
443
|
+
(tuple(ket), tuple(bra)): val
|
444
|
+
for ket, bra, val in zip(kets, bras, vals[inds_row, inds_col])
|
445
|
+
}
|
446
|
+
|
447
|
+
@staticmethod
|
448
|
+
def _subsystem_probabilities(
|
449
|
+
probs: np.ndarray, dims: tuple, qargs: None | list = None
|
450
|
+
) -> np.ndarray:
|
451
|
+
"""Marginalize a probability vector according to subsystems.
|
452
|
+
|
453
|
+
Args:
|
454
|
+
probs (np.array): a probability vector Numpy array.
|
455
|
+
dims (tuple): subsystem dimensions.
|
456
|
+
qargs (None or list): a list of subsystems to return
|
457
|
+
marginalized probabilities for. If None return all
|
458
|
+
probabilities (Default: None).
|
459
|
+
|
460
|
+
Returns:
|
461
|
+
np.array: the marginalized probability vector flattened
|
462
|
+
for the specified qargs.
|
463
|
+
"""
|
464
|
+
if qargs is None:
|
465
|
+
return probs
|
466
|
+
# Convert qargs to tensor axes
|
467
|
+
probs_tens = np.reshape(probs, list(reversed(dims)))
|
468
|
+
ndim = probs_tens.ndim
|
469
|
+
qargs_axes = [ndim - 1 - i for i in reversed(qargs)]
|
470
|
+
# Get sum axis for marginalized subsystems
|
471
|
+
sum_axis = tuple(i for i in range(ndim) if i not in qargs_axes)
|
472
|
+
if sum_axis:
|
473
|
+
probs_tens = np.sum(probs_tens, axis=sum_axis)
|
474
|
+
qargs_axes = np.argsort(np.argsort(qargs_axes))
|
475
|
+
# Permute probability vector for desired qargs order
|
476
|
+
probs_tens = np.transpose(probs_tens, axes=qargs_axes)
|
477
|
+
new_probs = np.reshape(probs_tens, (probs_tens.size,))
|
478
|
+
return new_probs
|
479
|
+
|
480
|
+
# Overloads
|
481
|
+
def __and__(self, other):
|
482
|
+
return self.evolve(other)
|
483
|
+
|
484
|
+
def __xor__(self, other):
|
485
|
+
return self.tensor(other)
|
486
|
+
|
487
|
+
def __mul__(self, other):
|
488
|
+
return self._multiply(other)
|
489
|
+
|
490
|
+
def __truediv__(self, other):
|
491
|
+
return self._multiply(1 / other)
|
492
|
+
|
493
|
+
def __rmul__(self, other):
|
494
|
+
return self.__mul__(other)
|
495
|
+
|
496
|
+
def __add__(self, other):
|
497
|
+
return self._add(other)
|
498
|
+
|
499
|
+
def __sub__(self, other):
|
500
|
+
return self._add(-other)
|
501
|
+
|
502
|
+
def __neg__(self):
|
503
|
+
return self._multiply(-1)
|
@@ -0,0 +1,157 @@
|
|
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
|
+
Random state generation.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from typing import Literal
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
from numpy.random import default_rng
|
22
|
+
|
23
|
+
from qiskit.exceptions import QiskitError
|
24
|
+
from qiskit.quantum_info.operators.random import random_unitary
|
25
|
+
from .statevector import Statevector
|
26
|
+
from .densitymatrix import DensityMatrix
|
27
|
+
|
28
|
+
|
29
|
+
def random_statevector(
|
30
|
+
dims: int | tuple, seed: int | np.random.Generator | None = None
|
31
|
+
) -> Statevector:
|
32
|
+
"""Generator a random Statevector.
|
33
|
+
|
34
|
+
The statevector is sampled from the uniform distribution. This is the measure
|
35
|
+
induced by the Haar measure on unitary matrices.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
dims (int or tuple): the dimensions of the state.
|
39
|
+
seed (int or np.random.Generator): Optional. Set a fixed seed or
|
40
|
+
generator for RNG.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
Statevector: the random statevector.
|
44
|
+
|
45
|
+
Reference:
|
46
|
+
K. Zyczkowski and H. Sommers (2001), "Induced measures in the space of mixed quantum states",
|
47
|
+
`J. Phys. A: Math. Gen. 34 7111 <https://arxiv.org/abs/quant-ph/0012101>`__.
|
48
|
+
"""
|
49
|
+
if seed is None:
|
50
|
+
rng = np.random.default_rng()
|
51
|
+
elif isinstance(seed, np.random.Generator):
|
52
|
+
rng = seed
|
53
|
+
else:
|
54
|
+
rng = default_rng(seed)
|
55
|
+
|
56
|
+
dim = np.prod(dims)
|
57
|
+
vec = rng.standard_normal(dim).astype(complex)
|
58
|
+
vec += 1j * rng.standard_normal(dim)
|
59
|
+
vec /= np.linalg.norm(vec)
|
60
|
+
return Statevector(vec, dims=dims)
|
61
|
+
|
62
|
+
|
63
|
+
def random_density_matrix(
|
64
|
+
dims: int | tuple,
|
65
|
+
rank: int | None = None,
|
66
|
+
method: Literal["Hilbert-Schmidt", "Bures"] = "Hilbert-Schmidt",
|
67
|
+
seed: int | np.random.Generator | None = None,
|
68
|
+
) -> DensityMatrix:
|
69
|
+
"""Generator a random DensityMatrix.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
dims (int or tuple): the dimensions of the DensityMatrix.
|
73
|
+
rank (int or None): Optional, the rank of the density matrix.
|
74
|
+
The default value is full-rank.
|
75
|
+
method (string): Optional. The method to use.
|
76
|
+
'Hilbert-Schmidt': (Default) sample from the Hilbert-Schmidt metric.
|
77
|
+
'Bures': sample from the Bures metric.
|
78
|
+
seed (int or np.random.Generator): Optional. Set a fixed seed or
|
79
|
+
generator for RNG.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
DensityMatrix: the random density matrix.
|
83
|
+
|
84
|
+
Raises:
|
85
|
+
QiskitError: if the method is not valid.
|
86
|
+
"""
|
87
|
+
# Flatten dimensions
|
88
|
+
dim = np.prod(dims)
|
89
|
+
if rank is None:
|
90
|
+
rank = dim # Use full rank
|
91
|
+
|
92
|
+
if method == "Hilbert-Schmidt":
|
93
|
+
rho = _random_density_hs(dim, rank, seed)
|
94
|
+
elif method == "Bures":
|
95
|
+
rho = _random_density_bures(dim, rank, seed)
|
96
|
+
else:
|
97
|
+
raise QiskitError(f"Error: unrecognized method {method}")
|
98
|
+
return DensityMatrix(rho, dims=dims)
|
99
|
+
|
100
|
+
|
101
|
+
def _ginibre_matrix(nrow, ncol, seed):
|
102
|
+
"""Return a normally distributed complex random matrix.
|
103
|
+
|
104
|
+
Args:
|
105
|
+
nrow (int): number of rows in output matrix.
|
106
|
+
ncol (int): number of columns in output matrix.
|
107
|
+
seed(int or np.random.Generator): default rng.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
ndarray: A complex rectangular matrix where each real and imaginary
|
111
|
+
entry is sampled from the normal distribution.
|
112
|
+
"""
|
113
|
+
if seed is None:
|
114
|
+
rng = np.random.default_rng()
|
115
|
+
elif isinstance(seed, np.random.Generator):
|
116
|
+
rng = seed
|
117
|
+
else:
|
118
|
+
rng = default_rng(seed)
|
119
|
+
|
120
|
+
ginibre = rng.normal(size=(nrow, ncol)) + rng.normal(size=(nrow, ncol)) * 1j
|
121
|
+
return ginibre
|
122
|
+
|
123
|
+
|
124
|
+
def _random_density_hs(dim, rank, seed):
|
125
|
+
"""
|
126
|
+
Generate a random density matrix from the Hilbert-Schmidt metric.
|
127
|
+
|
128
|
+
Args:
|
129
|
+
dim (int): the dimensions of the density matrix.
|
130
|
+
rank (int or None): the rank of the density matrix. The default
|
131
|
+
value is full-rank.
|
132
|
+
seed (int or np.random.Generator): default rng.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
ndarray: rho (N,N) a density matrix.
|
136
|
+
"""
|
137
|
+
mat = _ginibre_matrix(dim, rank, seed)
|
138
|
+
mat = mat.dot(mat.conj().T)
|
139
|
+
return mat / np.trace(mat)
|
140
|
+
|
141
|
+
|
142
|
+
def _random_density_bures(dim, rank, seed):
|
143
|
+
"""Generate a random density matrix from the Bures metric.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
dim (int): the length of the density matrix.
|
147
|
+
rank (int or None): the rank of the density matrix. The default
|
148
|
+
value is full-rank.
|
149
|
+
seed (int or np.random.Generator): default rng.
|
150
|
+
|
151
|
+
Returns:
|
152
|
+
ndarray: rho (N,N) a density matrix.
|
153
|
+
"""
|
154
|
+
density = np.eye(dim) + random_unitary(dim, seed=seed).data
|
155
|
+
mat = density.dot(_ginibre_matrix(dim, rank, seed))
|
156
|
+
mat = mat.dot(mat.conj().T)
|
157
|
+
return mat / np.trace(mat)
|