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,154 @@
|
|
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
|
+
"""Quasidistribution class"""
|
13
|
+
|
14
|
+
from math import sqrt
|
15
|
+
import re
|
16
|
+
|
17
|
+
from .probability import ProbDistribution
|
18
|
+
|
19
|
+
|
20
|
+
# NOTE: A dict subclass should not overload any dunder methods like __getitem__
|
21
|
+
# this can cause unexpected behavior and issues as the cPython dict
|
22
|
+
# implementation has many standard methods in C for performance and the dunder
|
23
|
+
# methods are not always used as expected. For example, update() doesn't call
|
24
|
+
# __setitem__ so overloading __setitem__ would not always provide the expected
|
25
|
+
# result
|
26
|
+
class QuasiDistribution(dict):
|
27
|
+
"""A dict-like class for representing quasi-probabilities."""
|
28
|
+
|
29
|
+
_bitstring_regex = re.compile(r"^[01]+$")
|
30
|
+
__ndigits__ = 15
|
31
|
+
|
32
|
+
def __init__(self, data, shots=None, stddev_upper_bound=None):
|
33
|
+
"""Builds a quasiprobability distribution object.
|
34
|
+
|
35
|
+
.. note::
|
36
|
+
|
37
|
+
The quasiprobability values might include floating-point errors.
|
38
|
+
``QuasiDistribution.__repr__`` rounds using :meth:`numpy.round`
|
39
|
+
and the parameter ``ndigits`` can be manipulated with the
|
40
|
+
class attribute ``__ndigits__``. The default is ``15``.
|
41
|
+
|
42
|
+
Parameters:
|
43
|
+
data (dict): Input quasiprobability data. Where the keys
|
44
|
+
represent a measured classical value and the value is a
|
45
|
+
float for the quasiprobability of that result.
|
46
|
+
The keys can be one of several formats:
|
47
|
+
|
48
|
+
* A hexadecimal string of the form ``"0x4a"``
|
49
|
+
* A bit string e.g. ``'0b1011'`` or ``"01011"``
|
50
|
+
* An integer
|
51
|
+
|
52
|
+
shots (int): Number of shots the distribution was derived from.
|
53
|
+
stddev_upper_bound (float): An upper bound for the standard deviation
|
54
|
+
|
55
|
+
Raises:
|
56
|
+
TypeError: If the input keys are not a string or int
|
57
|
+
ValueError: If the string format of the keys is incorrect
|
58
|
+
"""
|
59
|
+
self.shots = shots
|
60
|
+
self._stddev_upper_bound = stddev_upper_bound
|
61
|
+
self._num_bits = 0
|
62
|
+
if data:
|
63
|
+
first_key = next(iter(data.keys()))
|
64
|
+
if isinstance(first_key, int):
|
65
|
+
# `self._num_bits` is not always the exact number of qubits measured,
|
66
|
+
# but the number of bits to represent the largest key.
|
67
|
+
self._num_bits = len(bin(max(data.keys()))) - 2
|
68
|
+
elif isinstance(first_key, str):
|
69
|
+
if first_key.startswith("0x") or first_key.startswith("0b"):
|
70
|
+
data = {int(key, 0): value for key, value in data.items()}
|
71
|
+
# `self._num_bits` is not always the exact number of qubits measured,
|
72
|
+
# but the number of bits to represent the largest key.
|
73
|
+
self._num_bits = len(bin(max(data.keys()))) - 2
|
74
|
+
elif self._bitstring_regex.search(first_key):
|
75
|
+
# `self._num_bits` is the exact number of qubits measured.
|
76
|
+
self._num_bits = max(len(key) for key in data)
|
77
|
+
data = {int(key, 2): value for key, value in data.items()}
|
78
|
+
else:
|
79
|
+
raise ValueError(
|
80
|
+
"The input keys are not a valid string format, must either "
|
81
|
+
"be a hex string prefixed by '0x' or a binary string "
|
82
|
+
"optionally prefixed with 0b"
|
83
|
+
)
|
84
|
+
else:
|
85
|
+
raise TypeError("Input data's keys are of invalid type, must be str or int")
|
86
|
+
super().__init__(data)
|
87
|
+
|
88
|
+
def nearest_probability_distribution(self, return_distance=False):
|
89
|
+
"""Takes a quasiprobability distribution and maps
|
90
|
+
it to the closest probability distribution as defined by
|
91
|
+
the L2-norm.
|
92
|
+
|
93
|
+
Parameters:
|
94
|
+
return_distance (bool): Return the L2 distance between distributions.
|
95
|
+
|
96
|
+
Returns:
|
97
|
+
ProbDistribution: Nearest probability distribution.
|
98
|
+
float: Euclidean (L2) distance of distributions.
|
99
|
+
|
100
|
+
Notes:
|
101
|
+
Method from Smolin et al., Phys. Rev. Lett. 108, 070502 (2012).
|
102
|
+
"""
|
103
|
+
sorted_probs = dict(sorted(self.items(), key=lambda item: item[1]))
|
104
|
+
num_elems = len(sorted_probs)
|
105
|
+
new_probs = {}
|
106
|
+
beta = 0
|
107
|
+
diff = 0
|
108
|
+
for key, val in sorted_probs.items():
|
109
|
+
temp = val + beta / num_elems
|
110
|
+
if temp < 0:
|
111
|
+
beta += val
|
112
|
+
num_elems -= 1
|
113
|
+
diff += val * val
|
114
|
+
else:
|
115
|
+
diff += (beta / num_elems) * (beta / num_elems)
|
116
|
+
new_probs[key] = sorted_probs[key] + beta / num_elems
|
117
|
+
if return_distance:
|
118
|
+
return ProbDistribution(new_probs, self.shots), sqrt(diff)
|
119
|
+
return ProbDistribution(new_probs, self.shots)
|
120
|
+
|
121
|
+
def binary_probabilities(self, num_bits=None):
|
122
|
+
"""Build a quasi-probabilities dictionary with binary string keys
|
123
|
+
|
124
|
+
Parameters:
|
125
|
+
num_bits (int): number of bits in the binary bitstrings (leading
|
126
|
+
zeros will be padded). If None, a default value will be used.
|
127
|
+
If keys are given as integers or strings with binary or hex prefix,
|
128
|
+
the default value will be derived from the largest key present.
|
129
|
+
If keys are given as bitstrings without prefix,
|
130
|
+
the default value will be derived from the largest key length.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
dict: A dictionary where the keys are binary strings in the format
|
134
|
+
``"0110"``
|
135
|
+
"""
|
136
|
+
n = self._num_bits if num_bits is None else num_bits
|
137
|
+
return {format(key, "b").zfill(n): value for key, value in self.items()}
|
138
|
+
|
139
|
+
def hex_probabilities(self):
|
140
|
+
"""Build a quasi-probabilities dictionary with hexadecimal string keys
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
dict: A dictionary where the keys are hexadecimal strings in the
|
144
|
+
format ``"0x1a"``
|
145
|
+
"""
|
146
|
+
return {hex(key): value for key, value in self.items()}
|
147
|
+
|
148
|
+
@property
|
149
|
+
def stddev_upper_bound(self):
|
150
|
+
"""Return an upper bound on standard deviation of expval estimator."""
|
151
|
+
return self._stddev_upper_bound
|
152
|
+
|
153
|
+
def __repr__(self):
|
154
|
+
return str({key: round(value, ndigits=self.__ndigits__) for key, value in self.items()})
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
Exception for errors when there's an error in the Result
|
15
|
+
"""
|
16
|
+
|
17
|
+
from qiskit.exceptions import QiskitError
|
18
|
+
|
19
|
+
|
20
|
+
class ResultError(QiskitError):
|
21
|
+
"""Exceptions raised due to errors in result output.
|
22
|
+
|
23
|
+
It may be better for the Qiskit API to raise this exception.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
error (dict): This is the error record as it comes back from
|
27
|
+
the API. The format is like::
|
28
|
+
|
29
|
+
error = {'status': 403,
|
30
|
+
'message': 'Your credits are not enough.',
|
31
|
+
'code': 'MAX_CREDITS_EXCEEDED'}
|
32
|
+
"""
|
33
|
+
|
34
|
+
def __init__(self, error):
|
35
|
+
super().__init__(error["message"])
|
36
|
+
self.status = error["status"]
|
37
|
+
self.code = error["code"]
|
38
|
+
|
39
|
+
def __str__(self):
|
40
|
+
return f"{self.code}: {self.message}"
|
qiskit/result/models.py
ADDED
@@ -0,0 +1,241 @@
|
|
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
|
+
"""Schema and helper models for schema-conformant Results."""
|
14
|
+
|
15
|
+
import copy
|
16
|
+
from enum import Enum, IntEnum
|
17
|
+
|
18
|
+
from qiskit.exceptions import QiskitError
|
19
|
+
|
20
|
+
|
21
|
+
class MeasReturnType(str, Enum):
|
22
|
+
"""meas_return allowed values defined by legacy PulseQobjConfig object but still used by Result."""
|
23
|
+
|
24
|
+
AVERAGE = "avg"
|
25
|
+
SINGLE = "single"
|
26
|
+
|
27
|
+
|
28
|
+
class MeasLevel(IntEnum):
|
29
|
+
"""MeasLevel allowed values defined by legacy PulseQobjConfig object but still used by Result."""
|
30
|
+
|
31
|
+
RAW = 0
|
32
|
+
KERNELED = 1
|
33
|
+
CLASSIFIED = 2
|
34
|
+
|
35
|
+
|
36
|
+
class ExperimentResultData:
|
37
|
+
"""Class representing experiment result data"""
|
38
|
+
|
39
|
+
def __init__(
|
40
|
+
self, counts=None, snapshots=None, memory=None, statevector=None, unitary=None, **kwargs
|
41
|
+
):
|
42
|
+
"""Initialize an ExperimentalResult Data class
|
43
|
+
|
44
|
+
Args:
|
45
|
+
counts (dict): A dictionary where the keys are the result in
|
46
|
+
hexadecimal as string of the format "0xff" and the value
|
47
|
+
is the number of counts for that result
|
48
|
+
snapshots (dict): A dictionary where the key is the snapshot
|
49
|
+
slot and the value is a dictionary of the snapshots for
|
50
|
+
that slot.
|
51
|
+
memory (list): A list of results per shot if the run had
|
52
|
+
memory enabled
|
53
|
+
statevector (list or numpy.array): A list or numpy array of the
|
54
|
+
statevector result
|
55
|
+
unitary (list or numpy.array): A list or numpy array of the
|
56
|
+
unitary result
|
57
|
+
kwargs (any): additional data key-value pairs.
|
58
|
+
"""
|
59
|
+
self._data_attributes = []
|
60
|
+
if counts is not None:
|
61
|
+
self._data_attributes.append("counts")
|
62
|
+
self.counts = counts
|
63
|
+
if snapshots is not None:
|
64
|
+
self._data_attributes.append("snapshots")
|
65
|
+
self.snapshots = snapshots
|
66
|
+
if memory is not None:
|
67
|
+
self._data_attributes.append("memory")
|
68
|
+
self.memory = memory
|
69
|
+
if statevector is not None:
|
70
|
+
self._data_attributes.append("statevector")
|
71
|
+
self.statevector = statevector
|
72
|
+
if unitary is not None:
|
73
|
+
self._data_attributes.append("unitary")
|
74
|
+
self.unitary = unitary
|
75
|
+
for key, value in kwargs.items():
|
76
|
+
setattr(self, key, value)
|
77
|
+
self._data_attributes.append(key)
|
78
|
+
|
79
|
+
def __repr__(self):
|
80
|
+
string_list = []
|
81
|
+
for field in self._data_attributes:
|
82
|
+
string_list.append(f"{field}={getattr(self, field)}")
|
83
|
+
return f"ExperimentResultData({', '.join(string_list)})"
|
84
|
+
|
85
|
+
def to_dict(self):
|
86
|
+
"""Return a dictionary format representation of the ExperimentResultData
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
dict: The dictionary form of the ExperimentResultData
|
90
|
+
"""
|
91
|
+
out_dict = {}
|
92
|
+
for field in self._data_attributes:
|
93
|
+
out_dict[field] = getattr(self, field)
|
94
|
+
return out_dict
|
95
|
+
|
96
|
+
@classmethod
|
97
|
+
def from_dict(cls, data):
|
98
|
+
"""Create a new ExperimentResultData object from a dictionary.
|
99
|
+
|
100
|
+
Args:
|
101
|
+
data (dict): A dictionary representing the ExperimentResultData to
|
102
|
+
create. It will be in the same format as output by
|
103
|
+
:meth:`to_dict`
|
104
|
+
Returns:
|
105
|
+
ExperimentResultData: The ``ExperimentResultData`` object from the
|
106
|
+
input dictionary.
|
107
|
+
"""
|
108
|
+
in_data = copy.copy(data)
|
109
|
+
return cls(**in_data)
|
110
|
+
|
111
|
+
|
112
|
+
class ExperimentResult:
|
113
|
+
"""Class representing an Experiment Result.
|
114
|
+
|
115
|
+
Attributes:
|
116
|
+
shots (int or tuple): the starting and ending shot for this data.
|
117
|
+
success (bool): if true, we can trust results for this experiment.
|
118
|
+
data (ExperimentResultData): results information.
|
119
|
+
meas_level (int): Measurement result level.
|
120
|
+
"""
|
121
|
+
|
122
|
+
_metadata = {}
|
123
|
+
|
124
|
+
def __init__(
|
125
|
+
self,
|
126
|
+
shots,
|
127
|
+
success,
|
128
|
+
data,
|
129
|
+
meas_level=MeasLevel.CLASSIFIED,
|
130
|
+
status=None,
|
131
|
+
seed=None,
|
132
|
+
meas_return=None,
|
133
|
+
header=None,
|
134
|
+
**kwargs,
|
135
|
+
):
|
136
|
+
"""Initialize an ExperimentResult object.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
shots(int or tuple): if an integer the number of shots or if a
|
140
|
+
tuple the starting and ending shot for this data
|
141
|
+
success (bool): True if the experiment was successful
|
142
|
+
data (ExperimentResultData): The data for the experiment's
|
143
|
+
result
|
144
|
+
meas_level (int): Measurement result level
|
145
|
+
status (str): The status of the experiment
|
146
|
+
seed (int): The seed used for simulation (if run on a simulator)
|
147
|
+
meas_return (str): The type of measurement returned
|
148
|
+
header (dict): A free form dictionary header for the experiment
|
149
|
+
kwargs: Arbitrary extra fields
|
150
|
+
|
151
|
+
Raises:
|
152
|
+
QiskitError: If meas_return or meas_level are not valid values
|
153
|
+
"""
|
154
|
+
self._metadata = {}
|
155
|
+
self.shots = shots
|
156
|
+
self.success = success
|
157
|
+
self.data = data
|
158
|
+
self.meas_level = meas_level
|
159
|
+
if header is not None:
|
160
|
+
self.header = header
|
161
|
+
if status is not None:
|
162
|
+
self.status = status
|
163
|
+
if seed is not None:
|
164
|
+
self.seed = seed
|
165
|
+
if meas_return is not None:
|
166
|
+
if meas_return not in list(MeasReturnType):
|
167
|
+
raise QiskitError("%s not a valid meas_return value")
|
168
|
+
self.meas_return = meas_return
|
169
|
+
self._metadata.update(kwargs)
|
170
|
+
|
171
|
+
def __repr__(self):
|
172
|
+
out = (
|
173
|
+
f"ExperimentResult(shots={self.shots}, success={self.success},"
|
174
|
+
f" meas_level={self.meas_level}, data={self.data}"
|
175
|
+
)
|
176
|
+
if hasattr(self, "header"):
|
177
|
+
out += f", header={self.header}"
|
178
|
+
if hasattr(self, "status"):
|
179
|
+
out += f", status={self.status}"
|
180
|
+
if hasattr(self, "seed"):
|
181
|
+
out += f", seed={self.seed}"
|
182
|
+
if hasattr(self, "meas_return"):
|
183
|
+
out += f", meas_return={self.meas_return}"
|
184
|
+
for key, value in self._metadata.items():
|
185
|
+
if isinstance(value, str):
|
186
|
+
value_str = f"'{value}'"
|
187
|
+
else:
|
188
|
+
value_str = repr(value)
|
189
|
+
out += f", {key}={value_str}"
|
190
|
+
out += ")"
|
191
|
+
return out
|
192
|
+
|
193
|
+
def __getattr__(self, name):
|
194
|
+
try:
|
195
|
+
return self._metadata[name]
|
196
|
+
except KeyError as ex:
|
197
|
+
raise AttributeError(f"Attribute {name} is not defined") from ex
|
198
|
+
|
199
|
+
def to_dict(self):
|
200
|
+
"""Return a dictionary format representation of the ExperimentResult
|
201
|
+
|
202
|
+
Returns:
|
203
|
+
dict: The dictionary form of the ExperimentResult
|
204
|
+
"""
|
205
|
+
out_dict = {
|
206
|
+
"shots": self.shots,
|
207
|
+
"success": self.success,
|
208
|
+
"data": self.data.to_dict(),
|
209
|
+
"meas_level": self.meas_level,
|
210
|
+
}
|
211
|
+
if hasattr(self, "header"):
|
212
|
+
out_dict["header"] = self.header
|
213
|
+
if hasattr(self, "status"):
|
214
|
+
out_dict["status"] = self.status
|
215
|
+
if hasattr(self, "seed"):
|
216
|
+
out_dict["seed"] = self.seed
|
217
|
+
if hasattr(self, "meas_return"):
|
218
|
+
out_dict["meas_return"] = self.meas_return
|
219
|
+
out_dict.update(self._metadata)
|
220
|
+
return out_dict
|
221
|
+
|
222
|
+
@classmethod
|
223
|
+
def from_dict(cls, data):
|
224
|
+
"""Create a new ExperimentResult object from a dictionary.
|
225
|
+
|
226
|
+
Args:
|
227
|
+
data (dict): A dictionary representing the ExperimentResult to
|
228
|
+
create. It will be in the same format as output by
|
229
|
+
:meth:`to_dict`
|
230
|
+
|
231
|
+
Returns:
|
232
|
+
ExperimentResult: The ``ExperimentResult`` object from the input
|
233
|
+
dictionary.
|
234
|
+
"""
|
235
|
+
|
236
|
+
in_data = copy.copy(data)
|
237
|
+
data_obj = ExperimentResultData.from_dict(in_data.pop("data"))
|
238
|
+
shots = in_data.pop("shots")
|
239
|
+
success = in_data.pop("success")
|
240
|
+
|
241
|
+
return cls(shots, success, data_obj, **in_data)
|
@@ -0,0 +1,239 @@
|
|
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
|
+
"""Post-processing of raw result."""
|
14
|
+
|
15
|
+
import numpy as np
|
16
|
+
|
17
|
+
from qiskit.exceptions import QiskitError
|
18
|
+
|
19
|
+
|
20
|
+
def _hex_to_bin(hexstring):
|
21
|
+
"""Convert hexadecimal readouts (memory) to binary readouts."""
|
22
|
+
return str(bin(int(hexstring, 16)))[2:]
|
23
|
+
|
24
|
+
|
25
|
+
def _bin_to_hex(bitstring):
|
26
|
+
"""Convert bitstring readouts (memory) to hexadecimal readouts."""
|
27
|
+
return hex(int(bitstring, 2))
|
28
|
+
|
29
|
+
|
30
|
+
def _pad_zeros(bitstring, memory_slots):
|
31
|
+
"""If the bitstring is truncated, pad extra zeros to make its
|
32
|
+
length equal to memory_slots"""
|
33
|
+
return format(int(bitstring, 2), f"0{memory_slots}b")
|
34
|
+
|
35
|
+
|
36
|
+
def _separate_bitstring(bitstring, creg_sizes):
|
37
|
+
"""Separate a bitstring according to the registers defined in the result header."""
|
38
|
+
substrings = []
|
39
|
+
running_index = 0
|
40
|
+
for _, size in reversed(creg_sizes):
|
41
|
+
substrings.append(bitstring[running_index : running_index + size])
|
42
|
+
running_index += size
|
43
|
+
return " ".join(substrings)
|
44
|
+
|
45
|
+
|
46
|
+
def format_counts_memory(shot_memory, header=None):
|
47
|
+
"""
|
48
|
+
Format a single bitstring (memory) from a single shot experiment.
|
49
|
+
|
50
|
+
- The hexadecimals are expanded to bitstrings
|
51
|
+
|
52
|
+
- Spaces are inserted at register divisions.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
shot_memory (str): result of a single experiment.
|
56
|
+
header (dict): the experiment header dictionary containing
|
57
|
+
useful information for postprocessing. creg_sizes
|
58
|
+
are a nested list where the inner element is a list
|
59
|
+
of creg name, creg size pairs. memory_slots is an integers
|
60
|
+
specifying the number of total memory_slots in the experiment.
|
61
|
+
|
62
|
+
Returns:
|
63
|
+
dict: a formatted memory
|
64
|
+
"""
|
65
|
+
if shot_memory.startswith("0x"):
|
66
|
+
shot_memory = _hex_to_bin(shot_memory)
|
67
|
+
if header:
|
68
|
+
creg_sizes = header.get("creg_sizes", None)
|
69
|
+
memory_slots = header.get("memory_slots", None)
|
70
|
+
if memory_slots:
|
71
|
+
shot_memory = _pad_zeros(shot_memory, memory_slots)
|
72
|
+
if creg_sizes and memory_slots:
|
73
|
+
shot_memory = _separate_bitstring(shot_memory, creg_sizes)
|
74
|
+
return shot_memory
|
75
|
+
|
76
|
+
|
77
|
+
def _list_to_complex_array(complex_list):
|
78
|
+
"""Convert nested list of shape (..., 2) to complex numpy array with shape (...)
|
79
|
+
|
80
|
+
Args:
|
81
|
+
complex_list (list): List to convert.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
np.ndarray: Complex numpy array
|
85
|
+
|
86
|
+
Raises:
|
87
|
+
QiskitError: If inner most array of input nested list is not of length 2.
|
88
|
+
"""
|
89
|
+
arr = np.asarray(complex_list, dtype=np.complex128)
|
90
|
+
if not arr.shape[-1] == 2:
|
91
|
+
raise QiskitError("Inner most nested list is not of length 2.")
|
92
|
+
|
93
|
+
return arr[..., 0] + 1j * arr[..., 1]
|
94
|
+
|
95
|
+
|
96
|
+
def format_level_0_memory(memory):
|
97
|
+
"""Format an experiment result memory object for measurement level 0.
|
98
|
+
|
99
|
+
Args:
|
100
|
+
memory (list): Memory from experiment with `meas_level==1`. `avg` or
|
101
|
+
`single` will be inferred from shape of result memory.
|
102
|
+
|
103
|
+
Returns:
|
104
|
+
np.ndarray: Measurement level 0 complex numpy array
|
105
|
+
|
106
|
+
Raises:
|
107
|
+
QiskitError: If the returned numpy array does not have 2 (avg) or 3 (single)
|
108
|
+
indices.
|
109
|
+
"""
|
110
|
+
formatted_memory = _list_to_complex_array(memory)
|
111
|
+
# infer meas_return from shape of returned data.
|
112
|
+
if not 2 <= len(formatted_memory.shape) <= 3:
|
113
|
+
raise QiskitError("Level zero memory is not of correct shape.")
|
114
|
+
return formatted_memory
|
115
|
+
|
116
|
+
|
117
|
+
def format_level_1_memory(memory):
|
118
|
+
"""Format an experiment result memory object for measurement level 1.
|
119
|
+
|
120
|
+
Args:
|
121
|
+
memory (list): Memory from experiment with `meas_level==1`. `avg` or
|
122
|
+
`single` will be inferred from shape of result memory.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
np.ndarray: Measurement level 1 complex numpy array
|
126
|
+
|
127
|
+
Raises:
|
128
|
+
QiskitError: If the returned numpy array does not have 1 (avg) or 2 (single)
|
129
|
+
indices.
|
130
|
+
"""
|
131
|
+
formatted_memory = _list_to_complex_array(memory)
|
132
|
+
# infer meas_return from shape of returned data.
|
133
|
+
if not 1 <= len(formatted_memory.shape) <= 2:
|
134
|
+
raise QiskitError("Level one memory is not of correct shape.")
|
135
|
+
return formatted_memory
|
136
|
+
|
137
|
+
|
138
|
+
def format_level_2_memory(memory, header=None):
|
139
|
+
"""Format an experiment result memory object for measurement level 2.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
memory (list): Memory from experiment with `meas_level==2` and `memory==True`.
|
143
|
+
header (dict): the experiment header dictionary containing
|
144
|
+
useful information for postprocessing.
|
145
|
+
|
146
|
+
Returns:
|
147
|
+
list[str]: List of bitstrings
|
148
|
+
"""
|
149
|
+
memory_list = []
|
150
|
+
for shot_memory in memory:
|
151
|
+
memory_list.append(format_counts_memory(shot_memory, header))
|
152
|
+
return memory_list
|
153
|
+
|
154
|
+
|
155
|
+
def format_counts(counts, header=None):
|
156
|
+
"""Format a single experiment result coming from backend to present
|
157
|
+
to the Qiskit user.
|
158
|
+
|
159
|
+
Args:
|
160
|
+
counts (dict): counts histogram of multiple shots
|
161
|
+
header (dict): the experiment header dictionary containing
|
162
|
+
useful information for postprocessing.
|
163
|
+
|
164
|
+
Returns:
|
165
|
+
dict: a formatted counts
|
166
|
+
"""
|
167
|
+
counts_dict = {}
|
168
|
+
for key, val in counts.items():
|
169
|
+
key = format_counts_memory(key, header)
|
170
|
+
counts_dict[key] = val
|
171
|
+
return counts_dict
|
172
|
+
|
173
|
+
|
174
|
+
def format_statevector(vec, decimals=None):
|
175
|
+
"""Format statevector coming from the backend to present to the Qiskit user.
|
176
|
+
|
177
|
+
Args:
|
178
|
+
vec (list): a list of [re, im] complex numbers.
|
179
|
+
decimals (int): the number of decimals in the statevector.
|
180
|
+
If None, no rounding is done.
|
181
|
+
|
182
|
+
Returns:
|
183
|
+
list[complex]: a list of python complex numbers.
|
184
|
+
"""
|
185
|
+
# pylint: disable=cyclic-import
|
186
|
+
from qiskit.quantum_info.states.statevector import Statevector
|
187
|
+
|
188
|
+
if isinstance(vec, Statevector):
|
189
|
+
if decimals:
|
190
|
+
return Statevector(np.around(vec.data, decimals=decimals), dims=vec.dims())
|
191
|
+
return vec
|
192
|
+
if isinstance(vec, np.ndarray):
|
193
|
+
if decimals:
|
194
|
+
return np.around(vec, decimals=decimals)
|
195
|
+
return vec
|
196
|
+
num_basis = len(vec)
|
197
|
+
if vec and isinstance(vec[0], complex):
|
198
|
+
vec_complex = np.array(vec, dtype=complex)
|
199
|
+
else:
|
200
|
+
vec_complex = np.zeros(num_basis, dtype=complex)
|
201
|
+
for i in range(num_basis):
|
202
|
+
vec_complex[i] = vec[i][0] + 1j * vec[i][1]
|
203
|
+
|
204
|
+
if decimals:
|
205
|
+
vec_complex = np.around(vec_complex, decimals=decimals)
|
206
|
+
return vec_complex
|
207
|
+
|
208
|
+
|
209
|
+
def format_unitary(mat, decimals=None):
|
210
|
+
"""Format unitary coming from the backend to present to the Qiskit user.
|
211
|
+
|
212
|
+
Args:
|
213
|
+
mat (list[list]): a list of list of [re, im] complex numbers
|
214
|
+
decimals (int): the number of decimals in the statevector.
|
215
|
+
If None, no rounding is done.
|
216
|
+
|
217
|
+
Returns:
|
218
|
+
list[list[complex]]: a matrix of complex numbers
|
219
|
+
"""
|
220
|
+
# pylint: disable=cyclic-import
|
221
|
+
from qiskit.quantum_info.operators.operator import Operator
|
222
|
+
|
223
|
+
if isinstance(mat, Operator):
|
224
|
+
if decimals:
|
225
|
+
return Operator(
|
226
|
+
np.around(mat.data, decimals=decimals),
|
227
|
+
input_dims=mat.input_dims(),
|
228
|
+
output_dims=mat.output_dims(),
|
229
|
+
)
|
230
|
+
return mat
|
231
|
+
if isinstance(mat, np.ndarray):
|
232
|
+
if decimals:
|
233
|
+
return np.around(mat, decimals=decimals)
|
234
|
+
return mat
|
235
|
+
num_basis = len(mat)
|
236
|
+
mat_complex = np.zeros((num_basis, num_basis), dtype=complex)
|
237
|
+
for i, vec in enumerate(mat):
|
238
|
+
mat_complex[i] = format_statevector(vec, decimals)
|
239
|
+
return mat_complex
|