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
@@ -1,222 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2022.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Sampler V1 implementation for an arbitrary Backend object."""
|
14
|
-
|
15
|
-
from __future__ import annotations
|
16
|
-
|
17
|
-
import math
|
18
|
-
from collections.abc import Sequence
|
19
|
-
from typing import Any
|
20
|
-
|
21
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
-
from qiskit.providers.backend import BackendV1, BackendV2
|
23
|
-
from qiskit.providers.options import Options
|
24
|
-
from qiskit.result import QuasiDistribution, Result
|
25
|
-
from qiskit.transpiler.passmanager import PassManager
|
26
|
-
from qiskit.utils.deprecation import deprecate_func
|
27
|
-
|
28
|
-
from .backend_estimator import _prepare_counts, _run_circuits
|
29
|
-
from .base import BaseSampler, SamplerResult
|
30
|
-
from .primitive_job import PrimitiveJob
|
31
|
-
from .utils import _circuit_key
|
32
|
-
|
33
|
-
|
34
|
-
class BackendSampler(BaseSampler[PrimitiveJob[SamplerResult]]):
|
35
|
-
"""A :class:`~.BaseSampler` (V1) implementation that provides a wrapper for
|
36
|
-
leveraging the Sampler V1 interface from any backend.
|
37
|
-
|
38
|
-
This class provides a sampler interface from any backend and doesn't do
|
39
|
-
any measurement mitigation, it just computes the probability distribution
|
40
|
-
from the counts. It facilitates using backends that do not provide a
|
41
|
-
native :class:`~.BaseSampler` V1 implementation in places that work with
|
42
|
-
:class:`~.BaseSampler` V1.
|
43
|
-
However, if you're using a provider that has a native implementation of
|
44
|
-
:class:`~.BaseSamplerV1` ( :class:`~.BaseSampler`) or
|
45
|
-
:class:`~.BaseESamplerV2`, it is a better
|
46
|
-
choice to leverage that native implementation as it will likely include
|
47
|
-
additional optimizations and be a more efficient implementation.
|
48
|
-
The generic nature of this class precludes doing any provider- or
|
49
|
-
backend-specific optimizations.
|
50
|
-
"""
|
51
|
-
|
52
|
-
@deprecate_func(
|
53
|
-
since="1.2",
|
54
|
-
additional_msg="All implementations of the `BaseSamplerV1` interface "
|
55
|
-
"have been deprecated in favor of their V2 counterparts. "
|
56
|
-
"The V2 alternative for the `BackendSampler` class is `BackendSamplerV2`.",
|
57
|
-
)
|
58
|
-
def __init__(
|
59
|
-
self,
|
60
|
-
backend: BackendV1 | BackendV2,
|
61
|
-
options: dict | None = None,
|
62
|
-
bound_pass_manager: PassManager | None = None,
|
63
|
-
skip_transpilation: bool = False,
|
64
|
-
):
|
65
|
-
"""Initialize a new BackendSampler (V1) instance
|
66
|
-
|
67
|
-
Args:
|
68
|
-
backend: (required) the backend to run the sampler primitive on
|
69
|
-
options: Default options.
|
70
|
-
bound_pass_manager: An optional pass manager to run after
|
71
|
-
parameter binding.
|
72
|
-
skip_transpilation: If this is set to True the internal compilation
|
73
|
-
of the input circuits is skipped and the circuit objects
|
74
|
-
will be directly executed when this objected is called.
|
75
|
-
Raises:
|
76
|
-
ValueError: If backend is not provided
|
77
|
-
"""
|
78
|
-
|
79
|
-
super().__init__(options=options)
|
80
|
-
self._circuits = []
|
81
|
-
self._parameters = []
|
82
|
-
self._backend = backend
|
83
|
-
self._transpile_options = Options()
|
84
|
-
self._bound_pass_manager = bound_pass_manager
|
85
|
-
self._preprocessed_circuits: list[QuantumCircuit] | None = None
|
86
|
-
self._transpiled_circuits: list[QuantumCircuit] = []
|
87
|
-
self._skip_transpilation = skip_transpilation
|
88
|
-
self._circuit_ids = {}
|
89
|
-
|
90
|
-
@property
|
91
|
-
def preprocessed_circuits(self) -> list[QuantumCircuit]:
|
92
|
-
"""
|
93
|
-
Preprocessed quantum circuits produced by preprocessing
|
94
|
-
Returns:
|
95
|
-
List of the transpiled quantum circuit
|
96
|
-
Raises:
|
97
|
-
QiskitError: if the instance has been closed.
|
98
|
-
"""
|
99
|
-
return list(self._circuits)
|
100
|
-
|
101
|
-
@property
|
102
|
-
def transpiled_circuits(self) -> list[QuantumCircuit]:
|
103
|
-
"""
|
104
|
-
Transpiled quantum circuits.
|
105
|
-
Returns:
|
106
|
-
List of the transpiled quantum circuit
|
107
|
-
Raises:
|
108
|
-
QiskitError: if the instance has been closed.
|
109
|
-
"""
|
110
|
-
if self._skip_transpilation:
|
111
|
-
self._transpiled_circuits = list(self._circuits)
|
112
|
-
elif len(self._transpiled_circuits) < len(self._circuits):
|
113
|
-
# transpile only circuits that are not transpiled yet
|
114
|
-
self._transpile()
|
115
|
-
return self._transpiled_circuits
|
116
|
-
|
117
|
-
@property
|
118
|
-
def backend(self) -> BackendV1 | BackendV2:
|
119
|
-
"""
|
120
|
-
Returns:
|
121
|
-
The backend which this sampler object based on
|
122
|
-
"""
|
123
|
-
return self._backend
|
124
|
-
|
125
|
-
@property
|
126
|
-
def transpile_options(self) -> Options:
|
127
|
-
"""Return the transpiler options for transpiling the circuits."""
|
128
|
-
return self._transpile_options
|
129
|
-
|
130
|
-
def set_transpile_options(self, **fields):
|
131
|
-
"""Set the transpiler options for transpiler.
|
132
|
-
Args:
|
133
|
-
**fields: The fields to update the options.
|
134
|
-
Returns:
|
135
|
-
self.
|
136
|
-
Raises:
|
137
|
-
QiskitError: if the instance has been closed.
|
138
|
-
"""
|
139
|
-
self._transpile_options.update_options(**fields)
|
140
|
-
|
141
|
-
def _call(
|
142
|
-
self,
|
143
|
-
circuits: Sequence[int],
|
144
|
-
parameter_values: Sequence[Sequence[float]],
|
145
|
-
**run_options,
|
146
|
-
) -> SamplerResult:
|
147
|
-
|
148
|
-
# This line does the actual transpilation
|
149
|
-
transpiled_circuits = self.transpiled_circuits
|
150
|
-
bound_circuits = [
|
151
|
-
(
|
152
|
-
transpiled_circuits[i]
|
153
|
-
if len(value) == 0
|
154
|
-
else transpiled_circuits[i].assign_parameters(
|
155
|
-
(dict(zip(self._parameters[i], value)))
|
156
|
-
)
|
157
|
-
)
|
158
|
-
for i, value in zip(circuits, parameter_values)
|
159
|
-
]
|
160
|
-
bound_circuits = self._bound_pass_manager_run(bound_circuits)
|
161
|
-
# Run
|
162
|
-
result, _metadata = _run_circuits(bound_circuits, self._backend, **run_options)
|
163
|
-
return self._postprocessing(result, bound_circuits)
|
164
|
-
|
165
|
-
def _postprocessing(
|
166
|
-
self, result: list[Result], circuits: list[QuantumCircuit]
|
167
|
-
) -> SamplerResult:
|
168
|
-
counts = _prepare_counts(result)
|
169
|
-
shots = sum(counts[0].values())
|
170
|
-
|
171
|
-
probabilities = []
|
172
|
-
metadata: list[dict[str, Any]] = [{} for _ in range(len(circuits))]
|
173
|
-
for count in counts:
|
174
|
-
prob_dist = {k: v / shots for k, v in count.items()}
|
175
|
-
probabilities.append(
|
176
|
-
QuasiDistribution(prob_dist, shots=shots, stddev_upper_bound=math.sqrt(1 / shots))
|
177
|
-
)
|
178
|
-
for metadatum in metadata:
|
179
|
-
metadatum["shots"] = shots
|
180
|
-
|
181
|
-
return SamplerResult(probabilities, metadata)
|
182
|
-
|
183
|
-
def _transpile(self):
|
184
|
-
from qiskit.compiler import transpile
|
185
|
-
|
186
|
-
start = len(self._transpiled_circuits)
|
187
|
-
self._transpiled_circuits.extend(
|
188
|
-
transpile( # pylint:disable=unexpected-keyword-arg
|
189
|
-
self.preprocessed_circuits[start:],
|
190
|
-
self.backend,
|
191
|
-
**self.transpile_options.__dict__,
|
192
|
-
),
|
193
|
-
)
|
194
|
-
|
195
|
-
def _bound_pass_manager_run(self, circuits):
|
196
|
-
if self._bound_pass_manager is None:
|
197
|
-
return circuits
|
198
|
-
else:
|
199
|
-
output = self._bound_pass_manager.run(circuits)
|
200
|
-
if not isinstance(output, list):
|
201
|
-
output = [output]
|
202
|
-
return output
|
203
|
-
|
204
|
-
def _run(
|
205
|
-
self,
|
206
|
-
circuits: tuple[QuantumCircuit, ...],
|
207
|
-
parameter_values: tuple[tuple[float, ...], ...],
|
208
|
-
**run_options,
|
209
|
-
):
|
210
|
-
circuit_indices = []
|
211
|
-
for circuit in circuits:
|
212
|
-
index = self._circuit_ids.get(_circuit_key(circuit))
|
213
|
-
if index is not None:
|
214
|
-
circuit_indices.append(index)
|
215
|
-
else:
|
216
|
-
circuit_indices.append(len(self._circuits))
|
217
|
-
self._circuit_ids[_circuit_key(circuit)] = len(self._circuits)
|
218
|
-
self._circuits.append(circuit)
|
219
|
-
self._parameters.append(circuit.parameters)
|
220
|
-
job = PrimitiveJob(self._call, circuit_indices, parameter_values, **run_options)
|
221
|
-
job._submit()
|
222
|
-
return job
|
qiskit/primitives/estimator.py
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2022.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
"""
|
13
|
-
Estimator V1 reference implementation
|
14
|
-
"""
|
15
|
-
|
16
|
-
from __future__ import annotations
|
17
|
-
|
18
|
-
from collections.abc import Sequence
|
19
|
-
from typing import Any
|
20
|
-
|
21
|
-
import numpy as np
|
22
|
-
|
23
|
-
from qiskit.circuit import QuantumCircuit
|
24
|
-
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
26
|
-
from qiskit.utils.deprecation import deprecate_func
|
27
|
-
|
28
|
-
from .base import BaseEstimator, EstimatorResult
|
29
|
-
from .primitive_job import PrimitiveJob
|
30
|
-
from .utils import (
|
31
|
-
_circuit_key,
|
32
|
-
_observable_key,
|
33
|
-
_statevector_from_circuit,
|
34
|
-
init_observable,
|
35
|
-
)
|
36
|
-
|
37
|
-
|
38
|
-
class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
|
39
|
-
"""
|
40
|
-
Reference implementation of :class:`BaseEstimator` (V1).
|
41
|
-
|
42
|
-
:Run Options:
|
43
|
-
|
44
|
-
- **shots** (None or int) --
|
45
|
-
The number of shots. If None, it calculates the expectation values
|
46
|
-
with full state vector simulation.
|
47
|
-
Otherwise, it samples from normal distributions with standard errors as standard
|
48
|
-
deviations using normal distribution approximation.
|
49
|
-
|
50
|
-
- **seed** (np.random.Generator or int) --
|
51
|
-
Set a fixed seed or generator for the normal distribution. If shots is None,
|
52
|
-
this option is ignored.
|
53
|
-
|
54
|
-
.. note::
|
55
|
-
The result of this class is exact if the circuit contains only unitary operations.
|
56
|
-
On the other hand, the result could be stochastic if the circuit contains a non-unitary
|
57
|
-
operation such as a reset for a some subsystems.
|
58
|
-
The stochastic result can be made reproducible by setting ``seed``, e.g.,
|
59
|
-
``Estimator(options={"seed":123})``.
|
60
|
-
"""
|
61
|
-
|
62
|
-
@deprecate_func(
|
63
|
-
since="1.2",
|
64
|
-
additional_msg="All implementations of the `BaseEstimatorV1` interface "
|
65
|
-
"have been deprecated in favor of their V2 counterparts. "
|
66
|
-
"The V2 alternative for the `Estimator` class is `StatevectorEstimator`.",
|
67
|
-
)
|
68
|
-
def __init__(self, *, options: dict | None = None):
|
69
|
-
"""
|
70
|
-
Args:
|
71
|
-
options: Default options.
|
72
|
-
|
73
|
-
Raises:
|
74
|
-
QiskitError: if some classical bits are not used for measurements.
|
75
|
-
"""
|
76
|
-
super().__init__(options=options)
|
77
|
-
self._circuits = []
|
78
|
-
self._parameters = []
|
79
|
-
self._observables = []
|
80
|
-
self._circuit_ids = {}
|
81
|
-
self._observable_ids = {}
|
82
|
-
|
83
|
-
def _call(
|
84
|
-
self,
|
85
|
-
circuits: Sequence[int],
|
86
|
-
observables: Sequence[int],
|
87
|
-
parameter_values: Sequence[Sequence[float]],
|
88
|
-
**run_options,
|
89
|
-
) -> EstimatorResult:
|
90
|
-
shots = run_options.pop("shots", None)
|
91
|
-
seed = run_options.pop("seed", None)
|
92
|
-
if seed is None:
|
93
|
-
rng = np.random.default_rng()
|
94
|
-
elif isinstance(seed, np.random.Generator):
|
95
|
-
rng = seed
|
96
|
-
else:
|
97
|
-
rng = np.random.default_rng(seed)
|
98
|
-
|
99
|
-
# Initialize metadata
|
100
|
-
metadata: list[dict[str, Any]] = [{} for _ in range(len(circuits))]
|
101
|
-
|
102
|
-
bound_circuits = []
|
103
|
-
for i, value in zip(circuits, parameter_values):
|
104
|
-
if len(value) != len(self._parameters[i]):
|
105
|
-
raise QiskitError(
|
106
|
-
f"The number of values ({len(value)}) does not match "
|
107
|
-
f"the number of parameters ({len(self._parameters[i])})."
|
108
|
-
)
|
109
|
-
bound_circuits.append(
|
110
|
-
self._circuits[i]
|
111
|
-
if len(value) == 0
|
112
|
-
else self._circuits[i].assign_parameters(dict(zip(self._parameters[i], value)))
|
113
|
-
)
|
114
|
-
sorted_observables = [self._observables[i] for i in observables]
|
115
|
-
expectation_values = []
|
116
|
-
for circ, obs, metadatum in zip(bound_circuits, sorted_observables, metadata):
|
117
|
-
if circ.num_qubits != obs.num_qubits:
|
118
|
-
raise QiskitError(
|
119
|
-
f"The number of qubits of a circuit ({circ.num_qubits}) does not match "
|
120
|
-
f"the number of qubits of a observable ({obs.num_qubits})."
|
121
|
-
)
|
122
|
-
final_state = _statevector_from_circuit(circ, rng)
|
123
|
-
expectation_value = final_state.expectation_value(obs)
|
124
|
-
if shots is None:
|
125
|
-
expectation_values.append(expectation_value)
|
126
|
-
else:
|
127
|
-
expectation_value = np.real_if_close(expectation_value)
|
128
|
-
sq_obs = (obs @ obs).simplify(atol=0)
|
129
|
-
sq_exp_val = np.real_if_close(final_state.expectation_value(sq_obs))
|
130
|
-
variance = sq_exp_val - expectation_value**2
|
131
|
-
variance = max(variance, 0)
|
132
|
-
standard_error = np.sqrt(variance / shots)
|
133
|
-
expectation_value_with_error = rng.normal(expectation_value, standard_error)
|
134
|
-
expectation_values.append(expectation_value_with_error)
|
135
|
-
metadatum["variance"] = variance
|
136
|
-
metadatum["shots"] = shots
|
137
|
-
|
138
|
-
return EstimatorResult(np.real_if_close(expectation_values), metadata)
|
139
|
-
|
140
|
-
def _run(
|
141
|
-
self,
|
142
|
-
circuits: tuple[QuantumCircuit, ...],
|
143
|
-
observables: tuple[BaseOperator, ...],
|
144
|
-
parameter_values: tuple[tuple[float, ...], ...],
|
145
|
-
**run_options,
|
146
|
-
):
|
147
|
-
circuit_indices = []
|
148
|
-
for circuit in circuits:
|
149
|
-
key = _circuit_key(circuit)
|
150
|
-
index = self._circuit_ids.get(key)
|
151
|
-
if index is not None:
|
152
|
-
circuit_indices.append(index)
|
153
|
-
else:
|
154
|
-
circuit_indices.append(len(self._circuits))
|
155
|
-
self._circuit_ids[key] = len(self._circuits)
|
156
|
-
self._circuits.append(circuit)
|
157
|
-
self._parameters.append(circuit.parameters)
|
158
|
-
observable_indices = []
|
159
|
-
for observable in observables:
|
160
|
-
observable = init_observable(observable)
|
161
|
-
index = self._observable_ids.get(_observable_key(observable))
|
162
|
-
if index is not None:
|
163
|
-
observable_indices.append(index)
|
164
|
-
else:
|
165
|
-
observable_indices.append(len(self._observables))
|
166
|
-
self._observable_ids[_observable_key(observable)] = len(self._observables)
|
167
|
-
self._observables.append(observable)
|
168
|
-
job = PrimitiveJob(
|
169
|
-
self._call, circuit_indices, observable_indices, parameter_values, **run_options
|
170
|
-
)
|
171
|
-
job._submit()
|
172
|
-
return job
|
qiskit/primitives/sampler.py
DELETED
@@ -1,162 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2022.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
"""
|
13
|
-
Sampler V1 reference implementation
|
14
|
-
"""
|
15
|
-
|
16
|
-
from __future__ import annotations
|
17
|
-
|
18
|
-
from collections.abc import Sequence
|
19
|
-
from typing import Any
|
20
|
-
|
21
|
-
import numpy as np
|
22
|
-
|
23
|
-
from qiskit.circuit import QuantumCircuit
|
24
|
-
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.quantum_info import Statevector
|
26
|
-
from qiskit.result import QuasiDistribution
|
27
|
-
from qiskit.utils.deprecation import deprecate_func
|
28
|
-
|
29
|
-
from .base import BaseSampler, SamplerResult
|
30
|
-
from .primitive_job import PrimitiveJob
|
31
|
-
from .utils import (
|
32
|
-
_circuit_key,
|
33
|
-
bound_circuit_to_instruction,
|
34
|
-
final_measurement_mapping,
|
35
|
-
init_circuit,
|
36
|
-
)
|
37
|
-
|
38
|
-
|
39
|
-
class Sampler(BaseSampler[PrimitiveJob[SamplerResult]]):
|
40
|
-
"""
|
41
|
-
Sampler V1 class.
|
42
|
-
|
43
|
-
:class:`~Sampler` is a reference implementation of :class:`~BaseSampler` (V1).
|
44
|
-
|
45
|
-
:Run Options:
|
46
|
-
|
47
|
-
- **shots** (None or int) --
|
48
|
-
The number of shots. If None, it calculates the probabilities.
|
49
|
-
Otherwise, it samples from multinomial distributions.
|
50
|
-
|
51
|
-
- **seed** (np.random.Generator or int) --
|
52
|
-
Set a fixed seed or generator for the multinomial distribution. If shots is None, this
|
53
|
-
option is ignored.
|
54
|
-
"""
|
55
|
-
|
56
|
-
@deprecate_func(
|
57
|
-
since="1.2",
|
58
|
-
additional_msg="All implementations of the `BaseSamplerV1` interface "
|
59
|
-
"have been deprecated in favor of their V2 counterparts. "
|
60
|
-
"The V2 alternative for the `Sampler` class is `StatevectorSampler`.",
|
61
|
-
)
|
62
|
-
def __init__(self, *, options: dict | None = None):
|
63
|
-
"""
|
64
|
-
Args:
|
65
|
-
options: Default options.
|
66
|
-
|
67
|
-
Raises:
|
68
|
-
QiskitError: if some classical bits are not used for measurements.
|
69
|
-
"""
|
70
|
-
super().__init__(options=options)
|
71
|
-
self._circuits = []
|
72
|
-
self._parameters = []
|
73
|
-
self._qargs_list = []
|
74
|
-
self._circuit_ids = {}
|
75
|
-
|
76
|
-
def _call(
|
77
|
-
self,
|
78
|
-
circuits: Sequence[int],
|
79
|
-
parameter_values: Sequence[Sequence[float]],
|
80
|
-
**run_options,
|
81
|
-
) -> SamplerResult:
|
82
|
-
shots = run_options.pop("shots", None)
|
83
|
-
seed = run_options.pop("seed", None)
|
84
|
-
if seed is None:
|
85
|
-
rng = np.random.default_rng()
|
86
|
-
elif isinstance(seed, np.random.Generator):
|
87
|
-
rng = seed
|
88
|
-
else:
|
89
|
-
rng = np.random.default_rng(seed)
|
90
|
-
|
91
|
-
# Initialize metadata
|
92
|
-
metadata: list[dict[str, Any]] = [{} for _ in range(len(circuits))]
|
93
|
-
|
94
|
-
bound_circuits = []
|
95
|
-
qargs_list = []
|
96
|
-
for i, value in zip(circuits, parameter_values):
|
97
|
-
if len(value) != len(self._parameters[i]):
|
98
|
-
raise QiskitError(
|
99
|
-
f"The number of values ({len(value)}) does not match "
|
100
|
-
f"the number of parameters ({len(self._parameters[i])})."
|
101
|
-
)
|
102
|
-
bound_circuits.append(
|
103
|
-
self._circuits[i]
|
104
|
-
if len(value) == 0
|
105
|
-
else self._circuits[i].assign_parameters(dict(zip(self._parameters[i], value)))
|
106
|
-
)
|
107
|
-
qargs_list.append(self._qargs_list[i])
|
108
|
-
probabilities = [
|
109
|
-
Statevector(bound_circuit_to_instruction(circ)).probabilities_dict(
|
110
|
-
qargs=qargs, decimals=16
|
111
|
-
)
|
112
|
-
for circ, qargs in zip(bound_circuits, qargs_list)
|
113
|
-
]
|
114
|
-
if shots is not None:
|
115
|
-
for i, prob_dict in enumerate(probabilities):
|
116
|
-
counts = rng.multinomial(shots, np.fromiter(prob_dict.values(), dtype=float))
|
117
|
-
probabilities[i] = {
|
118
|
-
key: count / shots for key, count in zip(prob_dict.keys(), counts) if count > 0
|
119
|
-
}
|
120
|
-
for metadatum in metadata:
|
121
|
-
metadatum["shots"] = shots
|
122
|
-
quasis = [QuasiDistribution(p, shots=shots) for p in probabilities]
|
123
|
-
|
124
|
-
return SamplerResult(quasis, metadata)
|
125
|
-
|
126
|
-
def _run(
|
127
|
-
self,
|
128
|
-
circuits: tuple[QuantumCircuit, ...],
|
129
|
-
parameter_values: tuple[tuple[float, ...], ...],
|
130
|
-
**run_options,
|
131
|
-
):
|
132
|
-
circuit_indices = []
|
133
|
-
for circuit in circuits:
|
134
|
-
key = _circuit_key(circuit)
|
135
|
-
index = self._circuit_ids.get(key)
|
136
|
-
if index is not None:
|
137
|
-
circuit_indices.append(index)
|
138
|
-
else:
|
139
|
-
circuit_indices.append(len(self._circuits))
|
140
|
-
self._circuit_ids[key] = len(self._circuits)
|
141
|
-
circuit, qargs = self._preprocess_circuit(circuit)
|
142
|
-
self._circuits.append(circuit)
|
143
|
-
self._qargs_list.append(qargs)
|
144
|
-
self._parameters.append(circuit.parameters)
|
145
|
-
job = PrimitiveJob(self._call, circuit_indices, parameter_values, **run_options)
|
146
|
-
job._submit()
|
147
|
-
return job
|
148
|
-
|
149
|
-
@staticmethod
|
150
|
-
def _preprocess_circuit(circuit: QuantumCircuit):
|
151
|
-
circuit = init_circuit(circuit)
|
152
|
-
q_c_mapping = final_measurement_mapping(circuit)
|
153
|
-
if set(range(circuit.num_clbits)) != set(q_c_mapping.values()):
|
154
|
-
raise QiskitError(
|
155
|
-
"Some classical bits are not used for measurements."
|
156
|
-
f" the number of classical bits ({circuit.num_clbits}),"
|
157
|
-
f" the used classical bits ({set(q_c_mapping.values())})."
|
158
|
-
)
|
159
|
-
c_q_mapping = sorted((c, q) for q, c in q_c_mapping.items())
|
160
|
-
qargs = [q for _, q in c_q_mapping]
|
161
|
-
circuit = circuit.remove_final_measurements(inplace=False)
|
162
|
-
return circuit, qargs
|