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,296 @@
|
|
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
|
+
"""
|
15
|
+
ND-Array container class for Estimator observables.
|
16
|
+
"""
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import re
|
20
|
+
from collections import defaultdict
|
21
|
+
from collections.abc import Iterable, Mapping as _Mapping
|
22
|
+
from functools import lru_cache
|
23
|
+
from typing import Union, Mapping, overload
|
24
|
+
from numbers import Complex
|
25
|
+
|
26
|
+
import numpy as np
|
27
|
+
from numpy.typing import ArrayLike
|
28
|
+
|
29
|
+
from qiskit.quantum_info import Pauli, PauliList, SparsePauliOp
|
30
|
+
|
31
|
+
from .object_array import object_array
|
32
|
+
from .shape import ShapedMixin, shape_tuple
|
33
|
+
|
34
|
+
# Public API classes
|
35
|
+
__all__ = ["ObservableLike", "ObservablesArrayLike"]
|
36
|
+
|
37
|
+
ObservableLike = Union[
|
38
|
+
str,
|
39
|
+
Pauli,
|
40
|
+
SparsePauliOp,
|
41
|
+
Mapping[Union[str, Pauli], float],
|
42
|
+
]
|
43
|
+
"""Types that can be natively used to construct a Hermitian Estimator observable."""
|
44
|
+
|
45
|
+
|
46
|
+
ObservablesArrayLike = Union[ObservableLike, ArrayLike]
|
47
|
+
"""Types that can be natively converted to an array of Hermitian Estimator observables."""
|
48
|
+
|
49
|
+
|
50
|
+
class ObservablesArray(ShapedMixin):
|
51
|
+
"""An ND-array of Hermitian observables for an :class:`.Estimator` primitive."""
|
52
|
+
|
53
|
+
__slots__ = ("_array", "_shape")
|
54
|
+
ALLOWED_BASIS: str = "IXYZ01+-lr"
|
55
|
+
"""The allowed characters in basis strings."""
|
56
|
+
|
57
|
+
def __init__(
|
58
|
+
self,
|
59
|
+
observables: ObservablesArrayLike,
|
60
|
+
copy: bool = True,
|
61
|
+
validate: bool = True,
|
62
|
+
):
|
63
|
+
"""Initialize an observables array.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
observables: An array-like of basis observable compatible objects.
|
67
|
+
copy: Specify the ``copy`` kwarg of the :func:`.object_array` function
|
68
|
+
when initializing observables.
|
69
|
+
validate: If true, coerce entries into the internal format and validate them. If false,
|
70
|
+
the input should already be an array-like.
|
71
|
+
|
72
|
+
Raises:
|
73
|
+
ValueError: If ``validate=True`` and the input observables is not valid.
|
74
|
+
"""
|
75
|
+
super().__init__()
|
76
|
+
if isinstance(observables, ObservablesArray):
|
77
|
+
observables = observables._array
|
78
|
+
self._array = object_array(observables, copy=copy, list_types=(PauliList,))
|
79
|
+
self._shape = self._array.shape
|
80
|
+
if validate:
|
81
|
+
num_qubits = None
|
82
|
+
for ndi, obs in np.ndenumerate(self._array):
|
83
|
+
basis_obs = self.coerce_observable(obs)
|
84
|
+
basis_num_qubits = len(next(iter(basis_obs)))
|
85
|
+
if num_qubits is None:
|
86
|
+
num_qubits = basis_num_qubits
|
87
|
+
elif basis_num_qubits != num_qubits:
|
88
|
+
raise ValueError(
|
89
|
+
"The number of qubits must be the same for all observables in the "
|
90
|
+
"observables array."
|
91
|
+
)
|
92
|
+
self._array[ndi] = basis_obs
|
93
|
+
|
94
|
+
def __repr__(self):
|
95
|
+
prefix = f"{type(self).__name__}("
|
96
|
+
suffix = f", shape={self.shape})"
|
97
|
+
array = np.array2string(self._array, prefix=prefix, suffix=suffix, threshold=50)
|
98
|
+
return prefix + array + suffix
|
99
|
+
|
100
|
+
def tolist(self) -> list | ObservableLike:
|
101
|
+
"""Convert to a nested list.
|
102
|
+
|
103
|
+
Similar to Numpy's ``tolist`` method, the level of nesting
|
104
|
+
depends on the dimension of the observables array. In the
|
105
|
+
case of dimension 0 the method returns a single observable
|
106
|
+
(``dict`` in the case of a weighted sum of Paulis) instead of a list.
|
107
|
+
|
108
|
+
Examples::
|
109
|
+
Return values for a one-element list vs one element:
|
110
|
+
|
111
|
+
>>> from qiskit.primitives.containers.observables_array import ObservablesArray
|
112
|
+
>>> oa = ObservablesArray.coerce(["Z"])
|
113
|
+
>>> print(type(oa.tolist()))
|
114
|
+
<class 'list'>
|
115
|
+
>>> oa = ObservablesArray.coerce("Z")
|
116
|
+
>>> print(type(oa.tolist()))
|
117
|
+
<class 'dict'>
|
118
|
+
"""
|
119
|
+
return self._array.tolist()
|
120
|
+
|
121
|
+
def __array__(self, dtype=None, copy=None):
|
122
|
+
"""Convert to an Numpy.ndarray"""
|
123
|
+
if dtype is None or dtype == object:
|
124
|
+
return self._array.copy() if copy else self._array
|
125
|
+
raise ValueError("Type must be 'None' or 'object'")
|
126
|
+
|
127
|
+
@overload
|
128
|
+
def __getitem__(self, args: int | tuple[int, ...]) -> Mapping[str, float]: ...
|
129
|
+
|
130
|
+
@overload
|
131
|
+
def __getitem__(self, args: slice) -> ObservablesArray: ...
|
132
|
+
|
133
|
+
def __getitem__(self, args):
|
134
|
+
item = self._array[args]
|
135
|
+
if not isinstance(item, np.ndarray):
|
136
|
+
return item
|
137
|
+
return ObservablesArray(item, copy=False, validate=False)
|
138
|
+
|
139
|
+
def reshape(self, *shape: int | Iterable[int]) -> ObservablesArray:
|
140
|
+
"""Return a new array with a different shape.
|
141
|
+
|
142
|
+
This results in a new view of the same arrays.
|
143
|
+
|
144
|
+
Args:
|
145
|
+
shape: The shape of the returned array.
|
146
|
+
|
147
|
+
Returns:
|
148
|
+
A new array.
|
149
|
+
"""
|
150
|
+
shape = shape_tuple(*shape)
|
151
|
+
return ObservablesArray(self._array.reshape(shape), copy=False, validate=False)
|
152
|
+
|
153
|
+
def ravel(self) -> ObservablesArray:
|
154
|
+
"""Return a new array with one dimension.
|
155
|
+
|
156
|
+
The returned array has a :attr:`shape` given by ``(size, )``, where
|
157
|
+
the size is the :attr:`~size` of this array.
|
158
|
+
|
159
|
+
Returns:
|
160
|
+
A new flattened array.
|
161
|
+
"""
|
162
|
+
return self.reshape(self.size)
|
163
|
+
|
164
|
+
@classmethod
|
165
|
+
def coerce_observable(cls, observable: ObservableLike) -> Mapping[str, float]:
|
166
|
+
"""Format an observable-like object into the internal format.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
observable: The observable-like to format.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
The coerced observable.
|
173
|
+
|
174
|
+
Raises:
|
175
|
+
TypeError: If the input cannot be formatted because its type is not valid.
|
176
|
+
ValueError: If the input observable is invalid.
|
177
|
+
"""
|
178
|
+
# Pauli-type conversions
|
179
|
+
if isinstance(observable, SparsePauliOp):
|
180
|
+
observable = observable.simplify(atol=0)
|
181
|
+
# Check that the operator is Hermitian and has real coeffs
|
182
|
+
coeffs = np.real_if_close(observable.coeffs)
|
183
|
+
if np.iscomplexobj(coeffs):
|
184
|
+
raise ValueError(
|
185
|
+
"Non-Hermitian input observable: the input SparsePauliOp has non-zero"
|
186
|
+
" imaginary part in its coefficients."
|
187
|
+
)
|
188
|
+
paulis = observable.paulis.to_labels()
|
189
|
+
# Call simplify to combine duplicate keys before converting to a mapping
|
190
|
+
return dict(zip(paulis, coeffs))
|
191
|
+
|
192
|
+
if isinstance(observable, Pauli):
|
193
|
+
label, phase = observable[:].to_label(), observable.phase
|
194
|
+
if phase % 2:
|
195
|
+
raise ValueError(
|
196
|
+
"Non-Hermitian input observable: the input Pauli has an imaginary phase."
|
197
|
+
)
|
198
|
+
return {label: 1} if phase == 0 else {label: -1}
|
199
|
+
|
200
|
+
# String conversion
|
201
|
+
if isinstance(observable, str):
|
202
|
+
cls._validate_basis(observable)
|
203
|
+
return {observable: 1}
|
204
|
+
|
205
|
+
# Mapping conversion (with possible Pauli keys)
|
206
|
+
if isinstance(observable, _Mapping):
|
207
|
+
num_qubits = len(next(iter(observable)))
|
208
|
+
unique = defaultdict(float)
|
209
|
+
for basis, coeff in observable.items():
|
210
|
+
if isinstance(basis, Pauli):
|
211
|
+
basis, phase = basis[:].to_label(), basis.phase
|
212
|
+
if phase % 2:
|
213
|
+
raise ValueError(
|
214
|
+
"Non-Hermitian input observable: the input Pauli has an imaginary phase."
|
215
|
+
)
|
216
|
+
if phase == 2:
|
217
|
+
coeff = -coeff
|
218
|
+
# Truncate complex numbers to real
|
219
|
+
if isinstance(coeff, Complex):
|
220
|
+
if abs(coeff.imag) > 1e-7:
|
221
|
+
raise TypeError(
|
222
|
+
f"Non-Hermitian input observable: {basis} term has a complex value"
|
223
|
+
" coefficient."
|
224
|
+
)
|
225
|
+
coeff = coeff.real
|
226
|
+
|
227
|
+
# Validate basis
|
228
|
+
cls._validate_basis(basis)
|
229
|
+
if len(basis) != num_qubits:
|
230
|
+
raise ValueError(
|
231
|
+
"Number of qubits must be the same for all observable basis elements."
|
232
|
+
)
|
233
|
+
unique[basis] += coeff
|
234
|
+
return dict(unique)
|
235
|
+
|
236
|
+
raise TypeError(f"Invalid observable type: {type(observable)}")
|
237
|
+
|
238
|
+
@classmethod
|
239
|
+
def coerce(cls, observables: ObservablesArrayLike) -> ObservablesArray:
|
240
|
+
"""Coerce ObservablesArrayLike into ObservableArray.
|
241
|
+
|
242
|
+
Args:
|
243
|
+
observables: an object to be observables array.
|
244
|
+
|
245
|
+
Returns:
|
246
|
+
A coerced observables array.
|
247
|
+
"""
|
248
|
+
if isinstance(observables, ObservablesArray):
|
249
|
+
return observables
|
250
|
+
return cls(observables)
|
251
|
+
|
252
|
+
def validate(self):
|
253
|
+
"""Validate the consistency in observables array."""
|
254
|
+
num_qubits = None
|
255
|
+
for obs in self._array.reshape(-1):
|
256
|
+
basis_num_qubits = len(next(iter(obs)))
|
257
|
+
if num_qubits is None:
|
258
|
+
num_qubits = basis_num_qubits
|
259
|
+
elif basis_num_qubits != num_qubits:
|
260
|
+
raise ValueError(
|
261
|
+
"The number of qubits must be the same for all observables in the "
|
262
|
+
"observables array."
|
263
|
+
)
|
264
|
+
|
265
|
+
@classmethod
|
266
|
+
def _validate_basis(cls, basis: str) -> None:
|
267
|
+
"""Validate a basis string.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
basis: a basis string to validate.
|
271
|
+
|
272
|
+
Raises:
|
273
|
+
ValueError: If basis string contains invalid characters
|
274
|
+
"""
|
275
|
+
# NOTE: the allowed basis characters can be overridden by modifying the class
|
276
|
+
# attribute ALLOWED_BASIS
|
277
|
+
allowed_pattern = _regex_match(cls.ALLOWED_BASIS)
|
278
|
+
if not allowed_pattern.match(basis):
|
279
|
+
invalid_pattern = _regex_invalid(cls.ALLOWED_BASIS)
|
280
|
+
invalid_chars = list(set(invalid_pattern.findall(basis)))
|
281
|
+
raise ValueError(
|
282
|
+
f"Observable basis string '{basis}' contains invalid characters {invalid_chars},"
|
283
|
+
f" allowed characters are {list(cls.ALLOWED_BASIS)}.",
|
284
|
+
)
|
285
|
+
|
286
|
+
|
287
|
+
@lru_cache(1)
|
288
|
+
def _regex_match(allowed_chars: str) -> re.Pattern:
|
289
|
+
"""Return pattern for matching if a string contains only the allowed characters."""
|
290
|
+
return re.compile(f"^[{re.escape(allowed_chars)}]*$")
|
291
|
+
|
292
|
+
|
293
|
+
@lru_cache(1)
|
294
|
+
def _regex_invalid(allowed_chars: str) -> re.Pattern:
|
295
|
+
"""Return pattern for selecting invalid strings"""
|
296
|
+
return re.compile(f"[^{re.escape(allowed_chars)}]")
|
@@ -0,0 +1,53 @@
|
|
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
|
+
"""PrimitiveResult"""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Iterable
|
18
|
+
from typing import Any, Generic, TypeVar
|
19
|
+
|
20
|
+
from .pub_result import PubResult
|
21
|
+
|
22
|
+
T = TypeVar("T", bound=PubResult)
|
23
|
+
|
24
|
+
|
25
|
+
class PrimitiveResult(Generic[T]):
|
26
|
+
"""A container for multiple pub results and global metadata."""
|
27
|
+
|
28
|
+
def __init__(self, pub_results: Iterable[T], metadata: dict[str, Any] | None = None):
|
29
|
+
"""
|
30
|
+
Args:
|
31
|
+
pub_results: Pub results.
|
32
|
+
metadata: Metadata that is common to all pub results; metadata specific to particular
|
33
|
+
pubs should be placed in their metadata fields. Keys are expected to be strings.
|
34
|
+
"""
|
35
|
+
self._pub_results = list(pub_results)
|
36
|
+
self._metadata = metadata or {}
|
37
|
+
|
38
|
+
@property
|
39
|
+
def metadata(self) -> dict[str, Any]:
|
40
|
+
"""The metadata of this primitive result."""
|
41
|
+
return self._metadata
|
42
|
+
|
43
|
+
def __getitem__(self, index) -> T:
|
44
|
+
return self._pub_results[index]
|
45
|
+
|
46
|
+
def __len__(self) -> int:
|
47
|
+
return len(self._pub_results)
|
48
|
+
|
49
|
+
def __repr__(self) -> str:
|
50
|
+
return f"PrimitiveResult({self._pub_results}, metadata={self.metadata})"
|
51
|
+
|
52
|
+
def __iter__(self) -> Iterable[T]:
|
53
|
+
return iter(self._pub_results)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
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
|
+
Base Pub result class
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import Any
|
20
|
+
|
21
|
+
from .data_bin import DataBin
|
22
|
+
|
23
|
+
|
24
|
+
class PubResult:
|
25
|
+
"""Result of Primitive Unified Bloc."""
|
26
|
+
|
27
|
+
__slots__ = ("_data", "_metadata")
|
28
|
+
|
29
|
+
def __init__(self, data: DataBin, metadata: dict[str, Any] | None = None):
|
30
|
+
"""Initialize a pub result.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
data: Result data.
|
34
|
+
metadata: Metadata specific to this pub. Keys are expected to be strings.
|
35
|
+
"""
|
36
|
+
self._data = data
|
37
|
+
self._metadata = metadata or {}
|
38
|
+
|
39
|
+
def __repr__(self):
|
40
|
+
metadata = f", metadata={self.metadata}" if self.metadata else ""
|
41
|
+
return f"{type(self).__name__}(data={self._data}{metadata})"
|
42
|
+
|
43
|
+
@property
|
44
|
+
def data(self) -> DataBin:
|
45
|
+
"""Result data for the pub."""
|
46
|
+
return self._data
|
47
|
+
|
48
|
+
@property
|
49
|
+
def metadata(self) -> dict:
|
50
|
+
"""Metadata for the pub."""
|
51
|
+
return self._metadata
|
@@ -0,0 +1,193 @@
|
|
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
|
+
"""
|
15
|
+
Sampler Pub class
|
16
|
+
"""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
from collections.abc import Mapping
|
21
|
+
from numbers import Integral
|
22
|
+
from typing import Tuple, Union
|
23
|
+
|
24
|
+
from qiskit import QuantumCircuit
|
25
|
+
from qiskit.circuit import CircuitInstruction
|
26
|
+
|
27
|
+
from .bindings_array import BindingsArray, BindingsArrayLike
|
28
|
+
from .shape import ShapedMixin
|
29
|
+
|
30
|
+
# Public API classes
|
31
|
+
__all__ = ["SamplerPubLike"]
|
32
|
+
|
33
|
+
|
34
|
+
class SamplerPub(ShapedMixin):
|
35
|
+
"""Pub (Primitive Unified Bloc) for a Sampler.
|
36
|
+
|
37
|
+
Pub is composed of tuple (circuit, parameter_values, shots).
|
38
|
+
|
39
|
+
If shots are provided this number of shots will be run with the sampler,
|
40
|
+
if ``shots=None`` the number of run shots is determined by the sampler.
|
41
|
+
"""
|
42
|
+
|
43
|
+
def __init__(
|
44
|
+
self,
|
45
|
+
circuit: QuantumCircuit,
|
46
|
+
parameter_values: BindingsArray | None = None,
|
47
|
+
shots: int | None = None,
|
48
|
+
validate: bool = True,
|
49
|
+
):
|
50
|
+
"""Initialize a sampler pub.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
circuit: A quantum circuit.
|
54
|
+
parameter_values: A bindings array.
|
55
|
+
shots: A specific number of shots to run with. This value takes
|
56
|
+
precedence over any value owed by or supplied to a sampler.
|
57
|
+
validate: If ``True``, the input data is validated during initialization.
|
58
|
+
"""
|
59
|
+
super().__init__()
|
60
|
+
self._circuit = circuit
|
61
|
+
self._parameter_values = parameter_values or BindingsArray()
|
62
|
+
self._shots = shots
|
63
|
+
self._shape = self._parameter_values.shape
|
64
|
+
if validate:
|
65
|
+
self.validate()
|
66
|
+
|
67
|
+
@property
|
68
|
+
def circuit(self) -> QuantumCircuit:
|
69
|
+
"""A quantum circuit."""
|
70
|
+
return self._circuit
|
71
|
+
|
72
|
+
@property
|
73
|
+
def parameter_values(self) -> BindingsArray:
|
74
|
+
"""A bindings array."""
|
75
|
+
return self._parameter_values
|
76
|
+
|
77
|
+
@property
|
78
|
+
def shots(self) -> int | None:
|
79
|
+
"""An specific number of shots to run with (optional).
|
80
|
+
|
81
|
+
This value takes precedence over any value owed by or supplied to a sampler.
|
82
|
+
"""
|
83
|
+
return self._shots
|
84
|
+
|
85
|
+
@classmethod
|
86
|
+
def coerce(cls, pub: SamplerPubLike, shots: int | None = None) -> SamplerPub:
|
87
|
+
"""Coerce a :class:`~.SamplerPubLike` object into a :class:`~.SamplerPub` instance.
|
88
|
+
|
89
|
+
Args:
|
90
|
+
pub: An object to coerce.
|
91
|
+
shots: An optional default number of shots to use if not
|
92
|
+
already specified by the pub-like object.
|
93
|
+
|
94
|
+
Returns:
|
95
|
+
A coerced sampler pub.
|
96
|
+
"""
|
97
|
+
# Validate shots kwarg if provided
|
98
|
+
if shots is not None:
|
99
|
+
if not isinstance(shots, Integral) or isinstance(shots, bool):
|
100
|
+
raise TypeError("shots must be an integer")
|
101
|
+
if shots <= 0:
|
102
|
+
raise ValueError("shots must be positive")
|
103
|
+
|
104
|
+
if isinstance(pub, SamplerPub):
|
105
|
+
if pub.shots is None and shots is not None:
|
106
|
+
return cls(
|
107
|
+
circuit=pub.circuit,
|
108
|
+
parameter_values=pub.parameter_values,
|
109
|
+
shots=shots,
|
110
|
+
validate=False, # Assume Pub is already validated
|
111
|
+
)
|
112
|
+
return pub
|
113
|
+
|
114
|
+
if isinstance(pub, QuantumCircuit):
|
115
|
+
return cls(circuit=pub, shots=shots, validate=True)
|
116
|
+
|
117
|
+
if isinstance(pub, CircuitInstruction):
|
118
|
+
raise ValueError(
|
119
|
+
f"An invalid Sampler pub-like was given ({type(pub)}). "
|
120
|
+
"If you want to run a single circuit, "
|
121
|
+
"you need to wrap it with `[]` like `sampler.run([circuit])` "
|
122
|
+
"instead of `sampler.run(circuit)`."
|
123
|
+
)
|
124
|
+
|
125
|
+
if len(pub) not in [1, 2, 3]:
|
126
|
+
raise ValueError(
|
127
|
+
f"The length of pub must be 1, 2 or 3, but length {len(pub)} is given."
|
128
|
+
)
|
129
|
+
circuit = pub[0]
|
130
|
+
|
131
|
+
if len(pub) > 1 and pub[1] is not None:
|
132
|
+
values = pub[1]
|
133
|
+
if not isinstance(values, (BindingsArray, Mapping)):
|
134
|
+
values = {tuple(circuit.parameters): values}
|
135
|
+
parameter_values = BindingsArray.coerce(values)
|
136
|
+
else:
|
137
|
+
parameter_values = None
|
138
|
+
|
139
|
+
if len(pub) > 2 and pub[2] is not None:
|
140
|
+
shots = pub[2]
|
141
|
+
return cls(circuit=circuit, parameter_values=parameter_values, shots=shots, validate=True)
|
142
|
+
|
143
|
+
def validate(self):
|
144
|
+
"""Validate the pub."""
|
145
|
+
if not isinstance(self.circuit, QuantumCircuit):
|
146
|
+
raise TypeError("circuit must be QuantumCircuit.")
|
147
|
+
|
148
|
+
self.parameter_values.validate()
|
149
|
+
|
150
|
+
if self.shots is not None:
|
151
|
+
if not isinstance(self.shots, Integral) or isinstance(self.shots, bool):
|
152
|
+
raise TypeError("shots must be an integer")
|
153
|
+
if self.shots <= 0:
|
154
|
+
raise ValueError("shots must be positive")
|
155
|
+
|
156
|
+
# Cross validate circuits and parameter values
|
157
|
+
num_parameters = self.parameter_values.num_parameters
|
158
|
+
if num_parameters != self.circuit.num_parameters:
|
159
|
+
message = (
|
160
|
+
f"The number of values ({num_parameters}) does not match "
|
161
|
+
f"the number of parameters ({self.circuit.num_parameters}) for the circuit."
|
162
|
+
)
|
163
|
+
if num_parameters == 0:
|
164
|
+
message += (
|
165
|
+
" Note that if you want to run a single pub, you need to wrap it with `[]` like "
|
166
|
+
"`sampler.run([(circuit, param_values)])` instead of "
|
167
|
+
"`sampler.run((circuit, param_values))`."
|
168
|
+
)
|
169
|
+
raise ValueError(message)
|
170
|
+
|
171
|
+
|
172
|
+
SamplerPubLike = Union[
|
173
|
+
QuantumCircuit,
|
174
|
+
Tuple[QuantumCircuit],
|
175
|
+
Tuple[QuantumCircuit, BindingsArrayLike],
|
176
|
+
Tuple[QuantumCircuit, BindingsArrayLike, Union[Integral, None]],
|
177
|
+
]
|
178
|
+
"""A Pub (Primitive Unified Bloc) for a Sampler.
|
179
|
+
|
180
|
+
A fully specified sample Pub is a tuple ``(circuit, parameter_values, shots)``.
|
181
|
+
|
182
|
+
If shots are provided this number of shots will be run with the sampler,
|
183
|
+
if ``shots=None`` the number of run shots is determined by the sampler.
|
184
|
+
|
185
|
+
.. note::
|
186
|
+
|
187
|
+
A Sampler Pub can also be initialized in the following formats which
|
188
|
+
will be converted to the full Pub tuple:
|
189
|
+
|
190
|
+
* ``circuit``
|
191
|
+
* ``(circuit,)``
|
192
|
+
* ``(circuit, parameter_values)``
|
193
|
+
"""
|
@@ -0,0 +1,74 @@
|
|
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
|
+
Sampler Pub result class
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import Iterable
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from .bit_array import BitArray
|
24
|
+
from .pub_result import PubResult
|
25
|
+
|
26
|
+
|
27
|
+
class SamplerPubResult(PubResult):
|
28
|
+
"""Result of Sampler Pub."""
|
29
|
+
|
30
|
+
def join_data(self, names: Iterable[str] | None = None) -> BitArray | np.ndarray:
|
31
|
+
"""Join data from many registers into one data container.
|
32
|
+
|
33
|
+
Data is joined along the bits axis. For example, for :class:`~.BitArray` data, this corresponds
|
34
|
+
to bitstring concatenation.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
names: Which registers to join. Their order is maintained, for example, given
|
38
|
+
``["alpha", "beta"]``, the data from register ``alpha`` is placed to the left of the
|
39
|
+
data from register ``beta``. When ``None`` is given, this value is set to the
|
40
|
+
ordered list of register names, which will have been preserved from the input circuit
|
41
|
+
order.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
Joint data.
|
45
|
+
|
46
|
+
Raises:
|
47
|
+
ValueError: If specified names are empty.
|
48
|
+
ValueError: If specified name does not exist.
|
49
|
+
TypeError: If specified data comes from incompatible types.
|
50
|
+
"""
|
51
|
+
if names is None:
|
52
|
+
names = list(self.data)
|
53
|
+
if not names:
|
54
|
+
raise ValueError("No entry exists in the data bin.")
|
55
|
+
else:
|
56
|
+
names = list(names)
|
57
|
+
if not names:
|
58
|
+
raise ValueError("An empty name list is given.")
|
59
|
+
for name in names:
|
60
|
+
if name not in self.data:
|
61
|
+
raise ValueError(f"Name '{name}' does not exist.")
|
62
|
+
|
63
|
+
data = [self.data[name] for name in names]
|
64
|
+
if isinstance(data[0], BitArray):
|
65
|
+
if not all(isinstance(datum, BitArray) for datum in data):
|
66
|
+
raise TypeError("Data comes from incompatible types.")
|
67
|
+
joint_data = BitArray.concatenate_bits(data)
|
68
|
+
elif isinstance(data[0], np.ndarray):
|
69
|
+
if not all(isinstance(datum, np.ndarray) for datum in data):
|
70
|
+
raise TypeError("Data comes from incompatible types.")
|
71
|
+
joint_data = np.concatenate(data, axis=-1)
|
72
|
+
else:
|
73
|
+
raise TypeError("Data comes from incompatible types.")
|
74
|
+
return joint_data
|