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,129 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
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
|
+
Array shape related classes and functions
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from collections.abc import Iterable
|
19
|
+
from typing import Protocol, Union, runtime_checkable
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
from numpy.typing import ArrayLike, NDArray
|
23
|
+
|
24
|
+
ShapeInput = Union[int, "Iterable[ShapeInput]"]
|
25
|
+
"""An input that is coercible into a shape tuple."""
|
26
|
+
|
27
|
+
|
28
|
+
@runtime_checkable
|
29
|
+
class Shaped(Protocol):
|
30
|
+
"""Protocol that defines what it means to be a shaped object.
|
31
|
+
|
32
|
+
Note that static type checkers will classify ``numpy.ndarray`` as being :class:`Shaped`.
|
33
|
+
Moreover, since this protocol is runtime-checkable, we will even have
|
34
|
+
``isinstance(<numpy.ndarray instance>, Shaped) == True``.
|
35
|
+
"""
|
36
|
+
|
37
|
+
@property
|
38
|
+
def shape(self) -> tuple[int, ...]:
|
39
|
+
"""The array shape of this object."""
|
40
|
+
raise NotImplementedError("A `Shaped` protocol must implement the `shape` property")
|
41
|
+
|
42
|
+
@property
|
43
|
+
def ndim(self) -> int:
|
44
|
+
"""The number of array dimensions of this object."""
|
45
|
+
raise NotImplementedError("A `Shaped` protocol must implement the `ndim` property")
|
46
|
+
|
47
|
+
@property
|
48
|
+
def size(self) -> int:
|
49
|
+
"""The total dimension of this object, i.e. the product of the entries of :attr:`~shape`."""
|
50
|
+
raise NotImplementedError("A `Shaped` protocol must implement the `size` property")
|
51
|
+
|
52
|
+
|
53
|
+
class ShapedMixin(Shaped):
|
54
|
+
"""Mixin class to create :class:`~Shaped` types by only providing :attr:`_shape` attribute."""
|
55
|
+
|
56
|
+
_shape: tuple[int, ...]
|
57
|
+
|
58
|
+
def __repr__(self):
|
59
|
+
return f"{type(self).__name__}(<{self.shape}>)"
|
60
|
+
|
61
|
+
@property
|
62
|
+
def shape(self):
|
63
|
+
return self._shape
|
64
|
+
|
65
|
+
@property
|
66
|
+
def ndim(self):
|
67
|
+
return len(self._shape)
|
68
|
+
|
69
|
+
@property
|
70
|
+
def size(self):
|
71
|
+
return int(np.prod(self._shape, dtype=int))
|
72
|
+
|
73
|
+
|
74
|
+
def array_coerce(arr: ArrayLike | Shaped) -> NDArray | Shaped:
|
75
|
+
"""Coerce the input into an object with a shape attribute.
|
76
|
+
|
77
|
+
Copies are avoided.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
arr: The object to coerce.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
Something that is :class:`~Shaped`, and always ``numpy.ndarray`` if the input is not
|
84
|
+
already :class:`~Shaped`.
|
85
|
+
"""
|
86
|
+
if isinstance(arr, Shaped):
|
87
|
+
return arr
|
88
|
+
return np.asarray(arr)
|
89
|
+
|
90
|
+
|
91
|
+
def _flatten_to_ints(arg: ShapeInput) -> Iterable[int]:
|
92
|
+
"""
|
93
|
+
Yield one integer at a time.
|
94
|
+
|
95
|
+
Args:
|
96
|
+
arg: Integers or iterables of integers, possibly nested, to be yielded.
|
97
|
+
|
98
|
+
Yields:
|
99
|
+
The provided integers in depth-first recursive order.
|
100
|
+
|
101
|
+
Raises:
|
102
|
+
ValueError: If an input is not an iterable or an integer.
|
103
|
+
"""
|
104
|
+
for item in arg:
|
105
|
+
try:
|
106
|
+
if isinstance(item, Iterable):
|
107
|
+
yield from _flatten_to_ints(item)
|
108
|
+
elif int(item) == item:
|
109
|
+
yield int(item)
|
110
|
+
else:
|
111
|
+
raise ValueError(f"Expected {item} to be iterable or an integer.")
|
112
|
+
except (TypeError, RecursionError) as ex:
|
113
|
+
raise ValueError(f"Expected {item} to be iterable or an integer.") from ex
|
114
|
+
|
115
|
+
|
116
|
+
def shape_tuple(*shapes: ShapeInput) -> tuple[int, ...]:
|
117
|
+
"""
|
118
|
+
Flatten the input into a single tuple of integers, preserving order.
|
119
|
+
|
120
|
+
Args:
|
121
|
+
shapes: Integers or iterables of integers, possibly nested.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
A tuple of integers.
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
ValueError: If some member of ``shapes`` is not an integer or iterable.
|
128
|
+
"""
|
129
|
+
return tuple(_flatten_to_ints(shapes))
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 2024.
|
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
|
+
Job for the reference implementations of Primitives V1 and V2.
|
14
|
+
"""
|
15
|
+
|
16
|
+
import uuid
|
17
|
+
from concurrent.futures import ThreadPoolExecutor
|
18
|
+
|
19
|
+
from qiskit.providers import JobError, JobStatus
|
20
|
+
from qiskit.providers.jobstatus import JOB_FINAL_STATES
|
21
|
+
|
22
|
+
from .base.base_primitive_job import BasePrimitiveJob, ResultT
|
23
|
+
|
24
|
+
|
25
|
+
class PrimitiveJob(BasePrimitiveJob[ResultT, JobStatus]):
|
26
|
+
"""
|
27
|
+
Primitive job class for the reference implementations of Primitives.
|
28
|
+
"""
|
29
|
+
|
30
|
+
def __init__(self, function, *args, **kwargs):
|
31
|
+
"""
|
32
|
+
Args:
|
33
|
+
function: A callable function to execute the job.
|
34
|
+
"""
|
35
|
+
super().__init__(str(uuid.uuid4()))
|
36
|
+
self._future = None
|
37
|
+
self._function = function
|
38
|
+
self._args = args
|
39
|
+
self._kwargs = kwargs
|
40
|
+
|
41
|
+
def _submit(self):
|
42
|
+
if self._future is not None:
|
43
|
+
raise JobError("Primitive job has been submitted already.")
|
44
|
+
|
45
|
+
executor = ThreadPoolExecutor(max_workers=1) # pylint: disable=consider-using-with
|
46
|
+
self._future = executor.submit(self._function, *self._args, **self._kwargs)
|
47
|
+
executor.shutdown(wait=False)
|
48
|
+
|
49
|
+
def result(self) -> ResultT:
|
50
|
+
self._check_submitted()
|
51
|
+
return self._future.result()
|
52
|
+
|
53
|
+
def status(self) -> JobStatus:
|
54
|
+
self._check_submitted()
|
55
|
+
if self._future.running():
|
56
|
+
return JobStatus.RUNNING
|
57
|
+
elif self._future.cancelled():
|
58
|
+
return JobStatus.CANCELLED
|
59
|
+
elif self._future.done() and self._future.exception() is None:
|
60
|
+
return JobStatus.DONE
|
61
|
+
return JobStatus.ERROR
|
62
|
+
|
63
|
+
def _check_submitted(self):
|
64
|
+
if self._future is None:
|
65
|
+
raise JobError("Primitive Job has not been submitted yet.")
|
66
|
+
|
67
|
+
def cancel(self):
|
68
|
+
self._check_submitted()
|
69
|
+
return self._future.cancel()
|
70
|
+
|
71
|
+
def done(self) -> bool:
|
72
|
+
return self.status() == JobStatus.DONE
|
73
|
+
|
74
|
+
def running(self) -> bool:
|
75
|
+
return self.status() == JobStatus.RUNNING
|
76
|
+
|
77
|
+
def cancelled(self) -> bool:
|
78
|
+
return self.status() == JobStatus.CANCELLED
|
79
|
+
|
80
|
+
def in_final_state(self) -> bool:
|
81
|
+
return self.status() in JOB_FINAL_STATES
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023, 2024.
|
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
|
+
Statevector Estimator V2 class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from collections.abc import Iterable
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.quantum_info import SparsePauliOp
|
23
|
+
|
24
|
+
from .base import BaseEstimatorV2
|
25
|
+
from .containers import DataBin, EstimatorPubLike, PrimitiveResult, PubResult
|
26
|
+
from .containers.estimator_pub import EstimatorPub
|
27
|
+
from .primitive_job import PrimitiveJob
|
28
|
+
from .utils import _statevector_from_circuit
|
29
|
+
|
30
|
+
|
31
|
+
class StatevectorEstimator(BaseEstimatorV2):
|
32
|
+
"""
|
33
|
+
Simple implementation of :class:`BaseEstimatorV2` with full state vector simulation.
|
34
|
+
|
35
|
+
This class is implemented via :class:`~.Statevector` which turns provided circuits into
|
36
|
+
pure state vectors. These states are subsequently acted on by :class:`~.SparsePauliOp`,
|
37
|
+
which implies that, at present, this implementation is only compatible with Pauli-based
|
38
|
+
observables.
|
39
|
+
|
40
|
+
Each tuple of ``(circuit, observables, <optional> parameter values, <optional> precision)``,
|
41
|
+
called an estimator primitive unified bloc (PUB), produces its own array-based result. The
|
42
|
+
:meth:`~.EstimatorV2.run` method can be given a sequence of pubs to run in one call.
|
43
|
+
|
44
|
+
.. note::
|
45
|
+
The result of this class is exact if the circuit contains only unitary operations.
|
46
|
+
On the other hand, the result could be stochastic if the circuit contains a non-unitary
|
47
|
+
operation such as a reset for a some subsystems.
|
48
|
+
The stochastic result can be made reproducible by setting ``seed``, e.g.,
|
49
|
+
``StatevectorEstimator(seed=123)``.
|
50
|
+
|
51
|
+
.. plot::
|
52
|
+
:alt: Output from the previous code.
|
53
|
+
:include-source:
|
54
|
+
|
55
|
+
from qiskit.circuit import Parameter, QuantumCircuit
|
56
|
+
from qiskit.primitives import StatevectorEstimator
|
57
|
+
from qiskit.quantum_info import Pauli, SparsePauliOp
|
58
|
+
|
59
|
+
import matplotlib.pyplot as plt
|
60
|
+
import numpy as np
|
61
|
+
|
62
|
+
# Define a circuit with two parameters.
|
63
|
+
circuit = QuantumCircuit(2)
|
64
|
+
circuit.h(0)
|
65
|
+
circuit.cx(0, 1)
|
66
|
+
circuit.ry(Parameter("a"), 0)
|
67
|
+
circuit.rz(Parameter("b"), 0)
|
68
|
+
circuit.cx(0, 1)
|
69
|
+
circuit.h(0)
|
70
|
+
|
71
|
+
# Define a sweep over parameter values, where the second axis is over
|
72
|
+
# the two parameters in the circuit.
|
73
|
+
params = np.vstack([
|
74
|
+
np.linspace(-np.pi, np.pi, 100),
|
75
|
+
np.linspace(-4 * np.pi, 4 * np.pi, 100)
|
76
|
+
]).T
|
77
|
+
|
78
|
+
# Define three observables. Many formats are supported here including
|
79
|
+
# classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1
|
80
|
+
# lists cause this array of observables to have shape (3, 1), rather
|
81
|
+
# than shape (3,) if they were omitted.
|
82
|
+
observables = [
|
83
|
+
[SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
|
84
|
+
[Pauli("XX")],
|
85
|
+
[Pauli("IY")]
|
86
|
+
]
|
87
|
+
|
88
|
+
# Instantiate a new statevector simulation based estimator object.
|
89
|
+
estimator = StatevectorEstimator()
|
90
|
+
|
91
|
+
# Estimate the expectation value for all 300 combinations of
|
92
|
+
# observables and parameter values, where the pub result will have
|
93
|
+
# shape (3, 100). This shape is due to our array of parameter
|
94
|
+
# bindings having shape (100,), combined with our array of observables
|
95
|
+
# having shape (3, 1)
|
96
|
+
pub = (circuit, observables, params)
|
97
|
+
job = estimator.run([pub])
|
98
|
+
|
99
|
+
# Extract the result for the 0th pub (this example only has one pub).
|
100
|
+
result = job.result()[0]
|
101
|
+
|
102
|
+
# Error-bar information is also available, but the error is 0
|
103
|
+
# for this StatevectorEstimator.
|
104
|
+
result.data.stds
|
105
|
+
|
106
|
+
# Pull out the array-based expectation value estimate data from the
|
107
|
+
# result and plot a trace for each observable.
|
108
|
+
for idx, pauli in enumerate(observables):
|
109
|
+
plt.plot(result.data.evs[idx], label=pauli)
|
110
|
+
plt.legend()
|
111
|
+
"""
|
112
|
+
|
113
|
+
def __init__(
|
114
|
+
self, *, default_precision: float = 0.0, seed: np.random.Generator | int | None = None
|
115
|
+
):
|
116
|
+
"""
|
117
|
+
Args:
|
118
|
+
default_precision: The default precision for the estimator if not specified during run.
|
119
|
+
seed: The seed or Generator object for random number generation.
|
120
|
+
If None, a random seeded default RNG will be used.
|
121
|
+
"""
|
122
|
+
self._default_precision = default_precision
|
123
|
+
self._seed = seed
|
124
|
+
|
125
|
+
@property
|
126
|
+
def default_precision(self) -> float:
|
127
|
+
"""Return the default precision"""
|
128
|
+
return self._default_precision
|
129
|
+
|
130
|
+
@property
|
131
|
+
def seed(self) -> np.random.Generator | int | None:
|
132
|
+
"""Return the seed or Generator object for random number generation."""
|
133
|
+
return self._seed
|
134
|
+
|
135
|
+
def run(
|
136
|
+
self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
|
137
|
+
) -> PrimitiveJob[PrimitiveResult[PubResult]]:
|
138
|
+
if precision is None:
|
139
|
+
precision = self._default_precision
|
140
|
+
coerced_pubs = [EstimatorPub.coerce(pub, precision) for pub in pubs]
|
141
|
+
|
142
|
+
job = PrimitiveJob(self._run, coerced_pubs)
|
143
|
+
job._submit()
|
144
|
+
return job
|
145
|
+
|
146
|
+
def _run(self, pubs: list[EstimatorPub]) -> PrimitiveResult[PubResult]:
|
147
|
+
return PrimitiveResult([self._run_pub(pub) for pub in pubs], metadata={"version": 2})
|
148
|
+
|
149
|
+
def _run_pub(self, pub: EstimatorPub) -> PubResult:
|
150
|
+
rng = np.random.default_rng(self._seed)
|
151
|
+
circuit = pub.circuit
|
152
|
+
observables = pub.observables
|
153
|
+
parameter_values = pub.parameter_values
|
154
|
+
precision = pub.precision
|
155
|
+
bound_circuits = parameter_values.bind_all(circuit)
|
156
|
+
bc_circuits, bc_obs = np.broadcast_arrays(bound_circuits, observables)
|
157
|
+
evs = np.zeros_like(bc_circuits, dtype=np.float64)
|
158
|
+
stds = np.zeros_like(bc_circuits, dtype=np.float64)
|
159
|
+
for index in np.ndindex(*bc_circuits.shape):
|
160
|
+
bound_circuit = bc_circuits[index]
|
161
|
+
observable = bc_obs[index]
|
162
|
+
final_state = _statevector_from_circuit(bound_circuit, rng)
|
163
|
+
paulis, coeffs = zip(*observable.items())
|
164
|
+
obs = SparsePauliOp(paulis, coeffs) # TODO: support non Pauli operators
|
165
|
+
expectation_value = np.real_if_close(final_state.expectation_value(obs))
|
166
|
+
if precision != 0:
|
167
|
+
if not np.isreal(expectation_value):
|
168
|
+
raise ValueError("Given operator is not Hermitian and noise cannot be added.")
|
169
|
+
expectation_value = rng.normal(expectation_value, precision)
|
170
|
+
evs[index] = expectation_value
|
171
|
+
|
172
|
+
data = DataBin(evs=evs, stds=stds, shape=evs.shape)
|
173
|
+
return PubResult(
|
174
|
+
data, metadata={"target_precision": precision, "circuit_metadata": pub.circuit.metadata}
|
175
|
+
)
|
@@ -0,0 +1,290 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023, 2024.
|
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
|
+
Statevector Sampler V2 class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
import warnings
|
19
|
+
from dataclasses import dataclass
|
20
|
+
from typing import Iterable
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
from numpy.typing import NDArray
|
24
|
+
|
25
|
+
from qiskit import ClassicalRegister, QiskitError, QuantumCircuit
|
26
|
+
from qiskit.quantum_info import Statevector
|
27
|
+
|
28
|
+
from .base import BaseSamplerV2
|
29
|
+
from .base.validation_v1 import _has_measure
|
30
|
+
from .containers import (
|
31
|
+
BitArray,
|
32
|
+
DataBin,
|
33
|
+
PrimitiveResult,
|
34
|
+
SamplerPubResult,
|
35
|
+
SamplerPubLike,
|
36
|
+
)
|
37
|
+
from .containers.sampler_pub import SamplerPub
|
38
|
+
from .containers.bit_array import _min_num_bytes
|
39
|
+
from .primitive_job import PrimitiveJob
|
40
|
+
from .utils import bound_circuit_to_instruction
|
41
|
+
|
42
|
+
|
43
|
+
@dataclass
|
44
|
+
class _MeasureInfo:
|
45
|
+
creg_name: str
|
46
|
+
num_bits: int
|
47
|
+
num_bytes: int
|
48
|
+
qreg_indices: list[int]
|
49
|
+
|
50
|
+
|
51
|
+
class StatevectorSampler(BaseSamplerV2):
|
52
|
+
"""
|
53
|
+
Simple implementation of :class:`BaseSamplerV2` using full state vector simulation.
|
54
|
+
|
55
|
+
This class is implemented via :class:`~.Statevector` which turns provided circuits into
|
56
|
+
pure state vectors, and is therefore incompatible with mid-circuit measurements (although
|
57
|
+
other implementations may be).
|
58
|
+
|
59
|
+
As seen in the example below, this sampler supports providing arrays of parameter value sets to
|
60
|
+
bind against a single circuit.
|
61
|
+
|
62
|
+
Each tuple of ``(circuit, <optional> parameter values, <optional> shots)``, called a sampler
|
63
|
+
primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
|
64
|
+
be given many pubs at once.
|
65
|
+
|
66
|
+
.. plot::
|
67
|
+
:include-source:
|
68
|
+
:nofigs:
|
69
|
+
|
70
|
+
from qiskit.circuit import (
|
71
|
+
Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
|
72
|
+
)
|
73
|
+
from qiskit.primitives import StatevectorSampler
|
74
|
+
|
75
|
+
import matplotlib.pyplot as plt
|
76
|
+
import numpy as np
|
77
|
+
|
78
|
+
# Define our circuit registers, including classical registers
|
79
|
+
# called 'alpha' and 'beta'.
|
80
|
+
qreg = QuantumRegister(3)
|
81
|
+
alpha = ClassicalRegister(2, "alpha")
|
82
|
+
beta = ClassicalRegister(1, "beta")
|
83
|
+
|
84
|
+
# Define a quantum circuit with two parameters.
|
85
|
+
circuit = QuantumCircuit(qreg, alpha, beta)
|
86
|
+
circuit.h(0)
|
87
|
+
circuit.cx(0, 1)
|
88
|
+
circuit.cx(1, 2)
|
89
|
+
circuit.ry(Parameter("a"), 0)
|
90
|
+
circuit.rz(Parameter("b"), 0)
|
91
|
+
circuit.cx(1, 2)
|
92
|
+
circuit.cx(0, 1)
|
93
|
+
circuit.h(0)
|
94
|
+
circuit.measure([0, 1], alpha)
|
95
|
+
circuit.measure([2], beta)
|
96
|
+
|
97
|
+
# Define a sweep over parameter values, where the second axis is over.
|
98
|
+
# the two parameters in the circuit.
|
99
|
+
params = np.vstack([
|
100
|
+
np.linspace(-np.pi, np.pi, 100),
|
101
|
+
np.linspace(-4 * np.pi, 4 * np.pi, 100)
|
102
|
+
]).T
|
103
|
+
|
104
|
+
# Instantiate a new statevector simulation based sampler object.
|
105
|
+
sampler = StatevectorSampler()
|
106
|
+
|
107
|
+
# Start a job that will return shots for all 100 parameter value sets.
|
108
|
+
pub = (circuit, params)
|
109
|
+
job = sampler.run([pub], shots=256)
|
110
|
+
|
111
|
+
# Extract the result for the 0th pub (this example only has one pub).
|
112
|
+
result = job.result()[0]
|
113
|
+
|
114
|
+
# There is one BitArray object for each ClassicalRegister in the
|
115
|
+
# circuit. Here, we can see that the BitArray for alpha contains data
|
116
|
+
# for all 100 sweep points, and that it is indeed storing data for 2
|
117
|
+
# bits over 256 shots.
|
118
|
+
assert result.data.alpha.shape == (100,)
|
119
|
+
assert result.data.alpha.num_bits == 2
|
120
|
+
assert result.data.alpha.num_shots == 256
|
121
|
+
|
122
|
+
# We can work directly with a binary array in performant applications.
|
123
|
+
raw = result.data.alpha.array
|
124
|
+
|
125
|
+
# For small registers where it is anticipated to have many counts
|
126
|
+
# associated with the same bitstrings, we can turn the data from,
|
127
|
+
# for example, the 22nd sweep index into a dictionary of counts.
|
128
|
+
counts = result.data.alpha.get_counts(22)
|
129
|
+
|
130
|
+
# Or, convert into a list of bitstrings that preserve shot order.
|
131
|
+
bitstrings = result.data.alpha.get_bitstrings(22)
|
132
|
+
print(bitstrings)
|
133
|
+
|
134
|
+
"""
|
135
|
+
|
136
|
+
def __init__(self, *, default_shots: int = 1024, seed: np.random.Generator | int | None = None):
|
137
|
+
"""
|
138
|
+
Args:
|
139
|
+
default_shots: The default shots for the sampler if not specified during run.
|
140
|
+
seed: The seed or Generator object for random number generation.
|
141
|
+
If None, a random seeded default RNG will be used.
|
142
|
+
"""
|
143
|
+
self._default_shots = default_shots
|
144
|
+
self._seed = seed
|
145
|
+
|
146
|
+
@property
|
147
|
+
def default_shots(self) -> int:
|
148
|
+
"""Return the default shots"""
|
149
|
+
return self._default_shots
|
150
|
+
|
151
|
+
@property
|
152
|
+
def seed(self) -> np.random.Generator | int | None:
|
153
|
+
"""Return the seed or Generator object for random number generation."""
|
154
|
+
return self._seed
|
155
|
+
|
156
|
+
def run(
|
157
|
+
self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
|
158
|
+
) -> PrimitiveJob[PrimitiveResult[SamplerPubResult]]:
|
159
|
+
if shots is None:
|
160
|
+
shots = self._default_shots
|
161
|
+
coerced_pubs = [SamplerPub.coerce(pub, shots) for pub in pubs]
|
162
|
+
if any(len(pub.circuit.cregs) == 0 for pub in coerced_pubs):
|
163
|
+
warnings.warn(
|
164
|
+
"One of your circuits has no output classical registers and so the result "
|
165
|
+
"will be empty. Did you mean to add measurement instructions?",
|
166
|
+
UserWarning,
|
167
|
+
)
|
168
|
+
|
169
|
+
job = PrimitiveJob(self._run, coerced_pubs)
|
170
|
+
job._submit()
|
171
|
+
return job
|
172
|
+
|
173
|
+
def _run(self, pubs: Iterable[SamplerPub]) -> PrimitiveResult[SamplerPubResult]:
|
174
|
+
results = [self._run_pub(pub) for pub in pubs]
|
175
|
+
return PrimitiveResult(results, metadata={"version": 2})
|
176
|
+
|
177
|
+
def _run_pub(self, pub: SamplerPub) -> SamplerPubResult:
|
178
|
+
circuit, qargs, meas_info = _preprocess_circuit(pub.circuit)
|
179
|
+
bound_circuits = pub.parameter_values.bind_all(circuit)
|
180
|
+
arrays = {
|
181
|
+
item.creg_name: np.zeros(
|
182
|
+
bound_circuits.shape + (pub.shots, item.num_bytes), dtype=np.uint8
|
183
|
+
)
|
184
|
+
for item in meas_info
|
185
|
+
}
|
186
|
+
for index, bound_circuit in np.ndenumerate(bound_circuits):
|
187
|
+
final_state = Statevector(bound_circuit_to_instruction(bound_circuit))
|
188
|
+
final_state.seed(self._seed)
|
189
|
+
if qargs:
|
190
|
+
samples = final_state.sample_memory(shots=pub.shots, qargs=qargs)
|
191
|
+
else:
|
192
|
+
samples = [""] * pub.shots
|
193
|
+
samples_array = np.array([np.fromiter(sample, dtype=np.uint8) for sample in samples])
|
194
|
+
for item in meas_info:
|
195
|
+
ary = _samples_to_packed_array(samples_array, item.num_bits, item.qreg_indices)
|
196
|
+
arrays[item.creg_name][index] = ary
|
197
|
+
|
198
|
+
meas = {
|
199
|
+
item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info
|
200
|
+
}
|
201
|
+
return SamplerPubResult(
|
202
|
+
DataBin(**meas, shape=pub.shape),
|
203
|
+
metadata={"shots": pub.shots, "circuit_metadata": pub.circuit.metadata},
|
204
|
+
)
|
205
|
+
|
206
|
+
|
207
|
+
def _preprocess_circuit(circuit: QuantumCircuit):
|
208
|
+
num_bits_dict = {creg.name: creg.size for creg in circuit.cregs}
|
209
|
+
mapping = _final_measurement_mapping(circuit)
|
210
|
+
qargs = sorted(set(mapping.values()))
|
211
|
+
qargs_index = {v: k for k, v in enumerate(qargs)}
|
212
|
+
circuit = circuit.remove_final_measurements(inplace=False)
|
213
|
+
if _has_control_flow(circuit):
|
214
|
+
raise QiskitError("StatevectorSampler cannot handle ControlFlowOp")
|
215
|
+
if _has_measure(circuit):
|
216
|
+
raise QiskitError("StatevectorSampler cannot handle mid-circuit measurements")
|
217
|
+
# num_qubits is used as sentinel to fill 0 in _samples_to_packed_array
|
218
|
+
sentinel = len(qargs)
|
219
|
+
indices = {key: [sentinel] * val for key, val in num_bits_dict.items()}
|
220
|
+
for key, qreg in mapping.items():
|
221
|
+
creg, ind = key
|
222
|
+
indices[creg.name][ind] = qargs_index[qreg]
|
223
|
+
meas_info = [
|
224
|
+
_MeasureInfo(
|
225
|
+
creg_name=name,
|
226
|
+
num_bits=num_bits,
|
227
|
+
num_bytes=_min_num_bytes(num_bits),
|
228
|
+
qreg_indices=indices[name],
|
229
|
+
)
|
230
|
+
for name, num_bits in num_bits_dict.items()
|
231
|
+
]
|
232
|
+
return circuit, qargs, meas_info
|
233
|
+
|
234
|
+
|
235
|
+
def _samples_to_packed_array(
|
236
|
+
samples: NDArray[np.uint8], num_bits: int, indices: list[int]
|
237
|
+
) -> NDArray[np.uint8]:
|
238
|
+
# samples of `Statevector.sample_memory` will be in the order of
|
239
|
+
# qubit_last, ..., qubit_1, qubit_0.
|
240
|
+
# reverse the sample order into qubit_0, qubit_1, ..., qubit_last and
|
241
|
+
# pad 0 in the rightmost to be used for the sentinel introduced by _preprocess_circuit.
|
242
|
+
ary = np.pad(samples[:, ::-1], ((0, 0), (0, 1)), constant_values=0)
|
243
|
+
# place samples in the order of clbit_last, ..., clbit_1, clbit_0
|
244
|
+
ary = ary[:, indices[::-1]]
|
245
|
+
# pad 0 in the left to align the number to be mod 8
|
246
|
+
# since np.packbits(bitorder='big') pads 0 to the right.
|
247
|
+
pad_size = -num_bits % 8
|
248
|
+
ary = np.pad(ary, ((0, 0), (pad_size, 0)), constant_values=0)
|
249
|
+
# pack bits in big endian order
|
250
|
+
ary = np.packbits(ary, axis=-1)
|
251
|
+
return ary
|
252
|
+
|
253
|
+
|
254
|
+
def _final_measurement_mapping(circuit: QuantumCircuit) -> dict[tuple[ClassicalRegister, int], int]:
|
255
|
+
"""Return the final measurement mapping for the circuit.
|
256
|
+
|
257
|
+
Parameters:
|
258
|
+
circuit: Input quantum circuit.
|
259
|
+
|
260
|
+
Returns:
|
261
|
+
Mapping of classical bits to qubits for final measurements.
|
262
|
+
"""
|
263
|
+
active_qubits = set(range(circuit.num_qubits))
|
264
|
+
active_cbits = set(range(circuit.num_clbits))
|
265
|
+
|
266
|
+
# Find final measurements starting in back
|
267
|
+
mapping = {}
|
268
|
+
for item in circuit[::-1]:
|
269
|
+
if item.operation.name == "measure":
|
270
|
+
loc = circuit.find_bit(item.clbits[0])
|
271
|
+
cbit = loc.index
|
272
|
+
qbit = circuit.find_bit(item.qubits[0]).index
|
273
|
+
if cbit in active_cbits and qbit in active_qubits:
|
274
|
+
for creg in loc.registers:
|
275
|
+
mapping[creg] = qbit
|
276
|
+
active_cbits.remove(cbit)
|
277
|
+
elif item.operation.name not in ["barrier", "delay"]:
|
278
|
+
for qq in item.qubits:
|
279
|
+
_temp_qubit = circuit.find_bit(qq).index
|
280
|
+
if _temp_qubit in active_qubits:
|
281
|
+
active_qubits.remove(_temp_qubit)
|
282
|
+
|
283
|
+
if not active_cbits or not active_qubits:
|
284
|
+
break
|
285
|
+
|
286
|
+
return mapping
|
287
|
+
|
288
|
+
|
289
|
+
def _has_control_flow(circuit: QuantumCircuit) -> bool:
|
290
|
+
return any(instruction.is_control_flow() for instruction in circuit)
|