qiskit 2.1.0rc1__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 +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -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 +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -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 +188 -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 +159 -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 +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -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 +322 -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 +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -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 +202 -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 +236 -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 +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -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 +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -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 +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -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 +185 -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 +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -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 +193 -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 +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -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 +100 -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 +376 -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 +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -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 +29 -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 +24 -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 +584 -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 +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -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/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -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 +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -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 +61 -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 +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -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 +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -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 +525 -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 +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -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 +251 -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_clifford_t.py +68 -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 +633 -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 +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -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 +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -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 +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -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 +2338 -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 +318 -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 +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -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 +355 -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 +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -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/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -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/style.py +223 -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.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,380 @@
|
|
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
|
+
from copy import deepcopy
|
20
|
+
from collections.abc import Iterable, Mapping as _Mapping
|
21
|
+
from typing import Union, Mapping, overload, TYPE_CHECKING
|
22
|
+
|
23
|
+
import numpy as np
|
24
|
+
from numpy.typing import ArrayLike
|
25
|
+
|
26
|
+
from qiskit.quantum_info import Pauli, PauliList, SparsePauliOp, SparseObservable
|
27
|
+
|
28
|
+
from .object_array import object_array
|
29
|
+
from .shape import ShapedMixin, shape_tuple
|
30
|
+
|
31
|
+
|
32
|
+
if TYPE_CHECKING:
|
33
|
+
from qiskit.transpiler.layout import TranspileLayout
|
34
|
+
|
35
|
+
|
36
|
+
# Public API classes
|
37
|
+
__all__ = ["ObservableLike", "ObservablesArrayLike"]
|
38
|
+
|
39
|
+
IndexType = Union[int, slice, None] # pylint: disable=used-before-assignment
|
40
|
+
|
41
|
+
ObservableLike = Union[
|
42
|
+
str,
|
43
|
+
Pauli,
|
44
|
+
SparsePauliOp,
|
45
|
+
SparseObservable,
|
46
|
+
Mapping[Union[str, Pauli], float],
|
47
|
+
]
|
48
|
+
"""Types that can be natively used to construct a Hermitian Estimator observable."""
|
49
|
+
|
50
|
+
|
51
|
+
ObservablesArrayLike = Union[ObservableLike, ArrayLike]
|
52
|
+
"""Types that can be natively converted to an array of Hermitian Estimator observables."""
|
53
|
+
|
54
|
+
|
55
|
+
class ObservablesArray(ShapedMixin):
|
56
|
+
"""An ND-array of Hermitian observables for an :class:`.Estimator` primitive."""
|
57
|
+
|
58
|
+
__slots__ = ("_array", "_shape")
|
59
|
+
|
60
|
+
def __init__(
|
61
|
+
self,
|
62
|
+
observables: ObservablesArrayLike,
|
63
|
+
num_qubits: int | None = None,
|
64
|
+
copy: bool = True,
|
65
|
+
validate: bool = True,
|
66
|
+
):
|
67
|
+
"""Initialize an observables array.
|
68
|
+
|
69
|
+
Args:
|
70
|
+
observables: An array-like of basis observable compatible objects.
|
71
|
+
copy: Specify the ``copy`` kwarg of the :func:`.object_array` function
|
72
|
+
when initializing observables.
|
73
|
+
num_qubits: The number of qubits of the observables. If not specified, the number of
|
74
|
+
qubits will be inferred from the observables. If specified, then the specified
|
75
|
+
number of qubits must match the number of qubits in the observables.
|
76
|
+
validate: If true, coerce entries into the internal format and validate them. If false,
|
77
|
+
the input should already be an array-like.
|
78
|
+
|
79
|
+
Raises:
|
80
|
+
ValueError: If ``validate=True`` and the input observables array is not valid.
|
81
|
+
"""
|
82
|
+
super().__init__()
|
83
|
+
if isinstance(observables, ObservablesArray):
|
84
|
+
observables = observables._array
|
85
|
+
self._array = object_array(observables, copy=copy, list_types=(PauliList,))
|
86
|
+
self._shape = self._array.shape
|
87
|
+
self._num_qubits = num_qubits
|
88
|
+
|
89
|
+
if validate:
|
90
|
+
for ndi, obs in np.ndenumerate(self._array):
|
91
|
+
basis_obs = self.coerce_observable(obs)
|
92
|
+
if self._num_qubits is None:
|
93
|
+
self._num_qubits = basis_obs.num_qubits
|
94
|
+
elif self._num_qubits != basis_obs.num_qubits:
|
95
|
+
raise ValueError(
|
96
|
+
"The number of qubits must be the same for all observables in the "
|
97
|
+
"observables array."
|
98
|
+
)
|
99
|
+
self._array[ndi] = basis_obs
|
100
|
+
elif self._num_qubits is None and self._array.size > 0:
|
101
|
+
self._num_qubits = self._array.reshape(-1)[0].num_qubits
|
102
|
+
|
103
|
+
# can happen for empty arrays
|
104
|
+
if self._num_qubits is None:
|
105
|
+
self._num_qubits = 0
|
106
|
+
|
107
|
+
@staticmethod
|
108
|
+
def _obs_to_dict(obs: SparseObservable) -> Mapping[str, float]:
|
109
|
+
"""Convert a sparse observable to a mapping from Pauli strings to coefficients."""
|
110
|
+
result = {}
|
111
|
+
for sparse_pauli_str, pauli_qubits, coeff in obs.to_sparse_list():
|
112
|
+
|
113
|
+
if len(sparse_pauli_str) == 0:
|
114
|
+
full_pauli_str = "I" * obs.num_qubits
|
115
|
+
else:
|
116
|
+
sorted_lists = sorted(zip(pauli_qubits, sparse_pauli_str))
|
117
|
+
string_fragments = []
|
118
|
+
prev_qubit = -1
|
119
|
+
for qubit, pauli in sorted_lists:
|
120
|
+
string_fragments.append("I" * (qubit - prev_qubit - 1) + pauli)
|
121
|
+
prev_qubit = qubit
|
122
|
+
|
123
|
+
string_fragments.append("I" * (obs.num_qubits - max(pauli_qubits) - 1))
|
124
|
+
full_pauli_str = "".join(string_fragments)[::-1]
|
125
|
+
|
126
|
+
# We know that the dictionary doesn't contain yet full_pauli_str as a key
|
127
|
+
# because the observable is guaranteed to be simplified
|
128
|
+
result[full_pauli_str] = np.real(coeff)
|
129
|
+
|
130
|
+
return result
|
131
|
+
|
132
|
+
def __repr__(self):
|
133
|
+
prefix = f"{type(self).__name__}("
|
134
|
+
suffix = f", shape={self.shape})"
|
135
|
+
array = np.array2string(self.__array__(), prefix=prefix, suffix=suffix, threshold=50)
|
136
|
+
return prefix + array + suffix
|
137
|
+
|
138
|
+
def tolist(self) -> list | ObservableLike:
|
139
|
+
"""Convert to a nested list.
|
140
|
+
|
141
|
+
Similar to Numpy's ``tolist`` method, the level of nesting
|
142
|
+
depends on the dimension of the observables array. In the
|
143
|
+
case of dimension 0 the method returns a single observable
|
144
|
+
(``dict`` in the case of a weighted sum of Paulis) instead of a list.
|
145
|
+
|
146
|
+
Examples::
|
147
|
+
Return values for a one-element list vs one element:
|
148
|
+
|
149
|
+
>>> from qiskit.primitives.containers.observables_array import ObservablesArray
|
150
|
+
>>> oa = ObservablesArray.coerce(["Z"])
|
151
|
+
>>> print(type(oa.tolist()))
|
152
|
+
<class 'list'>
|
153
|
+
>>> oa = ObservablesArray.coerce("Z")
|
154
|
+
>>> print(type(oa.tolist()))
|
155
|
+
<class 'dict'>
|
156
|
+
"""
|
157
|
+
return self.__array__().tolist()
|
158
|
+
|
159
|
+
def __array__(self, dtype=None, copy=None) -> np.ndarray: # pylint: disable=unused-argument
|
160
|
+
"""Convert to a Numpy.ndarray with elements of type dict."""
|
161
|
+
if dtype is None or dtype == object:
|
162
|
+
tmp_result = self.__getitem__(tuple(slice(None) for _ in self._array.shape))
|
163
|
+
if len(self._array.shape) == 0:
|
164
|
+
result = np.ndarray(shape=self._array.shape, dtype=dict)
|
165
|
+
result[()] = tmp_result
|
166
|
+
else:
|
167
|
+
result = np.ndarray(tmp_result.shape, dtype=dict)
|
168
|
+
for ndi, obs in np.ndenumerate(tmp_result._array):
|
169
|
+
result[ndi] = self._obs_to_dict(obs)
|
170
|
+
return result
|
171
|
+
raise ValueError("Type must be 'None' or 'object'")
|
172
|
+
|
173
|
+
def sparse_observables_array(self, copy: bool = False) -> np.ndarray:
|
174
|
+
"""Convert to a :class:`numpy.ndarray` with elements of type :class:`~.SparseObservable`.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
copy: Whether to make a new array instance with new sparse observables as elements.
|
178
|
+
|
179
|
+
Returns:
|
180
|
+
A :class:`numpy.ndarray` with elements of type :class:`~.SparseObservable`.
|
181
|
+
"""
|
182
|
+
obs = self.copy() if copy else self
|
183
|
+
return obs._array
|
184
|
+
|
185
|
+
@overload
|
186
|
+
def __getitem__(self, args: int | tuple[int, ...]) -> Mapping[str, float]: ...
|
187
|
+
|
188
|
+
@overload
|
189
|
+
def __getitem__(self, args: IndexType | tuple[IndexType, ...]) -> ObservablesArray: ...
|
190
|
+
|
191
|
+
def __getitem__(self, args):
|
192
|
+
item = self._array[args]
|
193
|
+
if not isinstance(item, np.ndarray):
|
194
|
+
return self._obs_to_dict(item)
|
195
|
+
|
196
|
+
return ObservablesArray(item, copy=False, validate=False)
|
197
|
+
|
198
|
+
@overload
|
199
|
+
def slice(self, args: int | tuple[int, ...]) -> SparseObservable: ...
|
200
|
+
|
201
|
+
@overload
|
202
|
+
def slice(self, args: IndexType | tuple[IndexType, ...]) -> ObservablesArray: ...
|
203
|
+
|
204
|
+
def slice(self, args):
|
205
|
+
"""Take a slice of the observables in this array.
|
206
|
+
|
207
|
+
.. note::
|
208
|
+
This method does not copy observables; modifying the returned observables will affect this
|
209
|
+
instance.
|
210
|
+
|
211
|
+
Returns:
|
212
|
+
A single :class:`~.SparseObservable` if an integer is given for every array axis, otherwise,
|
213
|
+
a new :class:`~.ObservablesArray`.
|
214
|
+
"""
|
215
|
+
item = self._array[args]
|
216
|
+
if not isinstance(item, np.ndarray):
|
217
|
+
return item
|
218
|
+
|
219
|
+
return ObservablesArray(item, copy=False, validate=False)
|
220
|
+
|
221
|
+
def reshape(self, *shape: int | Iterable[int]) -> ObservablesArray:
|
222
|
+
"""Return a new array with a different shape.
|
223
|
+
|
224
|
+
This results in a new view of the same arrays.
|
225
|
+
|
226
|
+
Args:
|
227
|
+
shape: The shape of the returned array.
|
228
|
+
|
229
|
+
Returns:
|
230
|
+
A new array.
|
231
|
+
"""
|
232
|
+
shape = shape_tuple(*shape)
|
233
|
+
return ObservablesArray(self._array.reshape(shape), copy=False, validate=False)
|
234
|
+
|
235
|
+
def ravel(self) -> ObservablesArray:
|
236
|
+
"""Return a new array with one dimension.
|
237
|
+
|
238
|
+
The returned array has a :attr:`shape` given by ``(size, )``, where
|
239
|
+
the size is the :attr:`~size` of this array.
|
240
|
+
|
241
|
+
Returns:
|
242
|
+
A new flattened array.
|
243
|
+
"""
|
244
|
+
return self.reshape(self.size)
|
245
|
+
|
246
|
+
@property
|
247
|
+
def num_qubits(self) -> int:
|
248
|
+
"""The number of qubits each observable acts on."""
|
249
|
+
return self._num_qubits
|
250
|
+
|
251
|
+
@classmethod
|
252
|
+
def coerce_observable(cls, observable: ObservableLike) -> SparseObservable:
|
253
|
+
"""Format an observable-like object into the internal format.
|
254
|
+
|
255
|
+
Args:
|
256
|
+
observable: The observable-like to format.
|
257
|
+
|
258
|
+
Returns:
|
259
|
+
The coerced observable.
|
260
|
+
|
261
|
+
Raises:
|
262
|
+
TypeError: If the input cannot be formatted because its type is not valid.
|
263
|
+
ValueError: If the input observable is invalid.
|
264
|
+
"""
|
265
|
+
# Pauli-type conversions
|
266
|
+
if isinstance(observable, SparsePauliOp):
|
267
|
+
observable = SparseObservable.from_sparse_pauli_op(observable)
|
268
|
+
elif isinstance(observable, Pauli):
|
269
|
+
observable = SparseObservable.from_pauli(observable)
|
270
|
+
elif isinstance(observable, str):
|
271
|
+
observable = SparseObservable.from_label(observable)
|
272
|
+
elif isinstance(observable, _Mapping):
|
273
|
+
term_list = []
|
274
|
+
for basis, coeff in observable.items():
|
275
|
+
if isinstance(basis, str):
|
276
|
+
term_list.append((basis, coeff))
|
277
|
+
elif isinstance(basis, Pauli):
|
278
|
+
unphased_basis, phase = basis[:].to_label(), basis.phase
|
279
|
+
term_list.append((unphased_basis, complex(0, 1) ** phase * coeff))
|
280
|
+
else:
|
281
|
+
raise TypeError(f"Invalid observable basis type: {type(basis)}")
|
282
|
+
observable = SparseObservable.from_list(term_list)
|
283
|
+
|
284
|
+
if isinstance(observable, SparseObservable):
|
285
|
+
# Check that the operator has real coeffs
|
286
|
+
coeffs = np.real_if_close(observable.coeffs)
|
287
|
+
if np.iscomplexobj(coeffs):
|
288
|
+
raise ValueError(
|
289
|
+
"Non-Hermitian input observable: the input SparsePauliOp has non-zero"
|
290
|
+
" imaginary part in its coefficients."
|
291
|
+
)
|
292
|
+
|
293
|
+
return SparseObservable.from_raw_parts(
|
294
|
+
observable.num_qubits,
|
295
|
+
coeffs,
|
296
|
+
observable.bit_terms,
|
297
|
+
observable.indices,
|
298
|
+
observable.boundaries,
|
299
|
+
).simplify(tol=0)
|
300
|
+
|
301
|
+
raise TypeError(f"Invalid observable type: {type(observable)}")
|
302
|
+
|
303
|
+
@classmethod
|
304
|
+
def coerce(cls, observables: ObservablesArrayLike) -> ObservablesArray:
|
305
|
+
"""Coerce ObservablesArrayLike into ObservableArray.
|
306
|
+
|
307
|
+
Args:
|
308
|
+
observables: an object to be observables array.
|
309
|
+
|
310
|
+
Returns:
|
311
|
+
A coerced observables array.
|
312
|
+
"""
|
313
|
+
if isinstance(observables, ObservablesArray):
|
314
|
+
return observables
|
315
|
+
return cls(observables)
|
316
|
+
|
317
|
+
def equivalent(self, other: ObservablesArray, tol: float = 1e-08) -> bool:
|
318
|
+
"""Compute whether the observable arrays are equal within a given tolerance.
|
319
|
+
|
320
|
+
Args:
|
321
|
+
other: Another observables array to compare with.
|
322
|
+
tol: The tolerance to provide to :attr:`~.SparseObservable.simplify` during checking.
|
323
|
+
|
324
|
+
Returns:
|
325
|
+
Whether the two observables arrays have the same shape and number of qubits,
|
326
|
+
and if so, whether they are equal within tolerance.
|
327
|
+
"""
|
328
|
+
if self.num_qubits != other.num_qubits or self.shape != other.shape:
|
329
|
+
return False
|
330
|
+
|
331
|
+
zero_obs = SparseObservable.zero(self.num_qubits)
|
332
|
+
for obs1, obs2 in zip(self._array.ravel(), other._array.ravel()):
|
333
|
+
if (obs1 - obs2).simplify(tol) != zero_obs:
|
334
|
+
return False
|
335
|
+
|
336
|
+
return True
|
337
|
+
|
338
|
+
def copy(self):
|
339
|
+
"""Return a deep copy of the array."""
|
340
|
+
return deepcopy(self)
|
341
|
+
|
342
|
+
def apply_layout(
|
343
|
+
self, layout: TranspileLayout | list[int] | None, num_qubits: int | None = None
|
344
|
+
) -> ObservablesArray:
|
345
|
+
"""Apply a transpiler layout to this :class:`~.ObservablesArray`.
|
346
|
+
|
347
|
+
Args:
|
348
|
+
layout: Either a :class:`~.TranspileLayout`, a list of integers or None.
|
349
|
+
If both layout and ``num_qubits`` are none, a deep copy of the array is
|
350
|
+
returned.
|
351
|
+
num_qubits: The number of qubits to expand the array to. If not
|
352
|
+
provided then if ``layout`` is a :class:`~.TranspileLayout` the
|
353
|
+
number of the transpiler output circuit qubits will be used by
|
354
|
+
default. If ``layout`` is a list of integers the permutation
|
355
|
+
specified will be applied without any expansion. If layout is
|
356
|
+
None, the array will be expanded to the given number of qubits.
|
357
|
+
|
358
|
+
Returns:
|
359
|
+
A new :class:`.ObservablesArray` with the provided layout applied.
|
360
|
+
|
361
|
+
Raises:
|
362
|
+
QiskitError: ...
|
363
|
+
"""
|
364
|
+
if layout is None and num_qubits is None:
|
365
|
+
return self.copy()
|
366
|
+
|
367
|
+
new_arr = np.ndarray(self.shape, dtype=SparseObservable)
|
368
|
+
for ndi, obs in np.ndenumerate(self._array):
|
369
|
+
new_arr[ndi] = obs.apply_layout(layout, num_qubits)
|
370
|
+
|
371
|
+
return ObservablesArray(new_arr, validate=False)
|
372
|
+
|
373
|
+
def validate(self):
|
374
|
+
"""Validate the consistency in observables array."""
|
375
|
+
for obs in self._array.reshape(-1):
|
376
|
+
if obs.num_qubits != self.num_qubits:
|
377
|
+
raise ValueError(
|
378
|
+
"An observable was detected, whose number of qubits"
|
379
|
+
" does not match the array's number of qubits"
|
380
|
+
)
|
@@ -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
|
+
"""
|