qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.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 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +2 -6
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +13 -60
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +5 -5
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +2 -80
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +154 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -10
- qiskit/result/result.py +28 -126
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- 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/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +1 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +67 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -21,19 +21,60 @@ from typing import Generic, TypeVar
|
|
21
21
|
|
22
22
|
from qiskit.circuit import QuantumCircuit
|
23
23
|
from qiskit.providers import JobV1 as Job
|
24
|
-
from qiskit.utils.deprecation import deprecate_func
|
25
24
|
|
26
25
|
from ..containers.primitive_result import PrimitiveResult
|
27
26
|
from ..containers.sampler_pub import SamplerPubLike
|
28
27
|
from ..containers.sampler_pub_result import SamplerPubResult
|
29
|
-
from . import
|
30
|
-
from .
|
28
|
+
from .validation_v1 import _validate_sampler_args
|
29
|
+
from .base_primitive_v1 import BasePrimitiveV1
|
31
30
|
from .base_primitive_job import BasePrimitiveJob
|
32
31
|
|
33
32
|
T = TypeVar("T", bound=Job)
|
34
33
|
|
35
34
|
|
36
|
-
class
|
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]):
|
37
78
|
r"""Sampler V1 base class
|
38
79
|
|
39
80
|
Base class of Sampler that calculates quasi-probabilities of bitstrings from quantum circuits.
|
@@ -58,7 +99,9 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
|
|
58
99
|
|
59
100
|
.. code-block:: python
|
60
101
|
|
61
|
-
|
102
|
+
# This is a fictional import path.
|
103
|
+
# There are currently no Sampler implementations in Qiskit.
|
104
|
+
from sampler_v1_location import SamplerV1
|
62
105
|
from qiskit import QuantumCircuit
|
63
106
|
from qiskit.circuit.library import RealAmplitudes
|
64
107
|
|
@@ -103,6 +146,8 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
|
|
103
146
|
options: dict | None = None,
|
104
147
|
):
|
105
148
|
"""
|
149
|
+
Initialize ``SamplerV1``.
|
150
|
+
|
106
151
|
Args:
|
107
152
|
options: Default options.
|
108
153
|
"""
|
@@ -129,7 +174,7 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
|
|
129
174
|
ValueError: Invalid arguments are given.
|
130
175
|
"""
|
131
176
|
# Validation
|
132
|
-
circuits, parameter_values =
|
177
|
+
circuits, parameter_values = _validate_sampler_args(circuits, parameter_values)
|
133
178
|
|
134
179
|
# Options
|
135
180
|
run_opts = copy(self.options)
|
@@ -148,57 +193,4 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
|
|
148
193
|
parameter_values: tuple[tuple[float, ...], ...],
|
149
194
|
**run_options,
|
150
195
|
) -> T:
|
151
|
-
raise NotImplementedError("The subclass of
|
152
|
-
|
153
|
-
|
154
|
-
class BaseSampler(BaseSamplerV1[T]):
|
155
|
-
"""DEPRECATED. Type alias for Sampler V1 base class
|
156
|
-
|
157
|
-
See :class:`.BaseSamplerV1` for details.
|
158
|
-
"""
|
159
|
-
|
160
|
-
@deprecate_func(
|
161
|
-
since="1.2",
|
162
|
-
additional_msg="The `BaseSampler` class is a type alias for the `BaseSamplerV1` "
|
163
|
-
"interface that has been deprecated in favor of explicitly versioned interface classes. "
|
164
|
-
"It is recommended to migrate all implementations to use `BaseSamplerV2`. "
|
165
|
-
"However, for implementations incompatible with `BaseSamplerV2`, `BaseSampler` can "
|
166
|
-
"be replaced with the explicitly versioned `BaseSamplerV1` class.",
|
167
|
-
)
|
168
|
-
def __init__(
|
169
|
-
self,
|
170
|
-
*,
|
171
|
-
options: dict | None = None,
|
172
|
-
):
|
173
|
-
"""
|
174
|
-
Args:
|
175
|
-
options: Default options.
|
176
|
-
"""
|
177
|
-
super().__init__(options=options)
|
178
|
-
|
179
|
-
|
180
|
-
class BaseSamplerV2(ABC):
|
181
|
-
r"""Sampler V2 base class.
|
182
|
-
|
183
|
-
A Sampler returns samples of quantum circuit outputs.
|
184
|
-
|
185
|
-
All sampler implementations must implement default value for the ``shots`` in the
|
186
|
-
:meth:`.run` method if ``None`` is given both as a ``kwarg`` and in all of the pubs.
|
187
|
-
"""
|
188
|
-
|
189
|
-
@abstractmethod
|
190
|
-
def run(
|
191
|
-
self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
|
192
|
-
) -> BasePrimitiveJob[PrimitiveResult[SamplerPubResult]]:
|
193
|
-
"""Run and collect samples from each pub.
|
194
|
-
|
195
|
-
Args:
|
196
|
-
pubs: An iterable of pub-like objects. For example, a list of circuits
|
197
|
-
or tuples ``(circuit, parameter_values)``.
|
198
|
-
shots: The total number of shots to sample for each sampler pub that does
|
199
|
-
not specify its own shots. If ``None``, the primitive's default
|
200
|
-
shots value will be used, which can vary by implementation.
|
201
|
-
|
202
|
-
Returns:
|
203
|
-
The job object of Sampler's result.
|
204
|
-
"""
|
196
|
+
raise NotImplementedError("The subclass of BaseSamplerV1 must implement `_run` method.")
|
@@ -18,14 +18,14 @@ from __future__ import annotations
|
|
18
18
|
from dataclasses import dataclass
|
19
19
|
from typing import TYPE_CHECKING, Any
|
20
20
|
|
21
|
-
from .
|
21
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
22
22
|
|
23
23
|
if TYPE_CHECKING:
|
24
24
|
import numpy as np
|
25
25
|
|
26
26
|
|
27
27
|
@dataclass(frozen=True)
|
28
|
-
class EstimatorResult(
|
28
|
+
class EstimatorResult(_BasePrimitiveResultV1):
|
29
29
|
"""Result of Estimator V1.
|
30
30
|
|
31
31
|
.. code-block:: python
|
@@ -20,11 +20,11 @@ from typing import Any
|
|
20
20
|
|
21
21
|
from qiskit.result import QuasiDistribution
|
22
22
|
|
23
|
-
from .
|
23
|
+
from .base_result_v1 import _BasePrimitiveResultV1
|
24
24
|
|
25
25
|
|
26
26
|
@dataclass(frozen=True)
|
27
|
-
class SamplerResult(
|
27
|
+
class SamplerResult(_BasePrimitiveResultV1):
|
28
28
|
"""Result of Sampler V1.
|
29
29
|
|
30
30
|
.. code-block:: python
|
@@ -10,34 +10,30 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Primitive validation methods.
|
13
|
+
"""Primitive V1 validation methods.
|
14
14
|
|
15
15
|
Note that these are not intended to be part of the public API of base primitives
|
16
|
-
but are here for
|
16
|
+
but are here for backward compatibility with BaseSamplerV1 and BaseEstimatorV1 classes.
|
17
17
|
"""
|
18
18
|
|
19
19
|
from __future__ import annotations
|
20
20
|
|
21
21
|
from collections.abc import Sequence
|
22
|
-
import typing
|
23
22
|
import numpy as np
|
24
23
|
|
25
24
|
from qiskit.circuit import QuantumCircuit, ControlFlowOp, Measure
|
26
|
-
from qiskit.
|
25
|
+
from qiskit.exceptions import QiskitError
|
26
|
+
from qiskit.quantum_info import PauliList, SparsePauliOp
|
27
27
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
28
|
-
|
29
|
-
from ..utils import init_observable
|
30
|
-
|
31
|
-
if typing.TYPE_CHECKING:
|
32
|
-
from qiskit.opflow import PauliSumOp
|
28
|
+
from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
|
33
29
|
|
34
30
|
|
35
31
|
def _validate_estimator_args(
|
36
32
|
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
37
|
-
observables: Sequence[BaseOperator |
|
33
|
+
observables: Sequence[BaseOperator | str] | BaseOperator | str,
|
38
34
|
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
|
39
35
|
) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
|
40
|
-
"""Validate run arguments for
|
36
|
+
"""Validate run arguments for BaseEstimatorV1.
|
41
37
|
|
42
38
|
Args:
|
43
39
|
circuits: one or more circuit objects.
|
@@ -70,7 +66,7 @@ def _validate_sampler_args(
|
|
70
66
|
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
71
67
|
parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
|
72
68
|
) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
|
73
|
-
"""Validate run arguments for
|
69
|
+
"""Validate run arguments for BaseSamplerV1.
|
74
70
|
|
75
71
|
Args:
|
76
72
|
circuits: one or more circuit objects.
|
@@ -96,6 +92,29 @@ def _validate_sampler_args(
|
|
96
92
|
return circuits, parameter_values
|
97
93
|
|
98
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
|
+
|
99
118
|
def _validate_circuits(
|
100
119
|
circuits: Sequence[QuantumCircuit] | QuantumCircuit,
|
101
120
|
requires_measure: bool = False,
|
@@ -166,13 +185,13 @@ def _validate_parameter_values(
|
|
166
185
|
|
167
186
|
|
168
187
|
def _validate_observables(
|
169
|
-
observables: Sequence[BaseOperator |
|
188
|
+
observables: Sequence[BaseOperator | str] | BaseOperator | str,
|
170
189
|
) -> tuple[SparsePauliOp, ...]:
|
171
190
|
if isinstance(observables, str) or not isinstance(observables, Sequence):
|
172
191
|
observables = (observables,)
|
173
192
|
if len(observables) == 0:
|
174
193
|
raise ValueError("No observables were provided.")
|
175
|
-
return tuple(
|
194
|
+
return tuple(_init_observable(obs) for obs in observables)
|
176
195
|
|
177
196
|
|
178
197
|
def _cross_validate_circuits_parameter_values(
|
@@ -192,7 +211,7 @@ def _cross_validate_circuits_parameter_values(
|
|
192
211
|
|
193
212
|
|
194
213
|
def _cross_validate_circuits_observables(
|
195
|
-
circuits: tuple[QuantumCircuit, ...], observables: tuple[BaseOperator
|
214
|
+
circuits: tuple[QuantumCircuit, ...], observables: tuple[BaseOperator, ...]
|
196
215
|
) -> None:
|
197
216
|
if len(circuits) != len(observables):
|
198
217
|
raise ValueError(
|
@@ -67,7 +67,9 @@ class BindingsArray(ShapedMixin):
|
|
67
67
|
allows flexibility about whether values for different parameters are stored in one big array, or
|
68
68
|
across several smaller arrays.
|
69
69
|
|
70
|
-
..
|
70
|
+
.. plot::
|
71
|
+
:include-source:
|
72
|
+
:nofigs:
|
71
73
|
|
72
74
|
# 0-d array (i.e. only one binding)
|
73
75
|
BindingsArray({"a": 4, ("b", "c"): [5, 6]})
|
@@ -314,6 +314,29 @@ class BitArray(ShapedMixin):
|
|
314
314
|
array = np.frombuffer(data, dtype=np.uint8, count=len(data))
|
315
315
|
return BitArray(array.reshape(-1, num_bytes), num_bits)
|
316
316
|
|
317
|
+
def to_bool_array(self, order: Literal["big", "little"] = "big") -> NDArray[np.bool_]:
|
318
|
+
"""Convert this :class:`~BitArray` to a boolean array.
|
319
|
+
|
320
|
+
Args:
|
321
|
+
order: One of ``"big"`` or ``"little"``, respectively indicating whether the most significant
|
322
|
+
bit or the least significant bit of each bitstring should be placed at ``[..., 0]``.
|
323
|
+
|
324
|
+
Returns:
|
325
|
+
A NumPy array of bools.
|
326
|
+
|
327
|
+
Raises:
|
328
|
+
ValueError: If the order is not one of ``"big"`` or ``"little"``.
|
329
|
+
"""
|
330
|
+
if order not in ("big", "little"):
|
331
|
+
raise ValueError(
|
332
|
+
f"Invalid value for order: '{order}'. Valid values are 'big' and 'little'."
|
333
|
+
)
|
334
|
+
|
335
|
+
arr = np.unpackbits(self.array, axis=-1)[..., -self.num_bits :]
|
336
|
+
if order == "little":
|
337
|
+
arr = arr[..., ::-1]
|
338
|
+
return arr.astype(np.bool_)
|
339
|
+
|
317
340
|
def get_counts(self, loc: int | tuple[int, ...] | None = None) -> dict[str, int]:
|
318
341
|
"""Return a counts dictionary with bitstring keys.
|
319
342
|
|
@@ -97,8 +97,25 @@ class ObservablesArray(ShapedMixin):
|
|
97
97
|
array = np.array2string(self._array, prefix=prefix, suffix=suffix, threshold=50)
|
98
98
|
return prefix + array + suffix
|
99
99
|
|
100
|
-
def tolist(self) -> list:
|
101
|
-
"""Convert to a nested list
|
100
|
+
def tolist(self) -> list | ObservableLike:
|
101
|
+
"""Convert to a nested list.
|
102
|
+
|
103
|
+
Similar to Numpy's ``tolist`` method, the level of nesting
|
104
|
+
depends on the dimension of the observables array. In the
|
105
|
+
case of dimension 0 the method returns a single observable
|
106
|
+
(``dict`` in the case of a weighted sum of Paulis) instead of a list.
|
107
|
+
|
108
|
+
Examples::
|
109
|
+
Return values for a one-element list vs one element:
|
110
|
+
|
111
|
+
>>> from qiskit.primitives.containers.observables_array import ObservablesArray
|
112
|
+
>>> oa = ObservablesArray.coerce(["Z"])
|
113
|
+
>>> print(type(oa.tolist()))
|
114
|
+
<class 'list'>
|
115
|
+
>>> oa = ObservablesArray.coerce("Z")
|
116
|
+
>>> print(type(oa.tolist()))
|
117
|
+
<class 'dict'>
|
118
|
+
"""
|
102
119
|
return self._array.tolist()
|
103
120
|
|
104
121
|
def __array__(self, dtype=None, copy=None):
|
@@ -23,11 +23,10 @@ import numpy as np
|
|
23
23
|
from numpy.typing import NDArray
|
24
24
|
|
25
25
|
from qiskit import ClassicalRegister, QiskitError, QuantumCircuit
|
26
|
-
from qiskit.circuit import ControlFlowOp
|
27
26
|
from qiskit.quantum_info import Statevector
|
28
27
|
|
29
28
|
from .base import BaseSamplerV2
|
30
|
-
from .base.
|
29
|
+
from .base.validation_v1 import _has_measure
|
31
30
|
from .containers import (
|
32
31
|
BitArray,
|
33
32
|
DataBin,
|
@@ -64,7 +63,9 @@ class StatevectorSampler(BaseSamplerV2):
|
|
64
63
|
primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
|
65
64
|
be given many pubs at once.
|
66
65
|
|
67
|
-
..
|
66
|
+
.. plot::
|
67
|
+
:include-source:
|
68
|
+
:nofigs:
|
68
69
|
|
69
70
|
from qiskit.circuit import (
|
70
71
|
Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
|
@@ -210,7 +211,7 @@ def _preprocess_circuit(circuit: QuantumCircuit):
|
|
210
211
|
qargs_index = {v: k for k, v in enumerate(qargs)}
|
211
212
|
circuit = circuit.remove_final_measurements(inplace=False)
|
212
213
|
if _has_control_flow(circuit):
|
213
|
-
raise QiskitError("StatevectorSampler cannot handle ControlFlowOp
|
214
|
+
raise QiskitError("StatevectorSampler cannot handle ControlFlowOp")
|
214
215
|
if _has_measure(circuit):
|
215
216
|
raise QiskitError("StatevectorSampler cannot handle mid-circuit measurements")
|
216
217
|
# num_qubits is used as sentinel to fill 0 in _samples_to_packed_array
|
@@ -286,7 +287,4 @@ def _final_measurement_mapping(circuit: QuantumCircuit) -> dict[tuple[ClassicalR
|
|
286
287
|
|
287
288
|
|
288
289
|
def _has_control_flow(circuit: QuantumCircuit) -> bool:
|
289
|
-
return any(
|
290
|
-
isinstance((op := instruction.operation), ControlFlowOp) or op._condition
|
291
|
-
for instruction in circuit
|
292
|
-
)
|
290
|
+
return any(instruction.is_control_flow() for instruction in circuit)
|
qiskit/primitives/utils.py
CHANGED
@@ -14,185 +14,30 @@ Utility functions for primitives
|
|
14
14
|
"""
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
from collections.abc import Iterable
|
18
|
-
|
19
17
|
import numpy as np
|
20
18
|
|
21
19
|
from qiskit.circuit import Instruction, QuantumCircuit
|
22
|
-
from qiskit.
|
23
|
-
from qiskit.circuit.library.data_preparation import Initialize
|
24
|
-
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.quantum_info import PauliList, SparsePauliOp, Statevector
|
26
|
-
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
27
|
-
from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
|
28
|
-
from qiskit.utils.deprecation import deprecate_func
|
29
|
-
|
30
|
-
|
31
|
-
@deprecate_func(
|
32
|
-
since="1.2",
|
33
|
-
additional_msg="To initialize a circuit from a ``Statevector`` instance, "
|
34
|
-
+ "use ``QuantumCircuit.initialize`` instead.",
|
35
|
-
)
|
36
|
-
def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
|
37
|
-
"""Initialize state by converting the input to a quantum circuit.
|
38
|
-
|
39
|
-
Args:
|
40
|
-
state: The state as quantum circuit or statevector.
|
41
|
-
|
42
|
-
Returns:
|
43
|
-
The state as quantum circuit.
|
44
|
-
"""
|
45
|
-
if isinstance(state, QuantumCircuit):
|
46
|
-
return state
|
47
|
-
if not isinstance(state, Statevector):
|
48
|
-
state = Statevector(state)
|
49
|
-
qc = QuantumCircuit(state.num_qubits)
|
50
|
-
qc.append(Initialize(state), qargs=range(state.num_qubits))
|
51
|
-
return qc
|
52
|
-
|
53
|
-
|
54
|
-
@deprecate_func(
|
55
|
-
since="1.2",
|
56
|
-
additional_msg="Use the constructor of ``SparsePauliOp`` instead.",
|
57
|
-
)
|
58
|
-
def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
|
59
|
-
"""Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
|
60
|
-
|
61
|
-
Args:
|
62
|
-
observable: The observable.
|
63
|
-
|
64
|
-
Returns:
|
65
|
-
The observable as :class:`~qiskit.quantum_info.SparsePauliOp`.
|
66
|
-
|
67
|
-
Raises:
|
68
|
-
QiskitError: when observable type cannot be converted to SparsePauliOp.
|
69
|
-
"""
|
70
|
-
|
71
|
-
if isinstance(observable, SparsePauliOp):
|
72
|
-
return observable
|
73
|
-
elif isinstance(observable, BaseOperator) and not isinstance(observable, BasePauli):
|
74
|
-
raise QiskitError(f"observable type not supported: {type(observable)}")
|
75
|
-
else:
|
76
|
-
if isinstance(observable, PauliList):
|
77
|
-
raise QiskitError(f"observable type not supported: {type(observable)}")
|
78
|
-
return SparsePauliOp(observable)
|
79
|
-
|
80
|
-
|
81
|
-
@deprecate_func(
|
82
|
-
since="1.2",
|
83
|
-
additional_msg="Use ``QuantumCircuit.layout`` and ``SparsePauliOp.apply_layout`` "
|
84
|
-
+ "to adjust an operator for a layout. Otherwise, use ``mthree.utils.final_measurement_mapping``. "
|
85
|
-
+ "See <https://qiskit.github.io/qiskit-addon-mthree/apidocs/utils> for details.",
|
86
|
-
)
|
87
|
-
def final_measurement_mapping(circuit: QuantumCircuit) -> dict[int, int]:
|
88
|
-
"""Return the final measurement mapping for the circuit.
|
20
|
+
from qiskit.quantum_info import Statevector
|
89
21
|
|
90
|
-
Dict keys label measured qubits, whereas the values indicate the
|
91
|
-
classical bit onto which that qubits measurement result is stored.
|
92
22
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
Mapping of qubits to classical bits for final measurements.
|
98
|
-
"""
|
99
|
-
active_qubits = list(range(circuit.num_qubits))
|
100
|
-
active_cbits = list(range(circuit.num_clbits))
|
101
|
-
|
102
|
-
# Find final measurements starting in back
|
103
|
-
mapping = {}
|
104
|
-
for item in circuit._data[::-1]:
|
105
|
-
if item.operation.name == "measure":
|
106
|
-
cbit = circuit.find_bit(item.clbits[0]).index
|
107
|
-
qbit = circuit.find_bit(item.qubits[0]).index
|
108
|
-
if cbit in active_cbits and qbit in active_qubits:
|
109
|
-
mapping[qbit] = cbit
|
110
|
-
active_cbits.remove(cbit)
|
111
|
-
active_qubits.remove(qbit)
|
112
|
-
elif item.operation.name not in ["barrier", "delay"]:
|
113
|
-
for qq in item.qubits:
|
114
|
-
_temp_qubit = circuit.find_bit(qq).index
|
115
|
-
if _temp_qubit in active_qubits:
|
116
|
-
active_qubits.remove(_temp_qubit)
|
117
|
-
|
118
|
-
if not active_cbits or not active_qubits:
|
119
|
-
break
|
120
|
-
|
121
|
-
# Sort so that classical bits are in numeric order low->high.
|
122
|
-
mapping = dict(sorted(mapping.items(), key=lambda item: item[1]))
|
123
|
-
return mapping
|
124
|
-
|
125
|
-
|
126
|
-
def _bits_key(bits: tuple[Bit, ...], circuit: QuantumCircuit) -> tuple:
|
127
|
-
return tuple(
|
128
|
-
(
|
129
|
-
circuit.find_bit(bit).index,
|
130
|
-
tuple((reg[0].size, reg[0].name, reg[1]) for reg in circuit.find_bit(bit).registers),
|
131
|
-
)
|
132
|
-
for bit in bits
|
133
|
-
)
|
134
|
-
|
135
|
-
|
136
|
-
def _format_params(param):
|
137
|
-
if isinstance(param, np.ndarray):
|
138
|
-
return param.data.tobytes()
|
139
|
-
elif isinstance(param, QuantumCircuit):
|
140
|
-
return _circuit_key(param)
|
141
|
-
elif isinstance(param, Iterable):
|
142
|
-
return tuple(param)
|
143
|
-
return param
|
144
|
-
|
145
|
-
|
146
|
-
def _circuit_key(circuit: QuantumCircuit, functional: bool = True) -> tuple:
|
147
|
-
"""Private key function for QuantumCircuit.
|
148
|
-
|
149
|
-
This is the workaround until :meth:`QuantumCircuit.__hash__` will be introduced.
|
150
|
-
If key collision is found, please add elements to avoid it.
|
151
|
-
|
152
|
-
Args:
|
153
|
-
circuit: Input quantum circuit.
|
154
|
-
functional: If True, the returned key only includes functional data (i.e. execution related).
|
23
|
+
def _statevector_from_circuit(
|
24
|
+
circuit: QuantumCircuit, rng: np.random.Generator | None
|
25
|
+
) -> Statevector:
|
26
|
+
"""Generate a statevector from a circuit. Used in StatevectorEstimator class.
|
155
27
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
functional_key: tuple = (
|
160
|
-
circuit.num_qubits,
|
161
|
-
circuit.num_clbits,
|
162
|
-
circuit.num_parameters,
|
163
|
-
tuple( # circuit.data
|
164
|
-
(
|
165
|
-
_bits_key(data.qubits, circuit), # qubits
|
166
|
-
_bits_key(data.clbits, circuit), # clbits
|
167
|
-
data.operation.name, # operation.name
|
168
|
-
tuple(_format_params(param) for param in data.operation.params), # operation.params
|
169
|
-
)
|
170
|
-
for data in circuit.data
|
171
|
-
),
|
172
|
-
None if circuit._op_start_times is None else tuple(circuit._op_start_times),
|
173
|
-
)
|
174
|
-
if functional:
|
175
|
-
return functional_key
|
176
|
-
return (
|
177
|
-
circuit.name,
|
178
|
-
*functional_key,
|
179
|
-
)
|
28
|
+
If the input circuit includes any resets for a some subsystem,
|
29
|
+
:meth:`.Statevector.reset` behaves in a stochastic way in :meth:`.Statevector.evolve`.
|
30
|
+
This function sets a random number generator to be reproducible.
|
180
31
|
|
32
|
+
See :meth:`.Statevector.reset` for details.
|
181
33
|
|
182
|
-
def _observable_key(observable: SparsePauliOp) -> tuple:
|
183
|
-
"""Private key function for SparsePauliOp.
|
184
34
|
Args:
|
185
|
-
|
186
|
-
|
187
|
-
Returns:
|
188
|
-
Key for observables.
|
35
|
+
circuit: The quantum circuit.
|
36
|
+
seed: The random number generator or None.
|
189
37
|
"""
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
observable.paulis.phase.tobytes(),
|
194
|
-
observable.coeffs.tobytes(),
|
195
|
-
)
|
38
|
+
sv = Statevector.from_int(0, 2**circuit.num_qubits)
|
39
|
+
sv.seed(rng)
|
40
|
+
return sv.evolve(bound_circuit_to_instruction(circuit))
|
196
41
|
|
197
42
|
|
198
43
|
def bound_circuit_to_instruction(circuit: QuantumCircuit) -> Instruction:
|
@@ -225,23 +70,3 @@ def bound_circuit_to_instruction(circuit: QuantumCircuit) -> Instruction:
|
|
225
70
|
)
|
226
71
|
inst.definition = circuit
|
227
72
|
return inst
|
228
|
-
|
229
|
-
|
230
|
-
def _statevector_from_circuit(
|
231
|
-
circuit: QuantumCircuit, rng: np.random.Generator | None
|
232
|
-
) -> Statevector:
|
233
|
-
"""Generate a statevector from a circuit
|
234
|
-
|
235
|
-
If the input circuit includes any resets for a some subsystem,
|
236
|
-
:meth:`.Statevector.reset` behaves in a stochastic way in :meth:`.Statevector.evolve`.
|
237
|
-
This function sets a random number generator to be reproducible.
|
238
|
-
|
239
|
-
See :meth:`.Statevector.reset` for details.
|
240
|
-
|
241
|
-
Args:
|
242
|
-
circuit: The quantum circuit.
|
243
|
-
seed: The random number generator or None.
|
244
|
-
"""
|
245
|
-
sv = Statevector.from_int(0, 2**circuit.num_qubits)
|
246
|
-
sv.seed(rng)
|
247
|
-
return sv.evolve(bound_circuit_to_instruction(circuit))
|