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,339 @@
|
|
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
|
+
"""Sampler V2 implementation for an arbitrary Backend object."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import warnings
|
18
|
+
from collections import defaultdict
|
19
|
+
from dataclasses import dataclass
|
20
|
+
from typing import Any, Iterable, Union
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
from numpy.typing import NDArray
|
24
|
+
|
25
|
+
from qiskit.circuit import QuantumCircuit
|
26
|
+
from qiskit.exceptions import QiskitError
|
27
|
+
from qiskit.primitives.backend_estimator_v2 import _run_circuits
|
28
|
+
from qiskit.primitives.base import BaseSamplerV2
|
29
|
+
from qiskit.primitives.containers import (
|
30
|
+
BitArray,
|
31
|
+
DataBin,
|
32
|
+
PrimitiveResult,
|
33
|
+
SamplerPubLike,
|
34
|
+
SamplerPubResult,
|
35
|
+
)
|
36
|
+
from qiskit.primitives.containers.bit_array import _min_num_bytes
|
37
|
+
from qiskit.primitives.containers.sampler_pub import SamplerPub
|
38
|
+
from qiskit.primitives.primitive_job import PrimitiveJob
|
39
|
+
from qiskit.providers.backend import BackendV2
|
40
|
+
from qiskit.result import Result
|
41
|
+
|
42
|
+
|
43
|
+
@dataclass
|
44
|
+
class Options:
|
45
|
+
"""Options for :class:`~.BackendSamplerV2`"""
|
46
|
+
|
47
|
+
default_shots: int = 1024
|
48
|
+
"""The default shots to use if none are specified in :meth:`~.run`.
|
49
|
+
Default: 1024.
|
50
|
+
"""
|
51
|
+
|
52
|
+
seed_simulator: int | None = None
|
53
|
+
"""The seed to use in the simulator. If None, a random seed will be used.
|
54
|
+
Default: None.
|
55
|
+
"""
|
56
|
+
|
57
|
+
run_options: dict[str, Any] | None = None
|
58
|
+
"""A dictionary of options to pass to the backend's ``run()`` method.
|
59
|
+
Default: None (no option passed to backend's ``run`` method)
|
60
|
+
"""
|
61
|
+
|
62
|
+
|
63
|
+
@dataclass
|
64
|
+
class _MeasureInfo:
|
65
|
+
creg_name: str
|
66
|
+
num_bits: int
|
67
|
+
num_bytes: int
|
68
|
+
start: int
|
69
|
+
|
70
|
+
|
71
|
+
ResultMemory = Union[list[str], list[list[float]], list[list[list[float]]]]
|
72
|
+
"""Type alias for possible level 2 and level 1 result memory formats. For level
|
73
|
+
2, the format is a list of bit strings. For level 1, format can be either a
|
74
|
+
list of I/Q pairs (list with two floats) for each memory slot if using
|
75
|
+
``meas_return=avg`` or a list of of lists of I/Q pairs if using
|
76
|
+
``meas_return=single`` with the outer list indexing shot number and the inner
|
77
|
+
list indexing memory slot.
|
78
|
+
"""
|
79
|
+
|
80
|
+
|
81
|
+
class BackendSamplerV2(BaseSamplerV2):
|
82
|
+
"""Evaluates bitstrings for provided quantum circuits
|
83
|
+
|
84
|
+
The :class:`~.BackendSamplerV2` class is a generic implementation of the
|
85
|
+
:class:`~.BaseSamplerV2` interface that is used to wrap a :class:`~.BackendV2`
|
86
|
+
object in the class :class:`~.BaseSamplerV2` API. It
|
87
|
+
facilitates using backends that do not provide a native
|
88
|
+
:class:`~.BaseSamplerV2` implementation in places that work with
|
89
|
+
:class:`~.BaseSamplerV2`. However,
|
90
|
+
if you're using a provider that has a native implementation of
|
91
|
+
:class:`~.BaseSamplerV2`, it is a better choice to leverage that native
|
92
|
+
implementation as it will likely include additional optimizations and be
|
93
|
+
a more efficient implementation. The generic nature of this class
|
94
|
+
precludes doing any provider- or backend-specific optimizations.
|
95
|
+
|
96
|
+
This class does not perform any measurement or gate mitigation.
|
97
|
+
|
98
|
+
Each tuple of ``(circuit, <optional> parameter values, <optional> shots)``, called a sampler
|
99
|
+
primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
|
100
|
+
be given many pubs at once.
|
101
|
+
|
102
|
+
The options for :class:`~.BackendSamplerV2` consist of the following items.
|
103
|
+
|
104
|
+
* ``default_shots``: The default shots to use if none are specified in :meth:`~run`.
|
105
|
+
Default: 1024.
|
106
|
+
|
107
|
+
* ``seed_simulator``: The seed to use in the simulator. If None, a random seed will be used.
|
108
|
+
Default: None.
|
109
|
+
|
110
|
+
* ``run_options``: A dictionary of options to pass through to the ``run()``
|
111
|
+
method of the wrapped :class:`~.BackendV2` instance.
|
112
|
+
|
113
|
+
.. note::
|
114
|
+
|
115
|
+
This class requires a backend that supports ``memory`` option.
|
116
|
+
|
117
|
+
"""
|
118
|
+
|
119
|
+
def __init__(
|
120
|
+
self,
|
121
|
+
*,
|
122
|
+
backend: BackendV2,
|
123
|
+
options: dict | None = None,
|
124
|
+
):
|
125
|
+
"""
|
126
|
+
Args:
|
127
|
+
backend: The backend to run the primitive on.
|
128
|
+
options: The options to control the default shots (``default_shots``) and
|
129
|
+
the random seed for the simulator (``seed_simulator``).
|
130
|
+
"""
|
131
|
+
self._backend = backend
|
132
|
+
self._options = Options(**options) if options else Options()
|
133
|
+
|
134
|
+
@property
|
135
|
+
def backend(self) -> BackendV2:
|
136
|
+
"""Returns the backend which this sampler object based on."""
|
137
|
+
return self._backend
|
138
|
+
|
139
|
+
@property
|
140
|
+
def options(self) -> Options:
|
141
|
+
"""Return the options"""
|
142
|
+
return self._options
|
143
|
+
|
144
|
+
def run(
|
145
|
+
self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
|
146
|
+
) -> PrimitiveJob[PrimitiveResult[SamplerPubResult]]:
|
147
|
+
if shots is None:
|
148
|
+
shots = self._options.default_shots
|
149
|
+
coerced_pubs = [SamplerPub.coerce(pub, shots) for pub in pubs]
|
150
|
+
self._validate_pubs(coerced_pubs)
|
151
|
+
job = PrimitiveJob(self._run, coerced_pubs)
|
152
|
+
job._submit()
|
153
|
+
return job
|
154
|
+
|
155
|
+
def _validate_pubs(self, pubs: list[SamplerPub]):
|
156
|
+
for i, pub in enumerate(pubs):
|
157
|
+
if len(pub.circuit.cregs) == 0:
|
158
|
+
warnings.warn(
|
159
|
+
f"The {i}-th pub's circuit has no output classical registers and so the result "
|
160
|
+
"will be empty. Did you mean to add measurement instructions?",
|
161
|
+
UserWarning,
|
162
|
+
)
|
163
|
+
|
164
|
+
def _run(self, pubs: list[SamplerPub]) -> PrimitiveResult[SamplerPubResult]:
|
165
|
+
pub_dict = defaultdict(list)
|
166
|
+
# consolidate pubs with the same number of shots
|
167
|
+
for i, pub in enumerate(pubs):
|
168
|
+
pub_dict[pub.shots].append(i)
|
169
|
+
|
170
|
+
results = [None] * len(pubs)
|
171
|
+
for shots, lst in pub_dict.items():
|
172
|
+
# run pubs with the same number of shots at once
|
173
|
+
pub_results = self._run_pubs([pubs[i] for i in lst], shots)
|
174
|
+
# reconstruct the result of pubs
|
175
|
+
for i, pub_result in zip(lst, pub_results):
|
176
|
+
results[i] = pub_result
|
177
|
+
return PrimitiveResult(results, metadata={"version": 2})
|
178
|
+
|
179
|
+
def _run_pubs(self, pubs: list[SamplerPub], shots: int) -> list[SamplerPubResult]:
|
180
|
+
"""Compute results for pubs that all require the same value of ``shots``."""
|
181
|
+
# prepare circuits
|
182
|
+
bound_circuits = [pub.parameter_values.bind_all(pub.circuit) for pub in pubs]
|
183
|
+
flatten_circuits = []
|
184
|
+
for circuits in bound_circuits:
|
185
|
+
flatten_circuits.extend(np.ravel(circuits).tolist())
|
186
|
+
|
187
|
+
run_opts = self._options.run_options or {}
|
188
|
+
# run circuits
|
189
|
+
results, _ = _run_circuits(
|
190
|
+
flatten_circuits,
|
191
|
+
self._backend,
|
192
|
+
clear_metadata=False,
|
193
|
+
memory=True,
|
194
|
+
shots=shots,
|
195
|
+
seed_simulator=self._options.seed_simulator,
|
196
|
+
**run_opts,
|
197
|
+
)
|
198
|
+
result_memory = _prepare_memory(results)
|
199
|
+
|
200
|
+
# pack memory to an ndarray of uint8
|
201
|
+
results = []
|
202
|
+
start = 0
|
203
|
+
meas_level = (
|
204
|
+
None
|
205
|
+
if self._options.run_options is None
|
206
|
+
else self._options.run_options.get("meas_level")
|
207
|
+
)
|
208
|
+
for pub, bound in zip(pubs, bound_circuits):
|
209
|
+
meas_info, max_num_bytes = _analyze_circuit(pub.circuit)
|
210
|
+
end = start + bound.size
|
211
|
+
results.append(
|
212
|
+
self._postprocess_pub(
|
213
|
+
result_memory[start:end],
|
214
|
+
shots,
|
215
|
+
bound.shape,
|
216
|
+
meas_info,
|
217
|
+
max_num_bytes,
|
218
|
+
pub.circuit.metadata,
|
219
|
+
meas_level,
|
220
|
+
)
|
221
|
+
)
|
222
|
+
start = end
|
223
|
+
|
224
|
+
return results
|
225
|
+
|
226
|
+
def _postprocess_pub(
|
227
|
+
self,
|
228
|
+
result_memory: list[ResultMemory],
|
229
|
+
shots: int,
|
230
|
+
shape: tuple[int, ...],
|
231
|
+
meas_info: list[_MeasureInfo],
|
232
|
+
max_num_bytes: int,
|
233
|
+
circuit_metadata: dict,
|
234
|
+
meas_level: int | None,
|
235
|
+
) -> SamplerPubResult:
|
236
|
+
"""Converts the memory data into a sampler pub result
|
237
|
+
|
238
|
+
For level 2 data, the memory data are stored in an array of bit arrays
|
239
|
+
with the shape of the pub. For level 1 data, the data are stored in a
|
240
|
+
complex numpy array.
|
241
|
+
"""
|
242
|
+
if meas_level == 2 or meas_level is None:
|
243
|
+
arrays = {
|
244
|
+
item.creg_name: np.zeros(shape + (shots, item.num_bytes), dtype=np.uint8)
|
245
|
+
for item in meas_info
|
246
|
+
}
|
247
|
+
memory_array = _memory_array(result_memory, max_num_bytes)
|
248
|
+
|
249
|
+
for samples, index in zip(memory_array, np.ndindex(*shape)):
|
250
|
+
for item in meas_info:
|
251
|
+
ary = _samples_to_packed_array(samples, item.num_bits, item.start)
|
252
|
+
arrays[item.creg_name][index] = ary
|
253
|
+
|
254
|
+
meas = {
|
255
|
+
item.creg_name: BitArray(arrays[item.creg_name], item.num_bits)
|
256
|
+
for item in meas_info
|
257
|
+
}
|
258
|
+
elif meas_level == 1:
|
259
|
+
raw = np.array(result_memory)
|
260
|
+
cplx = raw[..., 0] + 1j * raw[..., 1]
|
261
|
+
cplx = np.reshape(cplx, (*shape, *cplx.shape[1:]))
|
262
|
+
meas = {item.creg_name: cplx for item in meas_info}
|
263
|
+
else:
|
264
|
+
raise QiskitError(f"Unsupported meas_level: {meas_level}")
|
265
|
+
return SamplerPubResult(
|
266
|
+
DataBin(**meas, shape=shape),
|
267
|
+
metadata={"shots": shots, "circuit_metadata": circuit_metadata},
|
268
|
+
)
|
269
|
+
|
270
|
+
|
271
|
+
def _analyze_circuit(circuit: QuantumCircuit) -> tuple[list[_MeasureInfo], int]:
|
272
|
+
"""Analyzes the information for each creg in a circuit."""
|
273
|
+
meas_info = []
|
274
|
+
max_num_bits = 0
|
275
|
+
for creg in circuit.cregs:
|
276
|
+
name = creg.name
|
277
|
+
num_bits = creg.size
|
278
|
+
if num_bits != 0:
|
279
|
+
start = circuit.find_bit(creg[0]).index
|
280
|
+
else:
|
281
|
+
start = 0
|
282
|
+
meas_info.append(
|
283
|
+
_MeasureInfo(
|
284
|
+
creg_name=name,
|
285
|
+
num_bits=num_bits,
|
286
|
+
num_bytes=_min_num_bytes(num_bits),
|
287
|
+
start=start,
|
288
|
+
)
|
289
|
+
)
|
290
|
+
max_num_bits = max(max_num_bits, start + num_bits)
|
291
|
+
return meas_info, _min_num_bytes(max_num_bits)
|
292
|
+
|
293
|
+
|
294
|
+
def _prepare_memory(results: list[Result]) -> list[ResultMemory]:
|
295
|
+
"""Joins splitted results if exceeding max_experiments"""
|
296
|
+
lst = []
|
297
|
+
for res in results:
|
298
|
+
for exp in res.results:
|
299
|
+
if hasattr(exp.data, "memory") and exp.data.memory:
|
300
|
+
lst.append(exp.data.memory)
|
301
|
+
else:
|
302
|
+
# no measure in a circuit
|
303
|
+
lst.append(["0x0"] * exp.shots)
|
304
|
+
return lst
|
305
|
+
|
306
|
+
|
307
|
+
def _memory_array(results: list[list[str]], num_bytes: int) -> NDArray[np.uint8]:
|
308
|
+
"""Converts the memory data into an array in an unpacked way."""
|
309
|
+
lst = []
|
310
|
+
for memory in results:
|
311
|
+
if num_bytes > 0:
|
312
|
+
data = b"".join(int(i, 16).to_bytes(num_bytes, "big") for i in memory)
|
313
|
+
data = np.frombuffer(data, dtype=np.uint8).reshape(-1, num_bytes)
|
314
|
+
else:
|
315
|
+
# no measure in a circuit
|
316
|
+
data = np.zeros((len(memory), num_bytes), dtype=np.uint8)
|
317
|
+
lst.append(data)
|
318
|
+
ary = np.asarray(lst)
|
319
|
+
return np.unpackbits(ary, axis=-1, bitorder="big")
|
320
|
+
|
321
|
+
|
322
|
+
def _samples_to_packed_array(
|
323
|
+
samples: NDArray[np.uint8], num_bits: int, start: int
|
324
|
+
) -> NDArray[np.uint8]:
|
325
|
+
"""Converts an unpacked array of the memory data into a packed array."""
|
326
|
+
# samples of `Backend.run(memory=True)` will be the order of
|
327
|
+
# clbit_last, ..., clbit_1, clbit_0
|
328
|
+
# place samples in the order of clbit_start+num_bits-1, ..., clbit_start+1, clbit_start
|
329
|
+
if start == 0:
|
330
|
+
ary = samples[:, -start - num_bits :]
|
331
|
+
else:
|
332
|
+
ary = samples[:, -start - num_bits : -start]
|
333
|
+
# pad 0 in the left to align the number to be mod 8
|
334
|
+
# since np.packbits(bitorder='big') pads 0 to the right.
|
335
|
+
pad_size = -num_bits % 8
|
336
|
+
ary = np.pad(ary, ((0, 0), (pad_size, 0)), constant_values=0)
|
337
|
+
# pack bits in big endian order
|
338
|
+
ary = np.packbits(ary, axis=-1, bitorder="big")
|
339
|
+
return ary
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Abstract base classes for primitives module.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from .base_sampler import BaseSamplerV1, BaseSamplerV2
|
18
|
+
from .base_estimator import BaseEstimatorV1, BaseEstimatorV2
|
19
|
+
from .estimator_result_v1 import EstimatorResult
|
20
|
+
from .sampler_result_v1 import SamplerResult
|
@@ -0,0 +1,247 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 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
|
+
"""Base Estimator V1 and V2 classes"""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from abc import abstractmethod, ABC
|
18
|
+
from collections.abc import Iterable, Sequence
|
19
|
+
from copy import copy
|
20
|
+
from typing import Generic, TypeVar
|
21
|
+
|
22
|
+
from qiskit.circuit import QuantumCircuit
|
23
|
+
from qiskit.providers import JobV1 as Job
|
24
|
+
from qiskit.quantum_info.operators import SparsePauliOp
|
25
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
26
|
+
|
27
|
+
from ..containers import (
|
28
|
+
DataBin,
|
29
|
+
EstimatorPubLike,
|
30
|
+
PrimitiveResult,
|
31
|
+
PubResult,
|
32
|
+
)
|
33
|
+
from ..containers.estimator_pub import EstimatorPub
|
34
|
+
from .validation_v1 import _validate_estimator_args
|
35
|
+
from .base_primitive_v1 import BasePrimitiveV1
|
36
|
+
from .base_primitive_job import BasePrimitiveJob
|
37
|
+
|
38
|
+
T = TypeVar("T", bound=Job)
|
39
|
+
|
40
|
+
|
41
|
+
class BaseEstimatorV2(ABC):
|
42
|
+
r"""Base class for ``EstimatorV2`` implementations.
|
43
|
+
|
44
|
+
An estimator calculates expectation values for provided quantum circuit and
|
45
|
+
observable combinations. Implementations of this :class:`.BaseEstimatorV2`
|
46
|
+
interface must define their own :meth:`.run` method, which is designed to
|
47
|
+
take the following inputs:
|
48
|
+
|
49
|
+
* pubs: list of pubs (Primitive Unified Blocs). An estimator pub is a list
|
50
|
+
or tuple of two to four elements that define the unit of work for the
|
51
|
+
estimator. These are:
|
52
|
+
|
53
|
+
* A single :class:`~qiskit.circuit.QuantumCircuit`, possibly parametrized,
|
54
|
+
whose final state we define as :math:`\psi(\theta)`.
|
55
|
+
|
56
|
+
* One or more observables (specified as any :class:`~.ObservablesArrayLike`, including
|
57
|
+
:class:`~.Pauli`, :class:`~.SparsePauliOp`, ``str``) that specify which expectation
|
58
|
+
values to estimate, denoted :math:`H_j`.
|
59
|
+
|
60
|
+
* A collection parameter value sets to bind the circuit against, :math:`\theta_k`
|
61
|
+
|
62
|
+
* Optionally, the estimation precision.
|
63
|
+
|
64
|
+
* precision: the estimation precision. This specification is optional and will be overriden by
|
65
|
+
the pub-wise shots if provided.
|
66
|
+
|
67
|
+
All estimator implementations must implement default value for the ``precision`` in the
|
68
|
+
:meth:`.run` method. This default value will be used any time ``precision=None`` is specified, which
|
69
|
+
can take place in the :meth:`.run` kwargs or at the pub level.
|
70
|
+
"""
|
71
|
+
|
72
|
+
@staticmethod
|
73
|
+
def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
|
74
|
+
# this method is present for backwards compat. new primitive implementations
|
75
|
+
# should avoid it.
|
76
|
+
return DataBin
|
77
|
+
|
78
|
+
@abstractmethod
|
79
|
+
def run(
|
80
|
+
self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
|
81
|
+
) -> BasePrimitiveJob[PrimitiveResult[PubResult]]:
|
82
|
+
"""Estimate expectation values for each provided pub (Primitive Unified Bloc).
|
83
|
+
|
84
|
+
Args:
|
85
|
+
pubs: An iterable of pub-like objects, such as tuples ``(circuit, observables)``
|
86
|
+
or ``(circuit, observables, parameter_values)``.
|
87
|
+
precision: The target precision for expectation value estimates of each
|
88
|
+
run Estimator Pub that does not specify its own precision. If None
|
89
|
+
the estimator's default precision value will be used.
|
90
|
+
|
91
|
+
Returns:
|
92
|
+
A job object that contains results.
|
93
|
+
"""
|
94
|
+
|
95
|
+
|
96
|
+
class BaseEstimatorV1(BasePrimitiveV1, Generic[T]):
|
97
|
+
r"""Base class for ``EstimatorV1`` implementations.
|
98
|
+
|
99
|
+
Note that the reference estimator in Qiskit follows the ``EstimatorV2``
|
100
|
+
interface specifications instead.
|
101
|
+
|
102
|
+
An estimator calculates expectation values for provided quantum circuit and
|
103
|
+
observable combinations.
|
104
|
+
|
105
|
+
Implementations of :class:`.BaseEstimatorV1` should define their own
|
106
|
+
:meth:`.BaseEstimatorV1._run` method
|
107
|
+
that will be called by the public-facing :meth:`qiskit.primitives.BaseEstimatorV1.run`,
|
108
|
+
which takes the following inputs:
|
109
|
+
|
110
|
+
* quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits
|
111
|
+
(a list of :class:`~qiskit.circuit.QuantumCircuit` objects).
|
112
|
+
|
113
|
+
* observables (:math:`H_j`): a list of :class:`~qiskit.quantum_info.SparsePauliOp`
|
114
|
+
objects.
|
115
|
+
|
116
|
+
* parameter values (:math:`\theta_k`): list of sets of values
|
117
|
+
to be bound to the parameters of the quantum circuits
|
118
|
+
(list of list of float).
|
119
|
+
|
120
|
+
The method returns a :class:`~qiskit.providers.JobV1` object. Calling
|
121
|
+
:meth:`qiskit.providers.JobV1.result()` yields the
|
122
|
+
a list of expectation values plus optional metadata like confidence intervals for
|
123
|
+
the estimation.
|
124
|
+
|
125
|
+
.. math::
|
126
|
+
|
127
|
+
\langle\psi_i(\theta_k)|H_j|\psi_i(\theta_k)\rangle
|
128
|
+
|
129
|
+
Here is an example of how a :class:`.BaseEstimatorV1` would be used:
|
130
|
+
|
131
|
+
.. code-block:: python
|
132
|
+
|
133
|
+
# This is a fictional import path.
|
134
|
+
# There are currently no EstimatorV1 implementations in Qiskit.
|
135
|
+
from estimator_v1_location import EstimatorV1
|
136
|
+
from qiskit.circuit.library import RealAmplitudes
|
137
|
+
from qiskit.quantum_info import SparsePauliOp
|
138
|
+
|
139
|
+
psi1 = RealAmplitudes(num_qubits=2, reps=2)
|
140
|
+
psi2 = RealAmplitudes(num_qubits=2, reps=3)
|
141
|
+
|
142
|
+
H1 = SparsePauliOp.from_list([("II", 1), ("IZ", 2), ("XI", 3)])
|
143
|
+
H2 = SparsePauliOp.from_list([("IZ", 1)])
|
144
|
+
H3 = SparsePauliOp.from_list([("ZI", 1), ("ZZ", 1)])
|
145
|
+
|
146
|
+
theta1 = [0, 1, 1, 2, 3, 5]
|
147
|
+
theta2 = [0, 1, 1, 2, 3, 5, 8, 13]
|
148
|
+
theta3 = [1, 2, 3, 4, 5, 6]
|
149
|
+
|
150
|
+
estimator = EstimatorV1()
|
151
|
+
|
152
|
+
# calculate [ <psi1(theta1)|H1|psi1(theta1)> ]
|
153
|
+
job = estimator.run([psi1], [H1], [theta1])
|
154
|
+
job_result = job.result() # It will block until the job finishes.
|
155
|
+
print(f"The primitive-job finished with result {job_result}")
|
156
|
+
|
157
|
+
# calculate [ <psi1(theta1)|H1|psi1(theta1)>,
|
158
|
+
# <psi2(theta2)|H2|psi2(theta2)>,
|
159
|
+
# <psi1(theta3)|H3|psi1(theta3)> ]
|
160
|
+
job2 = estimator.run([psi1, psi2, psi1], [H1, H2, H3], [theta1, theta2, theta3])
|
161
|
+
job_result = job2.result()
|
162
|
+
print(f"The primitive-job finished with result {job_result}")
|
163
|
+
"""
|
164
|
+
|
165
|
+
__hash__ = None
|
166
|
+
|
167
|
+
def __init__(
|
168
|
+
self,
|
169
|
+
*,
|
170
|
+
options: dict | None = None,
|
171
|
+
):
|
172
|
+
"""
|
173
|
+
Initialize ``EstimatorV1``.
|
174
|
+
|
175
|
+
Args:
|
176
|
+
options: Default options.
|
177
|
+
"""
|
178
|
+
super().__init__(options)
|
179
|
+
|
180
|
+
def run(
|
181
|
+
self,
|
182
|
+
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
183
|
+
observables: Sequence[BaseOperator | str] | BaseOperator | str,
|
184
|
+
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
|
185
|
+
**run_options,
|
186
|
+
) -> T:
|
187
|
+
"""Run the job of the estimation of expectation value(s).
|
188
|
+
|
189
|
+
``circuits``, ``observables``, and ``parameter_values`` should have the same
|
190
|
+
length. The i-th element of the result is the expectation of observable
|
191
|
+
|
192
|
+
.. code-block:: python
|
193
|
+
|
194
|
+
obs = observables[i]
|
195
|
+
|
196
|
+
for the state prepared by
|
197
|
+
|
198
|
+
.. code-block:: python
|
199
|
+
|
200
|
+
circ = circuits[i]
|
201
|
+
|
202
|
+
with bound parameters
|
203
|
+
|
204
|
+
.. code-block:: python
|
205
|
+
|
206
|
+
values = parameter_values[i]
|
207
|
+
|
208
|
+
Args:
|
209
|
+
circuits: one or more circuit objects.
|
210
|
+
observables: one or more observable objects. Several formats are allowed;
|
211
|
+
importantly, ``str`` should follow the string representation format for
|
212
|
+
:class:`~qiskit.quantum_info.Pauli` objects.
|
213
|
+
parameter_values: concrete parameters to be bound.
|
214
|
+
run_options: runtime options used for circuit execution.
|
215
|
+
|
216
|
+
Returns:
|
217
|
+
The job object of EstimatorResult.
|
218
|
+
|
219
|
+
Raises:
|
220
|
+
TypeError: Invalid argument type given.
|
221
|
+
ValueError: Invalid argument values given.
|
222
|
+
"""
|
223
|
+
# Validation
|
224
|
+
circuits, observables, parameter_values = _validate_estimator_args(
|
225
|
+
circuits, observables, parameter_values
|
226
|
+
)
|
227
|
+
|
228
|
+
# Options
|
229
|
+
run_opts = copy(self.options)
|
230
|
+
run_opts.update_options(**run_options)
|
231
|
+
|
232
|
+
return self._run(
|
233
|
+
circuits,
|
234
|
+
observables,
|
235
|
+
parameter_values,
|
236
|
+
**run_opts.__dict__,
|
237
|
+
)
|
238
|
+
|
239
|
+
@abstractmethod
|
240
|
+
def _run(
|
241
|
+
self,
|
242
|
+
circuits: tuple[QuantumCircuit, ...],
|
243
|
+
observables: tuple[SparsePauliOp, ...],
|
244
|
+
parameter_values: tuple[tuple[float, ...], ...],
|
245
|
+
**run_options,
|
246
|
+
) -> T:
|
247
|
+
raise NotImplementedError("The subclass of BaseEstimatorV1 must implement `_run` method.")
|
@@ -0,0 +1,78 @@
|
|
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
|
+
Primitive job abstract base class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from abc import ABC, abstractmethod
|
17
|
+
from typing import Generic, TypeVar, Union
|
18
|
+
|
19
|
+
from ..containers import PrimitiveResult
|
20
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
21
|
+
|
22
|
+
ResultT = TypeVar("ResultT", bound=Union[_BasePrimitiveResultV1, PrimitiveResult])
|
23
|
+
StatusT = TypeVar("StatusT")
|
24
|
+
|
25
|
+
|
26
|
+
class BasePrimitiveJob(ABC, Generic[ResultT, StatusT]):
|
27
|
+
"""Primitive job abstract base class."""
|
28
|
+
|
29
|
+
def __init__(self, job_id: str, **kwargs) -> None:
|
30
|
+
"""Initializes the primitive job.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
job_id: A unique id in the context of the primitive used to run the job.
|
34
|
+
kwargs: Any key value metadata to associate with this job.
|
35
|
+
"""
|
36
|
+
self._job_id = job_id
|
37
|
+
self.metadata = kwargs
|
38
|
+
|
39
|
+
def job_id(self) -> str:
|
40
|
+
"""Return a unique id identifying the job."""
|
41
|
+
return self._job_id
|
42
|
+
|
43
|
+
@abstractmethod
|
44
|
+
def result(self) -> ResultT:
|
45
|
+
"""Return the results of the job."""
|
46
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `result` method.")
|
47
|
+
|
48
|
+
@abstractmethod
|
49
|
+
def status(self) -> StatusT:
|
50
|
+
"""Return the status of the job."""
|
51
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `status` method.")
|
52
|
+
|
53
|
+
@abstractmethod
|
54
|
+
def done(self) -> bool:
|
55
|
+
"""Return whether the job has successfully run."""
|
56
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `done` method.")
|
57
|
+
|
58
|
+
@abstractmethod
|
59
|
+
def running(self) -> bool:
|
60
|
+
"""Return whether the job is actively running."""
|
61
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `running` method.")
|
62
|
+
|
63
|
+
@abstractmethod
|
64
|
+
def cancelled(self) -> bool:
|
65
|
+
"""Return whether the job has been cancelled."""
|
66
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `cancelled` method.")
|
67
|
+
|
68
|
+
@abstractmethod
|
69
|
+
def in_final_state(self) -> bool:
|
70
|
+
"""Return whether the job is in a final job state such as ``DONE`` or ``ERROR``."""
|
71
|
+
raise NotImplementedError(
|
72
|
+
"Subclass of BasePrimitiveJob must implement `is_final_state` method."
|
73
|
+
)
|
74
|
+
|
75
|
+
@abstractmethod
|
76
|
+
def cancel(self):
|
77
|
+
"""Attempt to cancel the job."""
|
78
|
+
raise NotImplementedError("Subclass of BasePrimitiveJob must implement `cancel` method.")
|