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,247 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
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
|
+
Quantum information utility functions for states.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import math
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.quantum_info.states.statevector import Statevector
|
24
|
+
from qiskit.quantum_info.states.densitymatrix import DensityMatrix
|
25
|
+
from qiskit.quantum_info.operators.channel import SuperOp
|
26
|
+
from qiskit.quantum_info.operators.predicates import ATOL_DEFAULT
|
27
|
+
|
28
|
+
|
29
|
+
def partial_trace(state: Statevector | DensityMatrix, qargs: list) -> DensityMatrix:
|
30
|
+
"""Return reduced density matrix by tracing out part of quantum state.
|
31
|
+
|
32
|
+
If all subsystems are traced over this returns the
|
33
|
+
:meth:`~qiskit.quantum_info.DensityMatrix.trace` of the
|
34
|
+
input state.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
state (Statevector or DensityMatrix): the input state.
|
38
|
+
qargs (list): The subsystems to trace over.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
DensityMatrix: The reduced density matrix.
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
QiskitError: if input state is invalid.
|
45
|
+
"""
|
46
|
+
state = _format_state(state, validate=False)
|
47
|
+
|
48
|
+
# Compute traced shape
|
49
|
+
traced_shape = state._op_shape.remove(qargs=qargs)
|
50
|
+
# Convert vector shape to matrix shape
|
51
|
+
traced_shape._dims_r = traced_shape._dims_l
|
52
|
+
traced_shape._num_qargs_r = traced_shape._num_qargs_l
|
53
|
+
|
54
|
+
# If we are tracing over all subsystems we return the trace
|
55
|
+
if traced_shape.size == 0:
|
56
|
+
return state.trace()
|
57
|
+
|
58
|
+
# Statevector case
|
59
|
+
if isinstance(state, Statevector):
|
60
|
+
trace_systems = len(state._op_shape.dims_l()) - 1 - np.array(qargs)
|
61
|
+
arr = state._data.reshape(state._op_shape.tensor_shape)
|
62
|
+
rho = np.tensordot(arr, arr.conj(), axes=(trace_systems, trace_systems))
|
63
|
+
rho = np.reshape(rho, traced_shape.shape)
|
64
|
+
return DensityMatrix(rho, dims=traced_shape._dims_l)
|
65
|
+
|
66
|
+
# Density matrix case
|
67
|
+
# Empty partial trace case.
|
68
|
+
if not qargs:
|
69
|
+
return state.copy()
|
70
|
+
# Trace first subsystem to avoid coping whole density matrix
|
71
|
+
dims = state.dims(qargs)
|
72
|
+
tr_op = SuperOp(np.eye(dims[0]).reshape(1, dims[0] ** 2), input_dims=[dims[0]], output_dims=[1])
|
73
|
+
ret = state.evolve(tr_op, [qargs[0]])
|
74
|
+
# Trace over remaining subsystems
|
75
|
+
for qarg, dim in zip(qargs[1:], dims[1:]):
|
76
|
+
tr_op = SuperOp(np.eye(dim).reshape(1, dim**2), input_dims=[dim], output_dims=[1])
|
77
|
+
ret = ret.evolve(tr_op, [qarg])
|
78
|
+
# Remove traced over subsystems which are listed as dimension 1
|
79
|
+
ret._op_shape = traced_shape
|
80
|
+
return ret
|
81
|
+
|
82
|
+
|
83
|
+
def shannon_entropy(pvec: list | np.ndarray, base: int = 2) -> float:
|
84
|
+
r"""Compute the Shannon entropy of a probability vector.
|
85
|
+
|
86
|
+
The shannon entropy of a probability vector
|
87
|
+
:math:`\vec{p} = [p_0, ..., p_{n-1}]` is defined as
|
88
|
+
|
89
|
+
.. math::
|
90
|
+
|
91
|
+
H(\vec{p}) = \sum_{i=0}^{n-1} p_i \log_b(p_i)
|
92
|
+
|
93
|
+
where :math:`b` is the log base and (default 2), and
|
94
|
+
:math:`0 \log_b(0) \equiv 0`.
|
95
|
+
|
96
|
+
Args:
|
97
|
+
pvec (array_like): a probability vector.
|
98
|
+
base (int): the base of the logarithm [Default: 2].
|
99
|
+
|
100
|
+
Returns:
|
101
|
+
float: The Shannon entropy H(pvec).
|
102
|
+
"""
|
103
|
+
if base == 2:
|
104
|
+
|
105
|
+
def logfn(x):
|
106
|
+
return -x * math.log2(x)
|
107
|
+
|
108
|
+
elif base == np.e:
|
109
|
+
|
110
|
+
def logfn(x):
|
111
|
+
return -x * math.log(x)
|
112
|
+
|
113
|
+
else:
|
114
|
+
log_base = math.log(base)
|
115
|
+
|
116
|
+
def logfn(x):
|
117
|
+
return -x * math.log(x) / log_base
|
118
|
+
|
119
|
+
h_val = 0.0
|
120
|
+
for x in pvec:
|
121
|
+
if 0 < x < 1:
|
122
|
+
h_val += logfn(x)
|
123
|
+
return h_val
|
124
|
+
|
125
|
+
|
126
|
+
def schmidt_decomposition(state, qargs):
|
127
|
+
r"""Return the Schmidt Decomposition of a pure quantum state.
|
128
|
+
|
129
|
+
For an arbitrary bipartite state:
|
130
|
+
|
131
|
+
.. math::
|
132
|
+
|\psi\rangle_{AB} = \sum_{i,j} c_{ij}
|
133
|
+
|x_i\rangle_A \otimes |y_j\rangle_B,
|
134
|
+
|
135
|
+
its Schmidt Decomposition is given by the single-index sum over k:
|
136
|
+
|
137
|
+
.. math::
|
138
|
+
|\psi\rangle_{AB} = \sum_{k} \lambda_{k}
|
139
|
+
|u_k\rangle_A \otimes |v_k\rangle_B
|
140
|
+
|
141
|
+
where :math:`|u_k\rangle_A` and :math:`|v_k\rangle_B` are an
|
142
|
+
orthonormal set of vectors in their respective spaces :math:`A` and :math:`B`,
|
143
|
+
and the Schmidt coefficients :math:`\lambda_k` are positive real values.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
state (Statevector or DensityMatrix): the input state.
|
147
|
+
qargs (list): the list of Input state positions corresponding to subsystem :math:`B`.
|
148
|
+
|
149
|
+
Returns:
|
150
|
+
list: list of tuples ``(s, u, v)``, where ``s`` (float) are the Schmidt coefficients
|
151
|
+
:math:`\lambda_k`, and ``u`` (Statevector), ``v`` (Statevector) are the Schmidt vectors
|
152
|
+
:math:`|u_k\rangle_A`, :math:`|u_k\rangle_B`, respectively.
|
153
|
+
|
154
|
+
Raises:
|
155
|
+
QiskitError: if Input qargs is not a list of positions of the Input state.
|
156
|
+
QiskitError: if Input qargs is not a proper subset of Input state.
|
157
|
+
|
158
|
+
.. note::
|
159
|
+
In Qiskit, qubits are ordered using little-endian notation, with the least significant
|
160
|
+
qubits having smaller indices. For example, a four-qubit system is represented as
|
161
|
+
:math:`|q_3q_2q_1q_0\rangle`. Using this convention, setting ``qargs=[0]`` will partition the
|
162
|
+
state as :math:`|q_3q_2q_1\rangle_A\otimes|q_0\rangle_B`. Furthermore, qubits will be organized
|
163
|
+
in this notation regardless of the order they are passed. For instance, passing either
|
164
|
+
``qargs=[1,2]`` or ``qargs=[2,1]`` will result in partitioning the state as
|
165
|
+
:math:`|q_3q_0\rangle_A\otimes|q_2q_1\rangle_B`.
|
166
|
+
"""
|
167
|
+
state = _format_state(state, validate=False)
|
168
|
+
|
169
|
+
# convert to statevector if state is density matrix. Errors if state is mixed.
|
170
|
+
if isinstance(state, DensityMatrix):
|
171
|
+
state = state.to_statevector()
|
172
|
+
|
173
|
+
# reshape statevector into state tensor
|
174
|
+
dims = state.dims()
|
175
|
+
state_tens = state._data.reshape(dims[::-1])
|
176
|
+
ndim = state_tens.ndim
|
177
|
+
qudits = list(range(ndim))
|
178
|
+
|
179
|
+
# check if qargs are valid
|
180
|
+
if not isinstance(qargs, (list, np.ndarray)):
|
181
|
+
raise QiskitError("Input qargs is not a list of positions of the Input state")
|
182
|
+
qargs = set(qargs)
|
183
|
+
if qargs == set(qudits) or not qargs.issubset(qudits):
|
184
|
+
raise QiskitError("Input qargs is not a proper subset of Input state")
|
185
|
+
|
186
|
+
# define subsystem A and B qargs and dims
|
187
|
+
qargs_b = list(qargs)
|
188
|
+
qargs_a = [i for i in qudits if i not in qargs_b]
|
189
|
+
dims_b = state.dims(qargs_b)
|
190
|
+
dims_a = state.dims(qargs_a)
|
191
|
+
ndim_b = np.prod(dims_b)
|
192
|
+
ndim_a = np.prod(dims_a)
|
193
|
+
|
194
|
+
# permute state for desired qargs order
|
195
|
+
qargs_axes = [qudits[::-1].index(i) for i in qargs_b + qargs_a][::-1]
|
196
|
+
state_tens = state_tens.transpose(qargs_axes)
|
197
|
+
|
198
|
+
# convert state tensor to matrix of prob amplitudes and perform svd.
|
199
|
+
state_mat = state_tens.reshape([ndim_a, ndim_b])
|
200
|
+
u_mat, s_arr, vh_mat = np.linalg.svd(state_mat, full_matrices=False)
|
201
|
+
|
202
|
+
schmidt_components = [
|
203
|
+
(s, Statevector(u, dims=dims_a), Statevector(v, dims=dims_b))
|
204
|
+
for s, u, v in zip(s_arr, u_mat.T, vh_mat)
|
205
|
+
if s > ATOL_DEFAULT
|
206
|
+
]
|
207
|
+
|
208
|
+
return schmidt_components
|
209
|
+
|
210
|
+
|
211
|
+
def _format_state(state, validate=True):
|
212
|
+
"""Format input state into class object"""
|
213
|
+
if isinstance(state, list):
|
214
|
+
state = np.array(state, dtype=complex)
|
215
|
+
if isinstance(state, np.ndarray):
|
216
|
+
ndim = state.ndim
|
217
|
+
if ndim == 1:
|
218
|
+
state = Statevector(state)
|
219
|
+
elif ndim == 2:
|
220
|
+
dim1, dim2 = state.shape
|
221
|
+
if dim2 == 1:
|
222
|
+
state = Statevector(state)
|
223
|
+
elif dim1 == dim2:
|
224
|
+
state = DensityMatrix(state)
|
225
|
+
if not isinstance(state, (Statevector, DensityMatrix)):
|
226
|
+
raise QiskitError("Input is not a quantum state")
|
227
|
+
if validate and not state.is_valid():
|
228
|
+
raise QiskitError("Input quantum state is not a valid")
|
229
|
+
return state
|
230
|
+
|
231
|
+
|
232
|
+
def _funm_svd(matrix, func):
|
233
|
+
"""Apply real scalar function to singular values of a matrix.
|
234
|
+
|
235
|
+
Args:
|
236
|
+
matrix (array_like): (N, N) Matrix at which to evaluate the function.
|
237
|
+
func (callable): Callable object that evaluates a scalar function f.
|
238
|
+
|
239
|
+
Returns:
|
240
|
+
ndarray: funm (N, N) Value of the matrix function specified by func
|
241
|
+
evaluated at `A`.
|
242
|
+
"""
|
243
|
+
import scipy.linalg as la
|
244
|
+
|
245
|
+
unitary1, singular_values, unitary2 = la.svd(matrix)
|
246
|
+
diag_func_singular = np.diag(func(singular_values))
|
247
|
+
return unitary1.dot(diag_func_singular).dot(unitary2)
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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
|
+
=========================================
|
15
|
+
Experiment Results (:mod:`qiskit.result`)
|
16
|
+
=========================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.result
|
19
|
+
|
20
|
+
Core classes
|
21
|
+
============
|
22
|
+
|
23
|
+
.. autosummary::
|
24
|
+
:toctree: ../stubs/
|
25
|
+
|
26
|
+
Result
|
27
|
+
ResultError
|
28
|
+
Counts
|
29
|
+
|
30
|
+
Marginalization
|
31
|
+
===============
|
32
|
+
|
33
|
+
.. autofunction:: marginal_counts
|
34
|
+
.. autofunction:: marginal_distribution
|
35
|
+
.. autofunction:: marginal_memory
|
36
|
+
|
37
|
+
Distributions
|
38
|
+
=============
|
39
|
+
|
40
|
+
.. autosummary::
|
41
|
+
:toctree: ../stubs/
|
42
|
+
|
43
|
+
ProbDistribution
|
44
|
+
QuasiDistribution
|
45
|
+
|
46
|
+
Expectation values
|
47
|
+
==================
|
48
|
+
|
49
|
+
.. autofunction:: sampled_expectation_value
|
50
|
+
|
51
|
+
"""
|
52
|
+
|
53
|
+
from .counts import Counts
|
54
|
+
from .distributions import QuasiDistribution, ProbDistribution
|
55
|
+
from .exceptions import ResultError
|
56
|
+
from .models import MeasLevel, MeasReturnType
|
57
|
+
from .result import Result
|
58
|
+
from .sampled_expval import sampled_expectation_value
|
59
|
+
from .utils import marginal_counts
|
60
|
+
from .utils import marginal_distribution
|
61
|
+
from .utils import marginal_memory
|
qiskit/result/counts.py
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
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
|
+
"""A container class for counts from a circuit execution."""
|
14
|
+
|
15
|
+
import re
|
16
|
+
|
17
|
+
from qiskit.result import postprocess
|
18
|
+
from qiskit import exceptions
|
19
|
+
|
20
|
+
|
21
|
+
# NOTE: A dict subclass should not overload any dunder methods like __getitem__
|
22
|
+
# this can cause unexpected behavior and issues as the cPython dict
|
23
|
+
# implementation has many standard methods in C for performance and the dunder
|
24
|
+
# methods are not always used as expected. For example, update() doesn't call
|
25
|
+
# __setitem__ so overloading __setitem__ would not always provide the expected
|
26
|
+
# result
|
27
|
+
class Counts(dict):
|
28
|
+
"""A class to store a counts result from a circuit execution."""
|
29
|
+
|
30
|
+
bitstring_regex = re.compile(r"^[01\s]+$")
|
31
|
+
|
32
|
+
def __init__(self, data, time_taken=None, creg_sizes=None, memory_slots=None):
|
33
|
+
"""Build a counts object
|
34
|
+
|
35
|
+
Args:
|
36
|
+
data (dict): The dictionary input for the counts. Where the keys
|
37
|
+
represent a measured classical value and the value is an
|
38
|
+
integer the number of shots with that result.
|
39
|
+
The keys can be one of several formats:
|
40
|
+
|
41
|
+
* A hexadecimal string of the form ``'0x4a'``
|
42
|
+
* A bit string prefixed with ``0b`` for example ``'0b1011'``
|
43
|
+
* A bit string formatted across register and memory slots.
|
44
|
+
For example, ``'00 10'``.
|
45
|
+
* A dit string, for example ``'02'``. Note for objects created
|
46
|
+
with dit strings the ``creg_sizes`` and ``memory_slots``
|
47
|
+
kwargs don't work and :meth:`hex_outcomes` and
|
48
|
+
:meth:`int_outcomes` also do not work.
|
49
|
+
|
50
|
+
time_taken (float): The duration of the experiment that generated
|
51
|
+
the counts in seconds.
|
52
|
+
creg_sizes (list): a nested list where the inner element is a list
|
53
|
+
of tuples containing both the classical register name and
|
54
|
+
classical register size. For example,
|
55
|
+
``[('c_reg', 2), ('my_creg', 4)]``.
|
56
|
+
memory_slots (int): The number of total ``memory_slots`` in the
|
57
|
+
experiment.
|
58
|
+
Raises:
|
59
|
+
TypeError: If the input key type is not an ``int`` or ``str``.
|
60
|
+
QiskitError: If a dit string key is input with ``creg_sizes`` and/or
|
61
|
+
``memory_slots``.
|
62
|
+
"""
|
63
|
+
bin_data = None
|
64
|
+
data = dict(data)
|
65
|
+
if not data:
|
66
|
+
self.int_raw = {}
|
67
|
+
self.hex_raw = {}
|
68
|
+
bin_data = {}
|
69
|
+
else:
|
70
|
+
first_key = next(iter(data.keys()))
|
71
|
+
if isinstance(first_key, int):
|
72
|
+
self.int_raw = data
|
73
|
+
self.hex_raw = {hex(key): value for key, value in self.int_raw.items()}
|
74
|
+
elif isinstance(first_key, str):
|
75
|
+
if first_key.startswith("0x"):
|
76
|
+
self.hex_raw = data
|
77
|
+
self.int_raw = {int(key, 0): value for key, value in self.hex_raw.items()}
|
78
|
+
elif first_key.startswith("0b"):
|
79
|
+
self.int_raw = {int(key, 0): value for key, value in data.items()}
|
80
|
+
self.hex_raw = {hex(key): value for key, value in self.int_raw.items()}
|
81
|
+
else:
|
82
|
+
if not creg_sizes and not memory_slots:
|
83
|
+
self.hex_raw = None
|
84
|
+
self.int_raw = None
|
85
|
+
bin_data = data
|
86
|
+
else:
|
87
|
+
hex_dict = {}
|
88
|
+
int_dict = {}
|
89
|
+
for bitstring, value in data.items():
|
90
|
+
if not self.bitstring_regex.search(bitstring):
|
91
|
+
raise exceptions.QiskitError(
|
92
|
+
"Counts objects with dit strings do not "
|
93
|
+
"currently support dit string formatting parameters "
|
94
|
+
"creg_sizes or memory_slots"
|
95
|
+
)
|
96
|
+
int_key = self._remove_space_underscore(bitstring)
|
97
|
+
int_dict[int_key] = value
|
98
|
+
hex_dict[hex(int_key)] = value
|
99
|
+
self.hex_raw = hex_dict
|
100
|
+
self.int_raw = int_dict
|
101
|
+
else:
|
102
|
+
raise TypeError(
|
103
|
+
"Invalid input key type %s, must be either an int "
|
104
|
+
"key or string key with hexadecimal value or bit string"
|
105
|
+
)
|
106
|
+
header = {}
|
107
|
+
self.creg_sizes = creg_sizes
|
108
|
+
if self.creg_sizes:
|
109
|
+
header["creg_sizes"] = self.creg_sizes
|
110
|
+
self.memory_slots = memory_slots
|
111
|
+
if self.memory_slots:
|
112
|
+
header["memory_slots"] = self.memory_slots
|
113
|
+
if not bin_data:
|
114
|
+
bin_data = postprocess.format_counts(self.hex_raw, header=header)
|
115
|
+
super().__init__(bin_data)
|
116
|
+
self.time_taken = time_taken
|
117
|
+
|
118
|
+
def most_frequent(self):
|
119
|
+
"""Return the most frequent count
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
str: The bit string for the most frequent result
|
123
|
+
Raises:
|
124
|
+
QiskitError: when there is >1 count with the same max counts, or
|
125
|
+
an empty object.
|
126
|
+
"""
|
127
|
+
if not self:
|
128
|
+
raise exceptions.QiskitError("Can not return a most frequent count on an empty object")
|
129
|
+
max_value = max(self.values())
|
130
|
+
max_values_counts = [x[0] for x in self.items() if x[1] == max_value]
|
131
|
+
if len(max_values_counts) != 1:
|
132
|
+
raise exceptions.QiskitError(
|
133
|
+
f"Multiple values have the same maximum counts: {','.join(max_values_counts)}"
|
134
|
+
)
|
135
|
+
return max_values_counts[0]
|
136
|
+
|
137
|
+
def hex_outcomes(self):
|
138
|
+
"""Return a counts dictionary with hexadecimal string keys
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
dict: A dictionary with the keys as hexadecimal strings instead of
|
142
|
+
bitstrings
|
143
|
+
Raises:
|
144
|
+
QiskitError: If the Counts object contains counts for dit strings
|
145
|
+
"""
|
146
|
+
if self.hex_raw:
|
147
|
+
return {key.lower(): value for key, value in self.hex_raw.items()}
|
148
|
+
else:
|
149
|
+
out_dict = {}
|
150
|
+
for bitstring, value in self.items():
|
151
|
+
if not self.bitstring_regex.search(bitstring):
|
152
|
+
raise exceptions.QiskitError(
|
153
|
+
"Counts objects with dit strings do not "
|
154
|
+
"currently support conversion to hexadecimal"
|
155
|
+
)
|
156
|
+
int_key = self._remove_space_underscore(bitstring)
|
157
|
+
out_dict[hex(int_key)] = value
|
158
|
+
return out_dict
|
159
|
+
|
160
|
+
def int_outcomes(self):
|
161
|
+
"""Build a counts dictionary with integer keys instead of count strings
|
162
|
+
|
163
|
+
Returns:
|
164
|
+
dict: A dictionary with the keys as integers instead of bitstrings
|
165
|
+
Raises:
|
166
|
+
QiskitError: If the Counts object contains counts for dit strings
|
167
|
+
"""
|
168
|
+
if self.int_raw:
|
169
|
+
return self.int_raw
|
170
|
+
else:
|
171
|
+
out_dict = {}
|
172
|
+
for bitstring, value in self.items():
|
173
|
+
if not self.bitstring_regex.search(bitstring):
|
174
|
+
raise exceptions.QiskitError(
|
175
|
+
"Counts objects with dit strings do not "
|
176
|
+
"currently support conversion to integer"
|
177
|
+
)
|
178
|
+
int_key = self._remove_space_underscore(bitstring)
|
179
|
+
out_dict[int_key] = value
|
180
|
+
return out_dict
|
181
|
+
|
182
|
+
@staticmethod
|
183
|
+
def _remove_space_underscore(bitstring):
|
184
|
+
"""Removes all spaces and underscores from bitstring"""
|
185
|
+
return int(bitstring.replace(" ", "").replace("_", ""), 2)
|
186
|
+
|
187
|
+
def shots(self):
|
188
|
+
"""Return the number of shots"""
|
189
|
+
return sum(self.values())
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Distributions
|
15
|
+
"""
|
16
|
+
from .probability import ProbDistribution
|
17
|
+
from .quasi import QuasiDistribution
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""Class for probability distributions."""
|
13
|
+
|
14
|
+
import re
|
15
|
+
|
16
|
+
|
17
|
+
# NOTE: A dict subclass should not overload any dunder methods like __getitem__
|
18
|
+
# this can cause unexpected behavior and issues as the cPython dict
|
19
|
+
# implementation has many standard methods in C for performance and the dunder
|
20
|
+
# methods are not always used as expected. For example, update() doesn't call
|
21
|
+
# __setitem__ so overloading __setitem__ would not always provide the expected
|
22
|
+
# result
|
23
|
+
class ProbDistribution(dict):
|
24
|
+
"""A generic dict-like class for probability distributions."""
|
25
|
+
|
26
|
+
_bitstring_regex = re.compile(r"^[01]+$")
|
27
|
+
|
28
|
+
def __init__(self, data, shots=None):
|
29
|
+
"""Builds a probability distribution object.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
data (dict): Input probability data. Where the keys
|
33
|
+
represent a measured classical value and the value is a
|
34
|
+
float for the probability of that result.
|
35
|
+
The keys can be one of several formats:
|
36
|
+
|
37
|
+
* A hexadecimal string of the form ``"0x4a"``
|
38
|
+
* A bit string e.g. ``'0b1011'`` or ``"01011"``
|
39
|
+
* An integer
|
40
|
+
|
41
|
+
shots (int): Number of shots the distribution was derived from.
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
TypeError: If the input keys are not a string or int
|
45
|
+
ValueError: If the string format of the keys is incorrect
|
46
|
+
"""
|
47
|
+
self.shots = shots
|
48
|
+
self._num_bits = 0
|
49
|
+
if data:
|
50
|
+
first_key = next(iter(data.keys()))
|
51
|
+
if isinstance(first_key, int):
|
52
|
+
# `self._num_bits` is not always the exact number of qubits measured,
|
53
|
+
# but the number of bits to represent the largest key.
|
54
|
+
self._num_bits = len(bin(max(data.keys()))) - 2
|
55
|
+
elif isinstance(first_key, str):
|
56
|
+
if first_key.startswith("0x") or first_key.startswith("0b"):
|
57
|
+
data = {int(key, 0): value for key, value in data.items()}
|
58
|
+
# `self._num_bits` is not always the exact number of qubits measured,
|
59
|
+
# but the number of bits to represent the largest key.
|
60
|
+
self._num_bits = len(bin(max(data.keys()))) - 2
|
61
|
+
elif self._bitstring_regex.search(first_key):
|
62
|
+
# `self._num_bits` is the exact number of qubits measured.
|
63
|
+
self._num_bits = max(len(key) for key in data)
|
64
|
+
data = {int(key, 2): value for key, value in data.items()}
|
65
|
+
else:
|
66
|
+
raise ValueError(
|
67
|
+
"The input keys are not a valid string format, must either "
|
68
|
+
"be a hex string prefixed by '0x' or a binary string "
|
69
|
+
"optionally prefixed with 0b"
|
70
|
+
)
|
71
|
+
else:
|
72
|
+
raise TypeError("Input data's keys are of invalid type, must be str or int")
|
73
|
+
super().__init__(data)
|
74
|
+
|
75
|
+
def binary_probabilities(self, num_bits=None):
|
76
|
+
"""Build a probabilities dictionary with binary string keys
|
77
|
+
|
78
|
+
Parameters:
|
79
|
+
num_bits (int): number of bits in the binary bitstrings (leading
|
80
|
+
zeros will be padded). If None, a default value will be used.
|
81
|
+
If keys are given as integers or strings with binary or hex prefix,
|
82
|
+
the default value will be derived from the largest key present.
|
83
|
+
If keys are given as bitstrings without prefix,
|
84
|
+
the default value will be derived from the largest key length.
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
dict: A dictionary where the keys are binary strings in the format
|
88
|
+
``"0110"``
|
89
|
+
"""
|
90
|
+
n = self._num_bits if num_bits is None else num_bits
|
91
|
+
return {format(key, "b").zfill(n): value for key, value in self.items()}
|
92
|
+
|
93
|
+
def hex_probabilities(self):
|
94
|
+
"""Build a probabilities dictionary with hexadecimal string keys
|
95
|
+
|
96
|
+
Returns:
|
97
|
+
dict: A dictionary where the keys are hexadecimal strings in the
|
98
|
+
format ``"0x1a"``
|
99
|
+
"""
|
100
|
+
return {hex(key): value for key, value in self.items()}
|