qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,530 @@
|
|
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
|
+
"""Estimator V2 implementation for an arbitrary Backend object."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import math
|
18
|
+
from collections import defaultdict
|
19
|
+
from collections.abc import Iterable
|
20
|
+
from dataclasses import dataclass
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
|
25
|
+
from qiskit.exceptions import QiskitError
|
26
|
+
from qiskit.providers import BackendV2
|
27
|
+
from qiskit.quantum_info import Pauli, PauliList
|
28
|
+
from qiskit.result import Counts, Result
|
29
|
+
from qiskit.transpiler import PassManager, PassManagerConfig
|
30
|
+
from qiskit.transpiler.passes import Optimize1qGatesDecomposition
|
31
|
+
|
32
|
+
from .base import BaseEstimatorV2
|
33
|
+
from .containers import DataBin, EstimatorPubLike, PrimitiveResult, PubResult
|
34
|
+
from .containers.bindings_array import BindingsArray
|
35
|
+
from .containers.estimator_pub import EstimatorPub
|
36
|
+
from .primitive_job import PrimitiveJob
|
37
|
+
|
38
|
+
|
39
|
+
def _run_circuits(
|
40
|
+
circuits: QuantumCircuit | list[QuantumCircuit],
|
41
|
+
backend: BackendV2,
|
42
|
+
clear_metadata: bool = True,
|
43
|
+
**run_options,
|
44
|
+
) -> tuple[list[Result], list[dict]]:
|
45
|
+
"""Remove metadata of circuits and run the circuits on a backend.
|
46
|
+
Args:
|
47
|
+
circuits: The circuits
|
48
|
+
backend: The backend
|
49
|
+
clear_metadata: Clear circuit metadata before passing to backend.run if
|
50
|
+
True.
|
51
|
+
**run_options: run_options
|
52
|
+
Returns:
|
53
|
+
The result and the metadata of the circuits
|
54
|
+
"""
|
55
|
+
if isinstance(circuits, QuantumCircuit):
|
56
|
+
circuits = [circuits]
|
57
|
+
metadata = []
|
58
|
+
for circ in circuits:
|
59
|
+
metadata.append(circ.metadata)
|
60
|
+
if clear_metadata:
|
61
|
+
circ.metadata = {}
|
62
|
+
if isinstance(backend, BackendV2):
|
63
|
+
max_circuits = backend.max_circuits
|
64
|
+
else:
|
65
|
+
raise RuntimeError("Backend version not supported")
|
66
|
+
if max_circuits:
|
67
|
+
jobs = [
|
68
|
+
backend.run(circuits[pos : pos + max_circuits], **run_options)
|
69
|
+
for pos in range(0, len(circuits), max_circuits)
|
70
|
+
]
|
71
|
+
result = [x.result() for x in jobs]
|
72
|
+
else:
|
73
|
+
result = [backend.run(circuits, **run_options).result()]
|
74
|
+
return result, metadata
|
75
|
+
|
76
|
+
|
77
|
+
def _prepare_counts(results: list[Result]):
|
78
|
+
counts = []
|
79
|
+
for res in results:
|
80
|
+
count = res.get_counts()
|
81
|
+
if not isinstance(count, list):
|
82
|
+
count = [count]
|
83
|
+
counts.extend(count)
|
84
|
+
return counts
|
85
|
+
|
86
|
+
|
87
|
+
def _pauli_expval_with_variance(counts: Counts, paulis: PauliList) -> tuple[np.ndarray, np.ndarray]:
|
88
|
+
"""Return array of expval and variance pairs for input Paulis.
|
89
|
+
Note: All non-identity Pauli's are treated as Z-paulis, assuming
|
90
|
+
that basis rotations have been applied to convert them to the
|
91
|
+
diagonal basis.
|
92
|
+
"""
|
93
|
+
# Diag indices
|
94
|
+
size = len(paulis)
|
95
|
+
diag_inds = _paulis2inds(paulis)
|
96
|
+
|
97
|
+
expvals = np.zeros(size, dtype=float)
|
98
|
+
denom = 0 # Total shots for counts dict
|
99
|
+
for bin_outcome, freq in counts.items():
|
100
|
+
split_outcome = bin_outcome.split(" ", 1)[0] if " " in bin_outcome else bin_outcome
|
101
|
+
outcome = int(split_outcome, 2)
|
102
|
+
denom += freq
|
103
|
+
for k in range(size):
|
104
|
+
coeff = (-1) ** _parity(diag_inds[k] & outcome)
|
105
|
+
expvals[k] += freq * coeff
|
106
|
+
|
107
|
+
# Divide by total shots
|
108
|
+
expvals /= denom
|
109
|
+
|
110
|
+
# Compute variance
|
111
|
+
variances = 1 - expvals**2
|
112
|
+
return expvals, variances
|
113
|
+
|
114
|
+
|
115
|
+
def _paulis2inds(paulis: PauliList) -> list[int]:
|
116
|
+
"""Convert PauliList to diagonal integers.
|
117
|
+
These are integer representations of the binary string with a
|
118
|
+
1 where there are Paulis, and 0 where there are identities.
|
119
|
+
"""
|
120
|
+
# Treat Z, X, Y the same
|
121
|
+
nonid = paulis.z | paulis.x
|
122
|
+
|
123
|
+
# bits are packed into uint8 in little endian
|
124
|
+
# e.g., i-th bit corresponds to coefficient 2^i
|
125
|
+
packed_vals = np.packbits(nonid, axis=1, bitorder="little")
|
126
|
+
power_uint8 = 1 << (8 * np.arange(packed_vals.shape[1], dtype=object))
|
127
|
+
inds = packed_vals @ power_uint8
|
128
|
+
return inds.tolist()
|
129
|
+
|
130
|
+
|
131
|
+
def _parity(integer: int) -> int:
|
132
|
+
"""Return the parity of an integer"""
|
133
|
+
return bin(integer).count("1") % 2
|
134
|
+
|
135
|
+
|
136
|
+
@dataclass
|
137
|
+
class Options:
|
138
|
+
"""Options for :class:`~.BackendEstimatorV2`."""
|
139
|
+
|
140
|
+
default_precision: float = 0.015625
|
141
|
+
"""The default precision to use if none are specified in :meth:`~run`.
|
142
|
+
Default: 0.015625 (1 / sqrt(4096)).
|
143
|
+
"""
|
144
|
+
|
145
|
+
abelian_grouping: bool = True
|
146
|
+
"""Whether the observables should be grouped into sets of qubit-wise commuting observables.
|
147
|
+
Default: True.
|
148
|
+
"""
|
149
|
+
|
150
|
+
seed_simulator: int | None = None
|
151
|
+
"""The seed to use in the simulator. If None, a random seed will be used.
|
152
|
+
Default: None.
|
153
|
+
"""
|
154
|
+
|
155
|
+
|
156
|
+
@dataclass
|
157
|
+
class _PreprocessedData:
|
158
|
+
"""Internal data structure to store the results of the preprocessing of a pub."""
|
159
|
+
|
160
|
+
circuits: list[QuantumCircuit]
|
161
|
+
"""The quantum circuits generated by binding parameters of the pub's circuit."""
|
162
|
+
|
163
|
+
parameter_indices: np.ndarray
|
164
|
+
"""The indices of the pub's bindings array broadcast to the shape of the pub."""
|
165
|
+
|
166
|
+
observables: np.ndarray
|
167
|
+
"""The pub's observable array broadcast to the shape of the pub."""
|
168
|
+
|
169
|
+
|
170
|
+
class BackendEstimatorV2(BaseEstimatorV2):
|
171
|
+
r"""Evaluates expectation values for provided quantum circuit and observable combinations.
|
172
|
+
|
173
|
+
The :class:`~.BackendEstimatorV2` class is a generic implementation of the
|
174
|
+
:class:`~.BaseEstimatorV2` interface that is used to wrap a :class:`~.BackendV2`
|
175
|
+
object in the :class:`~.BaseEstimatorV2` API. It
|
176
|
+
facilitates using backends that do not provide a native
|
177
|
+
:class:`~.BaseEstimatorV2` implementation in places that work with
|
178
|
+
:class:`~.BaseEstimatorV2`. However,
|
179
|
+
if you're using a provider that has a native implementation of
|
180
|
+
:class:`~.BaseEstimatorV2`, it is a better choice to leverage that native
|
181
|
+
implementation as it will likely include additional optimizations and be
|
182
|
+
a more efficient implementation. The generic nature of this class
|
183
|
+
precludes doing any provider- or backend-specific optimizations.
|
184
|
+
|
185
|
+
This class does not perform any measurement or gate mitigation, and, presently, is only
|
186
|
+
compatible with Pauli-based observables. More formally, given an observable of the type
|
187
|
+
:math:`O=\sum_{i=1}^Na_iP_i`, where :math:`a_i` is a complex number and :math:`P_i` is a
|
188
|
+
Pauli operator, the estimator calculates the expectation :math:`\mathbb{E}(P_i)` of each
|
189
|
+
:math:`P_i` and finally calculates the expectation value of :math:`O` as
|
190
|
+
:math:`\mathbb{E}(O)=\sum_{i=1}^Na_i\mathbb{E}(P_i)`. The reported ``std`` is calculated
|
191
|
+
as
|
192
|
+
|
193
|
+
.. math::
|
194
|
+
|
195
|
+
\frac{\sum_{i=1}^{n}|a_i|\sqrt{\textrm{Var}\big(P_i\big)}}{\sqrt{N}}\:,
|
196
|
+
|
197
|
+
where :math:`\textrm{Var}(P_i)` is the variance of :math:`P_i`, :math:`N=O(\epsilon^{-2})` is
|
198
|
+
the number of shots, and :math:`\epsilon` is the target precision [1].
|
199
|
+
|
200
|
+
Each tuple of ``(circuit, observables, <optional> parameter values, <optional> precision)``,
|
201
|
+
called an estimator primitive unified bloc (PUB), produces its own array-based result. The
|
202
|
+
:meth:`~.BackendEstimatorV2.run` method can be given a sequence of pubs to run in one call.
|
203
|
+
|
204
|
+
The options for :class:`~.BackendEstimatorV2` consist of the following items.
|
205
|
+
|
206
|
+
* ``default_precision``: The default precision to use if none are specified in :meth:`~run`.
|
207
|
+
Default: 0.015625 (1 / sqrt(4096)).
|
208
|
+
|
209
|
+
* ``abelian_grouping``: Whether the observables should be grouped into sets of qubit-wise
|
210
|
+
commuting observables.
|
211
|
+
Default: True.
|
212
|
+
|
213
|
+
* ``seed_simulator``: The seed to use in the simulator. If None, a random seed will be used.
|
214
|
+
Default: None.
|
215
|
+
|
216
|
+
**Reference:**
|
217
|
+
|
218
|
+
[1] O. Crawford, B. van Straaten, D. Wang, T. Parks, E. Campbell, St. Brierley,
|
219
|
+
Efficient quantum measurement of Pauli operators in the presence of finite sampling error.
|
220
|
+
`Quantum 5, 385 <https://doi.org/10.22331/q-2021-01-20-385>`_
|
221
|
+
"""
|
222
|
+
|
223
|
+
def __init__(
|
224
|
+
self,
|
225
|
+
*,
|
226
|
+
backend: BackendV2,
|
227
|
+
options: dict | None = None,
|
228
|
+
):
|
229
|
+
"""
|
230
|
+
Args:
|
231
|
+
backend: The backend to run the primitive on.
|
232
|
+
options: The options to control the default precision (``default_precision``),
|
233
|
+
the operator grouping (``abelian_grouping``), and
|
234
|
+
the random seed for the simulator (``seed_simulator``).
|
235
|
+
"""
|
236
|
+
self._backend = backend
|
237
|
+
self._options = Options(**options) if options else Options()
|
238
|
+
|
239
|
+
basis = PassManagerConfig.from_backend(backend).basis_gates
|
240
|
+
if isinstance(backend, BackendV2):
|
241
|
+
opt1q = Optimize1qGatesDecomposition(basis=basis, target=backend.target)
|
242
|
+
else:
|
243
|
+
opt1q = Optimize1qGatesDecomposition(basis=basis)
|
244
|
+
self._passmanager = PassManager([opt1q])
|
245
|
+
|
246
|
+
@property
|
247
|
+
def options(self) -> Options:
|
248
|
+
"""Return the options"""
|
249
|
+
return self._options
|
250
|
+
|
251
|
+
@property
|
252
|
+
def backend(self) -> BackendV2:
|
253
|
+
"""Returns the backend which this sampler object based on."""
|
254
|
+
return self._backend
|
255
|
+
|
256
|
+
def run(
|
257
|
+
self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
|
258
|
+
) -> PrimitiveJob[PrimitiveResult[PubResult]]:
|
259
|
+
if precision is None:
|
260
|
+
precision = self._options.default_precision
|
261
|
+
coerced_pubs = [EstimatorPub.coerce(pub, precision) for pub in pubs]
|
262
|
+
self._validate_pubs(coerced_pubs)
|
263
|
+
job = PrimitiveJob(self._run, coerced_pubs)
|
264
|
+
job._submit()
|
265
|
+
return job
|
266
|
+
|
267
|
+
def _validate_pubs(self, pubs: list[EstimatorPub]):
|
268
|
+
for i, pub in enumerate(pubs):
|
269
|
+
if pub.precision <= 0.0:
|
270
|
+
raise ValueError(
|
271
|
+
f"The {i}-th pub has precision less than or equal to 0 ({pub.precision}). ",
|
272
|
+
"But precision should be larger than 0.",
|
273
|
+
)
|
274
|
+
|
275
|
+
def _run(self, pubs: list[EstimatorPub]) -> PrimitiveResult[PubResult]:
|
276
|
+
pub_dict = defaultdict(list)
|
277
|
+
# consolidate pubs with the same number of shots
|
278
|
+
for i, pub in enumerate(pubs):
|
279
|
+
shots = int(math.ceil(1.0 / pub.precision**2))
|
280
|
+
pub_dict[shots].append(i)
|
281
|
+
|
282
|
+
results = [None] * len(pubs)
|
283
|
+
for shots, lst in pub_dict.items():
|
284
|
+
# run pubs with the same number of shots at once
|
285
|
+
pub_results = self._run_pubs([pubs[i] for i in lst], shots)
|
286
|
+
# reconstruct the result of pubs
|
287
|
+
for i, pub_result in zip(lst, pub_results):
|
288
|
+
results[i] = pub_result
|
289
|
+
return PrimitiveResult(results, metadata={"version": 2})
|
290
|
+
|
291
|
+
def _run_pubs(self, pubs: list[EstimatorPub], shots: int) -> list[PubResult]:
|
292
|
+
"""Compute results for pubs that all require the same value of ``shots``."""
|
293
|
+
preprocessed_data = []
|
294
|
+
flat_circuits = []
|
295
|
+
for pub in pubs:
|
296
|
+
data = self._preprocess_pub(pub)
|
297
|
+
preprocessed_data.append(data)
|
298
|
+
flat_circuits.extend(data.circuits)
|
299
|
+
|
300
|
+
run_result, metadata = _run_circuits(
|
301
|
+
flat_circuits, self._backend, shots=shots, seed_simulator=self._options.seed_simulator
|
302
|
+
)
|
303
|
+
counts = _prepare_counts(run_result)
|
304
|
+
|
305
|
+
results = []
|
306
|
+
start = 0
|
307
|
+
for pub, data in zip(pubs, preprocessed_data):
|
308
|
+
end = start + len(data.circuits)
|
309
|
+
expval_map = self._calc_expval_map(counts[start:end], metadata[start:end])
|
310
|
+
start = end
|
311
|
+
results.append(self._postprocess_pub(pub, expval_map, data, shots))
|
312
|
+
return results
|
313
|
+
|
314
|
+
def _preprocess_pub(self, pub: EstimatorPub) -> _PreprocessedData:
|
315
|
+
"""Converts a pub into a list of bound circuits necessary to estimate all its observables.
|
316
|
+
|
317
|
+
The circuits contain metadata explaining which bindings array index they are with respect to,
|
318
|
+
and which measurement basis they are measuring.
|
319
|
+
|
320
|
+
Args:
|
321
|
+
pub: The pub to preprocess.
|
322
|
+
|
323
|
+
Returns:
|
324
|
+
The values ``(circuits, bc_param_ind, bc_obs)`` where ``circuits`` are the circuits to
|
325
|
+
execute on the backend, ``bc_param_ind`` are indices of the pub's bindings array and
|
326
|
+
``bc_obs`` is the observables array, both broadcast to the shape of the pub.
|
327
|
+
"""
|
328
|
+
circuit = pub.circuit
|
329
|
+
observables = pub.observables
|
330
|
+
parameter_values = pub.parameter_values
|
331
|
+
|
332
|
+
# calculate broadcasting of parameters and observables
|
333
|
+
param_shape = parameter_values.shape
|
334
|
+
param_indices = np.fromiter(np.ndindex(param_shape), dtype=object).reshape(param_shape)
|
335
|
+
bc_param_ind, bc_obs = np.broadcast_arrays(param_indices, observables)
|
336
|
+
|
337
|
+
param_obs_map = defaultdict(set)
|
338
|
+
for index in np.ndindex(*bc_param_ind.shape):
|
339
|
+
param_index = bc_param_ind[index]
|
340
|
+
param_obs_map[param_index].update(bc_obs[index])
|
341
|
+
|
342
|
+
bound_circuits = self._bind_and_add_measurements(circuit, parameter_values, param_obs_map)
|
343
|
+
return _PreprocessedData(bound_circuits, bc_param_ind, bc_obs)
|
344
|
+
|
345
|
+
def _postprocess_pub(
|
346
|
+
self, pub: EstimatorPub, expval_map: dict, data: _PreprocessedData, shots: int
|
347
|
+
) -> PubResult:
|
348
|
+
"""Computes expectation values (evs) and standard errors (stds).
|
349
|
+
|
350
|
+
The values are stored in arrays broadcast to the shape of the pub.
|
351
|
+
|
352
|
+
Args:
|
353
|
+
pub: The pub to postprocess.
|
354
|
+
expval_map: The map
|
355
|
+
data: The result data of the preprocessing.
|
356
|
+
shots: The number of shots.
|
357
|
+
|
358
|
+
Returns:
|
359
|
+
The pub result.
|
360
|
+
"""
|
361
|
+
bc_param_ind = data.parameter_indices
|
362
|
+
bc_obs = data.observables
|
363
|
+
evs = np.zeros_like(bc_param_ind, dtype=float)
|
364
|
+
variances = np.zeros_like(bc_param_ind, dtype=float)
|
365
|
+
for index in np.ndindex(*bc_param_ind.shape):
|
366
|
+
param_index = bc_param_ind[index]
|
367
|
+
for pauli, coeff in bc_obs[index].items():
|
368
|
+
expval, variance = expval_map[param_index, pauli]
|
369
|
+
evs[index] += expval * coeff
|
370
|
+
variances[index] += np.abs(coeff) * variance**0.5
|
371
|
+
stds = variances / np.sqrt(shots)
|
372
|
+
data_bin = DataBin(evs=evs, stds=stds, shape=evs.shape)
|
373
|
+
return PubResult(
|
374
|
+
data_bin,
|
375
|
+
metadata={
|
376
|
+
"target_precision": pub.precision,
|
377
|
+
"shots": shots,
|
378
|
+
"circuit_metadata": pub.circuit.metadata,
|
379
|
+
},
|
380
|
+
)
|
381
|
+
|
382
|
+
def _bind_and_add_measurements(
|
383
|
+
self,
|
384
|
+
circuit: QuantumCircuit,
|
385
|
+
parameter_values: BindingsArray,
|
386
|
+
param_obs_map: dict[tuple[int, ...], set[str]],
|
387
|
+
) -> list[QuantumCircuit]:
|
388
|
+
"""Bind the given circuit against each parameter value set, and add necessary measurements
|
389
|
+
to each.
|
390
|
+
|
391
|
+
Args:
|
392
|
+
circuit: The (possibly parametric) circuit of interest.
|
393
|
+
parameter_values: An array of parameter value sets that can be applied to the circuit.
|
394
|
+
param_obs_map: A mapping from locations in ``parameter_values`` to a sets of
|
395
|
+
Pauli terms whose expectation values are required in those locations.
|
396
|
+
|
397
|
+
Returns:
|
398
|
+
A flat list of circuits sufficient to measure all Pauli terms in the ``param_obs_map``
|
399
|
+
values at the corresponding ``parameter_values`` location, where requisite
|
400
|
+
book-keeping is stored as circuit metadata.
|
401
|
+
"""
|
402
|
+
circuits = []
|
403
|
+
for param_index, pauli_strings in param_obs_map.items():
|
404
|
+
bound_circuit = parameter_values.bind(circuit, param_index)
|
405
|
+
# sort pauli_strings so that the order is deterministic
|
406
|
+
meas_paulis = PauliList(sorted(pauli_strings))
|
407
|
+
new_circuits = self._create_measurement_circuits(
|
408
|
+
bound_circuit, meas_paulis, param_index
|
409
|
+
)
|
410
|
+
circuits.extend(new_circuits)
|
411
|
+
return circuits
|
412
|
+
|
413
|
+
def _calc_expval_map(
|
414
|
+
self,
|
415
|
+
counts: list[Counts],
|
416
|
+
metadata: dict,
|
417
|
+
) -> dict[tuple[tuple[int, ...], str], tuple[float, float]]:
|
418
|
+
"""Computes the map of expectation values.
|
419
|
+
|
420
|
+
Args:
|
421
|
+
counts: The counts data.
|
422
|
+
metadata: The metadata.
|
423
|
+
|
424
|
+
Returns:
|
425
|
+
The map of expectation values takes a pair of an index of the bindings array and
|
426
|
+
a pauli string as a key and returns the expectation value of the pauli string
|
427
|
+
with the the pub's circuit bound against the parameter value set in the index of
|
428
|
+
the bindings array.
|
429
|
+
"""
|
430
|
+
expval_map: dict[tuple[tuple[int, ...], str], tuple[float, float]] = {}
|
431
|
+
for count, meta in zip(counts, metadata):
|
432
|
+
orig_paulis = meta["orig_paulis"]
|
433
|
+
meas_paulis = meta["meas_paulis"]
|
434
|
+
param_index = meta["param_index"]
|
435
|
+
expvals, variances = _pauli_expval_with_variance(count, meas_paulis)
|
436
|
+
for pauli, expval, variance in zip(orig_paulis, expvals, variances):
|
437
|
+
expval_map[param_index, pauli.to_label()] = (expval, variance)
|
438
|
+
return expval_map
|
439
|
+
|
440
|
+
def _create_measurement_circuits(
|
441
|
+
self, circuit: QuantumCircuit, observable: PauliList, param_index: tuple[int, ...]
|
442
|
+
) -> list[QuantumCircuit]:
|
443
|
+
"""Generate a list of circuits sufficient to estimate each of the given Paulis.
|
444
|
+
|
445
|
+
Paulis are divided into qubitwise-commuting subsets to reduce the total circuit count.
|
446
|
+
Metadata is attached to circuits in order to remember what each one measures, and
|
447
|
+
where it belongs in the output.
|
448
|
+
|
449
|
+
Args:
|
450
|
+
circuit: The circuit of interest.
|
451
|
+
observable: Which Pauli terms we would like to observe.
|
452
|
+
param_index: Where to put the data we estimate (only passed to metadata).
|
453
|
+
|
454
|
+
Returns:
|
455
|
+
A list of circuits sufficient to estimate each of the given Paulis.
|
456
|
+
"""
|
457
|
+
meas_circuits: list[QuantumCircuit] = []
|
458
|
+
if self._options.abelian_grouping:
|
459
|
+
for obs in observable.group_commuting(qubit_wise=True):
|
460
|
+
basis = Pauli((np.logical_or.reduce(obs.z), np.logical_or.reduce(obs.x)))
|
461
|
+
meas_circuit, indices = _measurement_circuit(circuit.num_qubits, basis)
|
462
|
+
paulis = PauliList.from_symplectic(
|
463
|
+
obs.z[:, indices],
|
464
|
+
obs.x[:, indices],
|
465
|
+
obs.phase,
|
466
|
+
)
|
467
|
+
meas_circuit.metadata = {
|
468
|
+
"orig_paulis": obs,
|
469
|
+
"meas_paulis": paulis,
|
470
|
+
"param_index": param_index,
|
471
|
+
}
|
472
|
+
meas_circuits.append(meas_circuit)
|
473
|
+
else:
|
474
|
+
for basis in observable:
|
475
|
+
meas_circuit, indices = _measurement_circuit(circuit.num_qubits, basis)
|
476
|
+
obs = PauliList(basis)
|
477
|
+
paulis = PauliList.from_symplectic(
|
478
|
+
obs.z[:, indices],
|
479
|
+
obs.x[:, indices],
|
480
|
+
obs.phase,
|
481
|
+
)
|
482
|
+
meas_circuit.metadata = {
|
483
|
+
"orig_paulis": obs,
|
484
|
+
"meas_paulis": paulis,
|
485
|
+
"param_index": param_index,
|
486
|
+
}
|
487
|
+
meas_circuits.append(meas_circuit)
|
488
|
+
|
489
|
+
# unroll basis gates
|
490
|
+
meas_circuits = self._passmanager.run(meas_circuits)
|
491
|
+
|
492
|
+
# combine measurement circuits
|
493
|
+
preprocessed_circuits = []
|
494
|
+
for meas_circuit in meas_circuits:
|
495
|
+
circuit_copy = circuit.copy()
|
496
|
+
# meas_circuit is supposed to have a classical register whose name is different from
|
497
|
+
# those of the transpiled_circuit
|
498
|
+
clbits = meas_circuit.cregs[0]
|
499
|
+
for creg in circuit_copy.cregs:
|
500
|
+
if clbits.name == creg.name:
|
501
|
+
raise QiskitError(
|
502
|
+
"Classical register for measurements conflict with those of the input "
|
503
|
+
f"circuit: {clbits}. "
|
504
|
+
"Recommended to avoid register names starting with '__'."
|
505
|
+
)
|
506
|
+
circuit_copy.add_register(clbits)
|
507
|
+
circuit_copy.compose(meas_circuit, clbits=clbits, inplace=True)
|
508
|
+
circuit_copy.metadata = meas_circuit.metadata
|
509
|
+
preprocessed_circuits.append(circuit_copy)
|
510
|
+
return preprocessed_circuits
|
511
|
+
|
512
|
+
|
513
|
+
def _measurement_circuit(num_qubits: int, pauli: Pauli):
|
514
|
+
# Note: if pauli is I for all qubits, this function generates a circuit to measure only
|
515
|
+
# the first qubit.
|
516
|
+
# Although such an operator can be optimized out by interpreting it as a constant (1),
|
517
|
+
# this optimization requires changes in various methods. So it is left as future work.
|
518
|
+
qubit_indices = np.arange(pauli.num_qubits)[pauli.z | pauli.x]
|
519
|
+
if not np.any(qubit_indices):
|
520
|
+
qubit_indices = [0]
|
521
|
+
meas_circuit = QuantumCircuit(
|
522
|
+
QuantumRegister(num_qubits, "q"), ClassicalRegister(len(qubit_indices), f"__c_{pauli}")
|
523
|
+
)
|
524
|
+
for clbit, i in enumerate(qubit_indices):
|
525
|
+
if pauli.x[i]:
|
526
|
+
if pauli.z[i]:
|
527
|
+
meas_circuit.sdg(i)
|
528
|
+
meas_circuit.h(i)
|
529
|
+
meas_circuit.measure(i, clbit)
|
530
|
+
return meas_circuit, qubit_indices
|