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,45 @@
|
|
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
|
+
"""Primitive V1 abstract base class."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from abc import ABC
|
18
|
+
|
19
|
+
from qiskit.providers import Options
|
20
|
+
|
21
|
+
|
22
|
+
class BasePrimitiveV1(ABC):
|
23
|
+
"""Primitive V1 abstract base class."""
|
24
|
+
|
25
|
+
def __init__(self, options: dict | None = None):
|
26
|
+
self._run_options = Options()
|
27
|
+
if options is not None:
|
28
|
+
self._run_options.update_options(**options)
|
29
|
+
|
30
|
+
@property
|
31
|
+
def options(self) -> Options:
|
32
|
+
"""Return options values for the estimator.
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
options
|
36
|
+
"""
|
37
|
+
return self._run_options
|
38
|
+
|
39
|
+
def set_options(self, **fields):
|
40
|
+
"""Set options values for the estimator.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
**fields: The fields to update the options
|
44
|
+
"""
|
45
|
+
self._run_options.update_options(**fields)
|
@@ -0,0 +1,65 @@
|
|
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
|
+
Primitive V1 result abstract base class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from abc import ABC
|
19
|
+
from collections.abc import Sequence
|
20
|
+
from dataclasses import fields
|
21
|
+
from typing import Any, Dict
|
22
|
+
|
23
|
+
from numpy import ndarray
|
24
|
+
|
25
|
+
ExperimentData = Dict[str, Any]
|
26
|
+
|
27
|
+
|
28
|
+
class _BasePrimitiveResultV1(ABC):
|
29
|
+
"""
|
30
|
+
Base class for deprecated Primitive V1 result methods.
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __post_init__(self) -> None:
|
34
|
+
"""
|
35
|
+
Verify that all fields in any inheriting result dataclass are consistent, after
|
36
|
+
instantiation, with the number of experiments being represented.
|
37
|
+
|
38
|
+
This magic method is specific of `dataclasses.dataclass`, therefore all inheriting
|
39
|
+
classes must have this decorator.
|
40
|
+
|
41
|
+
Raises:
|
42
|
+
TypeError: If one of the data fields is not a Sequence or ``numpy.ndarray``.
|
43
|
+
ValueError: Inconsistent number of experiments across data fields.
|
44
|
+
"""
|
45
|
+
num_experiments = None
|
46
|
+
for value in self._field_values: # type: Sequence
|
47
|
+
if num_experiments is None:
|
48
|
+
num_experiments = len(value)
|
49
|
+
# TODO: enforce all data fields to be tuples instead of sequences
|
50
|
+
if not isinstance(value, (Sequence, ndarray)) or isinstance(value, (str, bytes)):
|
51
|
+
raise TypeError(
|
52
|
+
f"Expected sequence or `numpy.ndarray`, provided {type(value)} instead."
|
53
|
+
)
|
54
|
+
if len(value) != num_experiments:
|
55
|
+
raise ValueError("Inconsistent number of experiments across data fields.")
|
56
|
+
|
57
|
+
@property # TODO: functools.cached_property when py37 is dropped
|
58
|
+
def _field_names(self) -> tuple[str, ...]:
|
59
|
+
"""Tuple of field names in any inheriting result dataclass."""
|
60
|
+
return tuple(field.name for field in fields(self))
|
61
|
+
|
62
|
+
@property # TODO: functools.cached_property when py37 is dropped
|
63
|
+
def _field_values(self) -> tuple:
|
64
|
+
"""Tuple of field values in any inheriting result dataclass."""
|
65
|
+
return tuple(getattr(self, name) for name in self._field_names)
|
@@ -0,0 +1,196 @@
|
|
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
|
+
"""Base Sampler V1 and V2 classes"""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from abc import ABC, abstractmethod
|
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
|
+
|
25
|
+
from ..containers.primitive_result import PrimitiveResult
|
26
|
+
from ..containers.sampler_pub import SamplerPubLike
|
27
|
+
from ..containers.sampler_pub_result import SamplerPubResult
|
28
|
+
from .validation_v1 import _validate_sampler_args
|
29
|
+
from .base_primitive_v1 import BasePrimitiveV1
|
30
|
+
from .base_primitive_job import BasePrimitiveJob
|
31
|
+
|
32
|
+
T = TypeVar("T", bound=Job)
|
33
|
+
|
34
|
+
|
35
|
+
class BaseSamplerV2(ABC):
|
36
|
+
r"""Base class for ``SamplerV2`` implementations.
|
37
|
+
|
38
|
+
A Sampler returns samples of quantum circuit outputs. Implementations of this
|
39
|
+
:class:`.BaseSamplerV2` interface must define their own :meth:`.run` method,
|
40
|
+
which is designed to take the following inputs:
|
41
|
+
|
42
|
+
* pubs: list of pubs (Primitive Unified Blocs). A sampler pub is a list or tuple
|
43
|
+
of two to three elements that define the unit of work for the sampler. These are:
|
44
|
+
|
45
|
+
* A single :class:`~qiskit.circuit.QuantumCircuit`, possibly parameterized.
|
46
|
+
|
47
|
+
* A collection parameter value sets to bind the circuit against if it is parametric.
|
48
|
+
|
49
|
+
* Optionally, the number of shots to sample.
|
50
|
+
|
51
|
+
* shots: the number of shots to sample. This specification is optional and will be overriden by
|
52
|
+
the pub-wise shots if provided.
|
53
|
+
|
54
|
+
All sampler implementations must implement default value for the ``shots`` in the
|
55
|
+
:meth:`.run` method. This default value will be used any time ``shots=None`` is specified, which
|
56
|
+
can take place in the :meth:`.run` kwargs or at the pub level.
|
57
|
+
"""
|
58
|
+
|
59
|
+
@abstractmethod
|
60
|
+
def run(
|
61
|
+
self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
|
62
|
+
) -> BasePrimitiveJob[PrimitiveResult[SamplerPubResult]]:
|
63
|
+
"""Run and collect samples from each pub.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
pubs: An iterable of pub-like objects. For example, a list of circuits
|
67
|
+
or tuples ``(circuit, parameter_values)``.
|
68
|
+
shots: The total number of shots to sample for each sampler pub that does
|
69
|
+
not specify its own shots. If ``None``, the primitive's default
|
70
|
+
shots value will be used, which can vary by implementation.
|
71
|
+
|
72
|
+
Returns:
|
73
|
+
The job object of Sampler's result.
|
74
|
+
"""
|
75
|
+
|
76
|
+
|
77
|
+
class BaseSamplerV1(BasePrimitiveV1, Generic[T]):
|
78
|
+
r"""Sampler V1 base class
|
79
|
+
|
80
|
+
Base class of Sampler that calculates quasi-probabilities of bitstrings from quantum circuits.
|
81
|
+
|
82
|
+
A sampler is initialized with an empty parameter set. The sampler is used to
|
83
|
+
create a :class:`~qiskit.providers.JobV1`, via the :meth:`qiskit.primitives.Sampler.run()`
|
84
|
+
method. This method is called with the following parameters
|
85
|
+
|
86
|
+
* quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits.
|
87
|
+
(a list of :class:`~qiskit.circuit.QuantumCircuit` objects)
|
88
|
+
|
89
|
+
* parameter values (:math:`\theta_k`): list of sets of parameter values
|
90
|
+
to be bound to the parameters of the quantum circuits.
|
91
|
+
(list of list of float)
|
92
|
+
|
93
|
+
The method returns a :class:`~qiskit.providers.JobV1` object, calling
|
94
|
+
:meth:`qiskit.providers.JobV1.result()` yields a :class:`~qiskit.primitives.SamplerResult`
|
95
|
+
object, which contains probabilities or quasi-probabilities of bitstrings,
|
96
|
+
plus optional metadata like error bars in the samples.
|
97
|
+
|
98
|
+
Here is an example of how sampler is used.
|
99
|
+
|
100
|
+
.. code-block:: python
|
101
|
+
|
102
|
+
# This is a fictional import path.
|
103
|
+
# There are currently no Sampler implementations in Qiskit.
|
104
|
+
from sampler_v1_location import SamplerV1
|
105
|
+
from qiskit import QuantumCircuit
|
106
|
+
from qiskit.circuit.library import RealAmplitudes
|
107
|
+
|
108
|
+
# a Bell circuit
|
109
|
+
bell = QuantumCircuit(2)
|
110
|
+
bell.h(0)
|
111
|
+
bell.cx(0, 1)
|
112
|
+
bell.measure_all()
|
113
|
+
|
114
|
+
# two parameterized circuits
|
115
|
+
pqc = RealAmplitudes(num_qubits=2, reps=2)
|
116
|
+
pqc.measure_all()
|
117
|
+
pqc2 = RealAmplitudes(num_qubits=2, reps=3)
|
118
|
+
pqc2.measure_all()
|
119
|
+
|
120
|
+
theta1 = [0, 1, 1, 2, 3, 5]
|
121
|
+
theta2 = [0, 1, 2, 3, 4, 5, 6, 7]
|
122
|
+
|
123
|
+
# initialization of the sampler
|
124
|
+
sampler = Sampler()
|
125
|
+
|
126
|
+
# Sampler runs a job on the Bell circuit
|
127
|
+
job = sampler.run(circuits=[bell], parameter_values=[[]], parameters=[[]])
|
128
|
+
job_result = job.result()
|
129
|
+
print([q.binary_probabilities() for q in job_result.quasi_dists])
|
130
|
+
|
131
|
+
# Sampler runs a job on the parameterized circuits
|
132
|
+
job2 = sampler.run(
|
133
|
+
circuits=[pqc, pqc2],
|
134
|
+
parameter_values=[theta1, theta2],
|
135
|
+
parameters=[pqc.parameters, pqc2.parameters])
|
136
|
+
job_result = job2.result()
|
137
|
+
print([q.binary_probabilities() for q in job_result.quasi_dists])
|
138
|
+
|
139
|
+
"""
|
140
|
+
|
141
|
+
__hash__ = None
|
142
|
+
|
143
|
+
def __init__(
|
144
|
+
self,
|
145
|
+
*,
|
146
|
+
options: dict | None = None,
|
147
|
+
):
|
148
|
+
"""
|
149
|
+
Initialize ``SamplerV1``.
|
150
|
+
|
151
|
+
Args:
|
152
|
+
options: Default options.
|
153
|
+
"""
|
154
|
+
super().__init__(options)
|
155
|
+
|
156
|
+
def run(
|
157
|
+
self,
|
158
|
+
circuits: QuantumCircuit | Sequence[QuantumCircuit],
|
159
|
+
parameter_values: Sequence[float] | Sequence[Sequence[float]] | None = None,
|
160
|
+
**run_options,
|
161
|
+
) -> T:
|
162
|
+
"""Run the job of the sampling of bitstrings.
|
163
|
+
|
164
|
+
Args:
|
165
|
+
circuits: One of more circuit objects.
|
166
|
+
parameter_values: Parameters to be bound to the circuit.
|
167
|
+
run_options: Backend runtime options used for circuit execution.
|
168
|
+
|
169
|
+
Returns:
|
170
|
+
The job object of the result of the sampler. The i-th result corresponds to
|
171
|
+
``circuits[i]`` evaluated with parameters bound as ``parameter_values[i]``.
|
172
|
+
|
173
|
+
Raises:
|
174
|
+
ValueError: Invalid arguments are given.
|
175
|
+
"""
|
176
|
+
# Validation
|
177
|
+
circuits, parameter_values = _validate_sampler_args(circuits, parameter_values)
|
178
|
+
|
179
|
+
# Options
|
180
|
+
run_opts = copy(self.options)
|
181
|
+
run_opts.update_options(**run_options)
|
182
|
+
|
183
|
+
return self._run(
|
184
|
+
circuits,
|
185
|
+
parameter_values,
|
186
|
+
**run_opts.__dict__,
|
187
|
+
)
|
188
|
+
|
189
|
+
@abstractmethod
|
190
|
+
def _run(
|
191
|
+
self,
|
192
|
+
circuits: tuple[QuantumCircuit, ...],
|
193
|
+
parameter_values: tuple[tuple[float, ...], ...],
|
194
|
+
**run_options,
|
195
|
+
) -> T:
|
196
|
+
raise NotImplementedError("The subclass of BaseSamplerV1 must implement `_run` method.")
|
@@ -0,0 +1,46 @@
|
|
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
|
+
Estimator V1 result class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from dataclasses import dataclass
|
19
|
+
from typing import TYPE_CHECKING, Any
|
20
|
+
|
21
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
import numpy as np
|
25
|
+
|
26
|
+
|
27
|
+
@dataclass(frozen=True)
|
28
|
+
class EstimatorResult(_BasePrimitiveResultV1):
|
29
|
+
"""Result of Estimator V1.
|
30
|
+
|
31
|
+
.. code-block:: python
|
32
|
+
|
33
|
+
result = estimator.run(circuits, observables, params).result()
|
34
|
+
|
35
|
+
where the i-th elements of ``result`` correspond to the circuit and observable given by
|
36
|
+
``circuits[i]``, ``observables[i]``, and the parameter values bounds by ``params[i]``.
|
37
|
+
For example, ``results.values[i]`` gives the expectation value, and ``result.metadata[i]``
|
38
|
+
is a metadata dictionary for this circuit and parameters.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
values (np.ndarray): The array of the expectation values.
|
42
|
+
metadata (list[dict]): List of the metadata.
|
43
|
+
"""
|
44
|
+
|
45
|
+
values: "np.ndarray[Any, np.dtype[np.float64]]"
|
46
|
+
metadata: list[dict[str, Any]]
|
@@ -0,0 +1,45 @@
|
|
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
|
+
Sampler V1 result class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from dataclasses import dataclass
|
19
|
+
from typing import Any
|
20
|
+
|
21
|
+
from qiskit.result import QuasiDistribution
|
22
|
+
|
23
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
24
|
+
|
25
|
+
|
26
|
+
@dataclass(frozen=True)
|
27
|
+
class SamplerResult(_BasePrimitiveResultV1):
|
28
|
+
"""Result of Sampler V1.
|
29
|
+
|
30
|
+
.. code-block:: python
|
31
|
+
|
32
|
+
result = sampler.run(circuits, params).result()
|
33
|
+
|
34
|
+
where the i-th elements of ``result`` correspond to the circuit given by ``circuits[i]``,
|
35
|
+
and the parameter values bounds by ``params[i]``.
|
36
|
+
For example, ``results.quasi_dists[i]`` gives the quasi-probabilities of bitstrings, and
|
37
|
+
``result.metadata[i]`` is a metadata dictionary for this circuit and parameters.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
quasi_dists (list[QuasiDistribution]): List of the quasi-probabilities.
|
41
|
+
metadata (list[dict]): List of the metadata.
|
42
|
+
"""
|
43
|
+
|
44
|
+
quasi_dists: list[QuasiDistribution]
|
45
|
+
metadata: list[dict[str, Any]]
|
@@ -0,0 +1,250 @@
|
|
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
|
+
"""Primitive V1 validation methods.
|
14
|
+
|
15
|
+
Note that these are not intended to be part of the public API of base primitives
|
16
|
+
but are here for backward compatibility with BaseSamplerV1 and BaseEstimatorV1 classes.
|
17
|
+
"""
|
18
|
+
|
19
|
+
from __future__ import annotations
|
20
|
+
|
21
|
+
from collections.abc import Sequence
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit import QuantumCircuit, ControlFlowOp, Measure
|
25
|
+
from qiskit.exceptions import QiskitError
|
26
|
+
from qiskit.quantum_info import PauliList, SparsePauliOp
|
27
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
28
|
+
from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
|
29
|
+
|
30
|
+
|
31
|
+
def _validate_estimator_args(
|
32
|
+
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
33
|
+
observables: Sequence[BaseOperator | str] | BaseOperator | str,
|
34
|
+
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
|
35
|
+
) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
|
36
|
+
"""Validate run arguments for BaseEstimatorV1.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
circuits: one or more circuit objects.
|
40
|
+
observables: one or more observable objects.
|
41
|
+
parameter_values: concrete parameters to be bound.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
The formatted arguments ``(circuits, observables, parameter_values)``.
|
45
|
+
|
46
|
+
Raises:
|
47
|
+
TypeError: If input arguments are invalid types.
|
48
|
+
ValueError: if input arguments are invalid values.
|
49
|
+
"""
|
50
|
+
# Singular validation
|
51
|
+
circuits = _validate_circuits(circuits)
|
52
|
+
observables = _validate_observables(observables)
|
53
|
+
parameter_values = _validate_parameter_values(
|
54
|
+
parameter_values,
|
55
|
+
default=[()] * len(circuits),
|
56
|
+
)
|
57
|
+
|
58
|
+
# Cross-validation
|
59
|
+
_cross_validate_circuits_parameter_values(circuits, parameter_values)
|
60
|
+
_cross_validate_circuits_observables(circuits, observables)
|
61
|
+
|
62
|
+
return circuits, observables, parameter_values
|
63
|
+
|
64
|
+
|
65
|
+
def _validate_sampler_args(
|
66
|
+
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
67
|
+
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
|
68
|
+
) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
|
69
|
+
"""Validate run arguments for BaseSamplerV1.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
circuits: one or more circuit objects.
|
73
|
+
parameter_values: concrete parameters to be bound.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
The formatted arguments ``(circuits, parameter_values)``.
|
77
|
+
|
78
|
+
Raises:
|
79
|
+
TypeError: If input arguments are invalid types.
|
80
|
+
ValueError: if input arguments are invalid values.
|
81
|
+
"""
|
82
|
+
# Singular validation
|
83
|
+
circuits = _validate_circuits(circuits, requires_measure=True)
|
84
|
+
parameter_values = _validate_parameter_values(
|
85
|
+
parameter_values,
|
86
|
+
default=[()] * len(circuits),
|
87
|
+
)
|
88
|
+
|
89
|
+
# Cross-validation
|
90
|
+
_cross_validate_circuits_parameter_values(circuits, parameter_values)
|
91
|
+
|
92
|
+
return circuits, parameter_values
|
93
|
+
|
94
|
+
|
95
|
+
def _init_observable(observable: BaseOperator | str) -> SparsePauliOp:
|
96
|
+
"""Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
|
97
|
+
|
98
|
+
Args:
|
99
|
+
observable: The observable.
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
The observable as :class:`~qiskit.quantum_info.SparsePauliOp`.
|
103
|
+
|
104
|
+
Raises:
|
105
|
+
QiskitError: when observable type cannot be converted to SparsePauliOp.
|
106
|
+
"""
|
107
|
+
|
108
|
+
if isinstance(observable, SparsePauliOp):
|
109
|
+
return observable
|
110
|
+
elif isinstance(observable, BaseOperator) and not isinstance(observable, BasePauli):
|
111
|
+
raise QiskitError(f"observable type not supported: {type(observable)}")
|
112
|
+
else:
|
113
|
+
if isinstance(observable, PauliList):
|
114
|
+
raise QiskitError(f"observable type not supported: {type(observable)}")
|
115
|
+
return SparsePauliOp(observable)
|
116
|
+
|
117
|
+
|
118
|
+
def _validate_circuits(
|
119
|
+
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
120
|
+
requires_measure: bool = False,
|
121
|
+
) -> tuple[QuantumCircuit, ...]:
|
122
|
+
if isinstance(circuits, QuantumCircuit):
|
123
|
+
circuits = (circuits,)
|
124
|
+
elif not isinstance(circuits, Sequence) or not all(
|
125
|
+
isinstance(cir, QuantumCircuit) for cir in circuits
|
126
|
+
):
|
127
|
+
raise TypeError("Invalid circuits, expected Sequence[QuantumCircuit].")
|
128
|
+
elif not isinstance(circuits, tuple):
|
129
|
+
circuits = tuple(circuits)
|
130
|
+
if len(circuits) == 0:
|
131
|
+
raise ValueError("No circuits were provided.")
|
132
|
+
|
133
|
+
if requires_measure:
|
134
|
+
for i, circuit in enumerate(circuits):
|
135
|
+
if circuit.num_clbits == 0:
|
136
|
+
raise ValueError(
|
137
|
+
f"The {i}-th circuit does not have any classical bit. "
|
138
|
+
"Sampler requires classical bits, plus measurements "
|
139
|
+
"on the desired qubits."
|
140
|
+
)
|
141
|
+
if not _has_measure(circuit):
|
142
|
+
raise ValueError(
|
143
|
+
f"The {i}-th circuit does not have Measure instruction. "
|
144
|
+
"Without measurements, the circuit cannot be sampled from."
|
145
|
+
)
|
146
|
+
return circuits
|
147
|
+
|
148
|
+
|
149
|
+
def _validate_parameter_values(
|
150
|
+
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None,
|
151
|
+
default: Sequence[Sequence[float]] | Sequence[float] | None = None,
|
152
|
+
) -> tuple[tuple[float, ...], ...]:
|
153
|
+
# Allow optional (if default)
|
154
|
+
if parameter_values is None:
|
155
|
+
if default is None:
|
156
|
+
raise ValueError("No default `parameter_values`, optional input disallowed.")
|
157
|
+
parameter_values = default
|
158
|
+
|
159
|
+
# Support numpy ndarray
|
160
|
+
if isinstance(parameter_values, np.ndarray):
|
161
|
+
parameter_values = parameter_values.tolist()
|
162
|
+
elif isinstance(parameter_values, Sequence):
|
163
|
+
parameter_values = tuple(
|
164
|
+
vector.tolist() if isinstance(vector, np.ndarray) else vector
|
165
|
+
for vector in parameter_values
|
166
|
+
)
|
167
|
+
|
168
|
+
# Allow single value
|
169
|
+
if _isreal(parameter_values):
|
170
|
+
parameter_values = ((parameter_values,),)
|
171
|
+
elif isinstance(parameter_values, Sequence) and not any(
|
172
|
+
isinstance(vector, Sequence) for vector in parameter_values
|
173
|
+
):
|
174
|
+
parameter_values = (parameter_values,)
|
175
|
+
|
176
|
+
# Validation
|
177
|
+
if (
|
178
|
+
not isinstance(parameter_values, Sequence)
|
179
|
+
or not all(isinstance(vector, Sequence) for vector in parameter_values)
|
180
|
+
or not all(all(_isreal(value) for value in vector) for vector in parameter_values)
|
181
|
+
):
|
182
|
+
raise TypeError("Invalid parameter values, expected Sequence[Sequence[float]].")
|
183
|
+
|
184
|
+
return tuple(tuple(float(value) for value in vector) for vector in parameter_values)
|
185
|
+
|
186
|
+
|
187
|
+
def _validate_observables(
|
188
|
+
observables: Sequence[BaseOperator | str] | BaseOperator | str,
|
189
|
+
) -> tuple[SparsePauliOp, ...]:
|
190
|
+
if isinstance(observables, str) or not isinstance(observables, Sequence):
|
191
|
+
observables = (observables,)
|
192
|
+
if len(observables) == 0:
|
193
|
+
raise ValueError("No observables were provided.")
|
194
|
+
return tuple(_init_observable(obs) for obs in observables)
|
195
|
+
|
196
|
+
|
197
|
+
def _cross_validate_circuits_parameter_values(
|
198
|
+
circuits: tuple[QuantumCircuit, ...], parameter_values: tuple[tuple[float, ...], ...]
|
199
|
+
) -> None:
|
200
|
+
if len(circuits) != len(parameter_values):
|
201
|
+
raise ValueError(
|
202
|
+
f"The number of circuits ({len(circuits)}) does not match "
|
203
|
+
f"the number of parameter value sets ({len(parameter_values)})."
|
204
|
+
)
|
205
|
+
for i, (circuit, vector) in enumerate(zip(circuits, parameter_values)):
|
206
|
+
if len(vector) != circuit.num_parameters:
|
207
|
+
raise ValueError(
|
208
|
+
f"The number of values ({len(vector)}) does not match "
|
209
|
+
f"the number of parameters ({circuit.num_parameters}) for the {i}-th circuit."
|
210
|
+
)
|
211
|
+
|
212
|
+
|
213
|
+
def _cross_validate_circuits_observables(
|
214
|
+
circuits: tuple[QuantumCircuit, ...], observables: tuple[BaseOperator, ...]
|
215
|
+
) -> None:
|
216
|
+
if len(circuits) != len(observables):
|
217
|
+
raise ValueError(
|
218
|
+
f"The number of circuits ({len(circuits)}) does not match "
|
219
|
+
f"the number of observables ({len(observables)})."
|
220
|
+
)
|
221
|
+
for i, (circuit, observable) in enumerate(zip(circuits, observables)):
|
222
|
+
if circuit.num_qubits != observable.num_qubits:
|
223
|
+
raise ValueError(
|
224
|
+
f"The number of qubits of the {i}-th circuit ({circuit.num_qubits}) does "
|
225
|
+
f"not match the number of qubits of the {i}-th observable "
|
226
|
+
f"({observable.num_qubits})."
|
227
|
+
)
|
228
|
+
|
229
|
+
|
230
|
+
def _isint(obj: Sequence[Sequence[float]] | Sequence[float] | float) -> bool:
|
231
|
+
"""Check if object is int."""
|
232
|
+
int_types = (int, np.integer)
|
233
|
+
return isinstance(obj, int_types) and not isinstance(obj, bool)
|
234
|
+
|
235
|
+
|
236
|
+
def _isreal(obj: Sequence[Sequence[float]] | Sequence[float] | float) -> bool:
|
237
|
+
"""Check if object is a real number: int or float except ``±Inf`` and ``NaN``."""
|
238
|
+
float_types = (float, np.floating)
|
239
|
+
return _isint(obj) or isinstance(obj, float_types) and float("-Inf") < obj < float("Inf")
|
240
|
+
|
241
|
+
|
242
|
+
def _has_measure(circuit: QuantumCircuit) -> bool:
|
243
|
+
for instruction in reversed(circuit):
|
244
|
+
if isinstance(instruction.operation, Measure):
|
245
|
+
return True
|
246
|
+
elif isinstance(instruction.operation, ControlFlowOp):
|
247
|
+
for block in instruction.operation.blocks:
|
248
|
+
if _has_measure(block):
|
249
|
+
return True
|
250
|
+
return False
|
@@ -0,0 +1,26 @@
|
|
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
|
+
Data containers for primitives.
|
15
|
+
"""
|
16
|
+
|
17
|
+
|
18
|
+
from .bindings_array import BindingsArrayLike
|
19
|
+
from .bit_array import BitArray
|
20
|
+
from .data_bin import DataBin, make_data_bin
|
21
|
+
from .estimator_pub import EstimatorPubLike
|
22
|
+
from .observables_array import ObservableLike, ObservablesArrayLike
|
23
|
+
from .primitive_result import PrimitiveResult
|
24
|
+
from .pub_result import PubResult
|
25
|
+
from .sampler_pub import SamplerPubLike
|
26
|
+
from .sampler_pub_result import SamplerPubResult
|