qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.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.pyd +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 +1 -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
qiskit/compiler/scheduler.py
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2019.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""
|
14
|
-
Convenience entry point into pulse scheduling, requiring only a circuit and a backend. For more
|
15
|
-
control over pulse scheduling, look at `qiskit.scheduler.schedule_circuit`.
|
16
|
-
"""
|
17
|
-
import logging
|
18
|
-
|
19
|
-
from time import time
|
20
|
-
from typing import List, Optional, Union
|
21
|
-
|
22
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
|
-
from qiskit.exceptions import QiskitError
|
24
|
-
from qiskit.pulse import InstructionScheduleMap, Schedule
|
25
|
-
from qiskit.providers.backend import Backend
|
26
|
-
from qiskit.scheduler.config import ScheduleConfig
|
27
|
-
from qiskit.scheduler.schedule_circuit import schedule_circuit
|
28
|
-
from qiskit.utils.parallel import parallel_map
|
29
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
30
|
-
|
31
|
-
logger = logging.getLogger(__name__)
|
32
|
-
|
33
|
-
|
34
|
-
def _log_schedule_time(start_time, end_time):
|
35
|
-
log_msg = f"Total Scheduling Time - {((end_time - start_time) * 1000):.5f} (ms)"
|
36
|
-
logger.info(log_msg)
|
37
|
-
|
38
|
-
|
39
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
40
|
-
def schedule(
|
41
|
-
circuits: Union[QuantumCircuit, List[QuantumCircuit]],
|
42
|
-
backend: Optional[Backend] = None,
|
43
|
-
inst_map: Optional[InstructionScheduleMap] = None,
|
44
|
-
meas_map: Optional[List[List[int]]] = None,
|
45
|
-
dt: Optional[float] = None,
|
46
|
-
method: Optional[Union[str, List[str]]] = None,
|
47
|
-
) -> Union[Schedule, List[Schedule]]:
|
48
|
-
"""
|
49
|
-
Schedule a circuit to a pulse ``Schedule``, using the backend, according to any specified
|
50
|
-
methods. Supported methods are documented in :py:mod:`qiskit.scheduler.schedule_circuit`.
|
51
|
-
|
52
|
-
Args:
|
53
|
-
circuits: The quantum circuit or circuits to translate
|
54
|
-
backend: A backend instance, which contains hardware-specific data required for scheduling
|
55
|
-
inst_map: Mapping of circuit operations to pulse schedules. If ``None``, defaults to the
|
56
|
-
``backend``\'s ``instruction_schedule_map``
|
57
|
-
meas_map: List of sets of qubits that must be measured together. If ``None``, defaults to
|
58
|
-
the ``backend``\'s ``meas_map``
|
59
|
-
dt: The output sample rate of backend control electronics. For scheduled circuits
|
60
|
-
which contain time information, dt is required. If not provided, it will be
|
61
|
-
obtained from the backend configuration
|
62
|
-
method: Optionally specify a particular scheduling method
|
63
|
-
|
64
|
-
Returns:
|
65
|
-
A pulse ``Schedule`` that implements the input circuit
|
66
|
-
|
67
|
-
Raises:
|
68
|
-
QiskitError: If ``inst_map`` and ``meas_map`` are not passed and ``backend`` is not passed
|
69
|
-
"""
|
70
|
-
arg_circuits_list = isinstance(circuits, list)
|
71
|
-
start_time = time()
|
72
|
-
if backend and getattr(backend, "version", 0) > 1:
|
73
|
-
if inst_map is None:
|
74
|
-
inst_map = backend.instruction_schedule_map
|
75
|
-
if meas_map is None:
|
76
|
-
meas_map = backend.meas_map
|
77
|
-
if dt is None:
|
78
|
-
dt = backend.dt
|
79
|
-
else:
|
80
|
-
if inst_map is None:
|
81
|
-
if backend is None:
|
82
|
-
raise QiskitError(
|
83
|
-
"Must supply either a backend or InstructionScheduleMap for scheduling passes."
|
84
|
-
)
|
85
|
-
defaults = backend.defaults()
|
86
|
-
if defaults is None:
|
87
|
-
raise QiskitError(
|
88
|
-
"The backend defaults are unavailable. The backend may not support pulse."
|
89
|
-
)
|
90
|
-
inst_map = defaults.instruction_schedule_map
|
91
|
-
if meas_map is None:
|
92
|
-
if backend is None:
|
93
|
-
raise QiskitError(
|
94
|
-
"Must supply either a backend or a meas_map for scheduling passes."
|
95
|
-
)
|
96
|
-
meas_map = backend.configuration().meas_map
|
97
|
-
if dt is None:
|
98
|
-
if backend is not None:
|
99
|
-
dt = backend.configuration().dt
|
100
|
-
|
101
|
-
schedule_config = ScheduleConfig(inst_map=inst_map, meas_map=meas_map, dt=dt)
|
102
|
-
circuits = circuits if isinstance(circuits, list) else [circuits]
|
103
|
-
schedules = parallel_map(schedule_circuit, circuits, (schedule_config, method, backend))
|
104
|
-
end_time = time()
|
105
|
-
_log_schedule_time(start_time, end_time)
|
106
|
-
if arg_circuits_list:
|
107
|
-
return schedules
|
108
|
-
else:
|
109
|
-
return schedules[0]
|
qiskit/compiler/sequencer.py
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2020.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""
|
14
|
-
Mapping a scheduled ``QuantumCircuit`` to a pulse ``Schedule``.
|
15
|
-
"""
|
16
|
-
from typing import List, Optional, Union
|
17
|
-
|
18
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
-
from qiskit.exceptions import QiskitError
|
20
|
-
from qiskit.providers.backend import Backend
|
21
|
-
from qiskit.pulse import InstructionScheduleMap, Schedule
|
22
|
-
from qiskit.scheduler import ScheduleConfig
|
23
|
-
from qiskit.scheduler.sequence import sequence as _sequence
|
24
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
25
|
-
|
26
|
-
|
27
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
28
|
-
def sequence(
|
29
|
-
scheduled_circuits: Union[QuantumCircuit, List[QuantumCircuit]],
|
30
|
-
backend: Optional[Backend] = None,
|
31
|
-
inst_map: Optional[InstructionScheduleMap] = None,
|
32
|
-
meas_map: Optional[List[List[int]]] = None,
|
33
|
-
dt: Optional[float] = None,
|
34
|
-
) -> Union[Schedule, List[Schedule]]:
|
35
|
-
"""
|
36
|
-
Schedule a scheduled circuit to a pulse ``Schedule``, using the backend.
|
37
|
-
|
38
|
-
Args:
|
39
|
-
scheduled_circuits: Scheduled circuit(s) to be translated
|
40
|
-
backend: A backend instance, which contains hardware-specific data required for scheduling
|
41
|
-
inst_map: Mapping of circuit operations to pulse schedules. If ``None``, defaults to the
|
42
|
-
``backend``\'s ``instruction_schedule_map``
|
43
|
-
meas_map: List of sets of qubits that must be measured together. If ``None``, defaults to
|
44
|
-
the ``backend``\'s ``meas_map``
|
45
|
-
dt: The output sample rate of backend control electronics. For scheduled circuits
|
46
|
-
which contain time information, dt is required. If not provided, it will be
|
47
|
-
obtained from the backend configuration
|
48
|
-
|
49
|
-
Returns:
|
50
|
-
A pulse ``Schedule`` that implements the input circuit
|
51
|
-
|
52
|
-
Raises:
|
53
|
-
QiskitError: If ``inst_map`` and ``meas_map`` are not passed and ``backend`` is not passed
|
54
|
-
"""
|
55
|
-
if inst_map is None:
|
56
|
-
if backend is None:
|
57
|
-
raise QiskitError("Must supply either a backend or inst_map for sequencing.")
|
58
|
-
inst_map = backend.defaults().instruction_schedule_map
|
59
|
-
if meas_map is None:
|
60
|
-
if backend is None:
|
61
|
-
raise QiskitError("Must supply either a backend or a meas_map for sequencing.")
|
62
|
-
meas_map = backend.configuration().meas_map
|
63
|
-
if dt is None:
|
64
|
-
if backend is None:
|
65
|
-
raise QiskitError("Must supply either a backend or a dt for sequencing.")
|
66
|
-
dt = backend.configuration().dt
|
67
|
-
|
68
|
-
schedule_config = ScheduleConfig(inst_map=inst_map, meas_map=meas_map, dt=dt)
|
69
|
-
circuits = scheduled_circuits if isinstance(scheduled_circuits, list) else [scheduled_circuits]
|
70
|
-
schedules = [_sequence(circuit, schedule_config) for circuit in circuits]
|
71
|
-
return schedules[0] if len(schedules) == 1 else schedules
|
@@ -1,486 +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 implementation for an arbitrary Backend object."""
|
14
|
-
|
15
|
-
from __future__ import annotations
|
16
|
-
|
17
|
-
from collections.abc import Sequence
|
18
|
-
from itertools import accumulate
|
19
|
-
|
20
|
-
import numpy as np
|
21
|
-
|
22
|
-
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
|
23
|
-
from qiskit.compiler import transpile
|
24
|
-
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.providers import BackendV1, BackendV2, Options
|
26
|
-
from qiskit.quantum_info import Pauli, PauliList
|
27
|
-
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
28
|
-
from qiskit.result import Counts, Result
|
29
|
-
from qiskit.transpiler import CouplingMap, PassManager
|
30
|
-
from qiskit.transpiler.passes import (
|
31
|
-
ApplyLayout,
|
32
|
-
EnlargeWithAncilla,
|
33
|
-
FullAncillaAllocation,
|
34
|
-
Optimize1qGatesDecomposition,
|
35
|
-
SetLayout,
|
36
|
-
)
|
37
|
-
from qiskit.utils.deprecation import deprecate_func
|
38
|
-
|
39
|
-
from .base import BaseEstimator, EstimatorResult
|
40
|
-
from .primitive_job import PrimitiveJob
|
41
|
-
from .utils import _circuit_key, _observable_key, init_observable
|
42
|
-
|
43
|
-
|
44
|
-
def _run_circuits(
|
45
|
-
circuits: QuantumCircuit | list[QuantumCircuit],
|
46
|
-
backend: BackendV1 | BackendV2,
|
47
|
-
clear_metadata: bool = True,
|
48
|
-
**run_options,
|
49
|
-
) -> tuple[list[Result], list[dict]]:
|
50
|
-
"""Remove metadata of circuits and run the circuits on a backend.
|
51
|
-
Args:
|
52
|
-
circuits: The circuits
|
53
|
-
backend: The backend
|
54
|
-
clear_metadata: Clear circuit metadata before passing to backend.run if
|
55
|
-
True.
|
56
|
-
**run_options: run_options
|
57
|
-
Returns:
|
58
|
-
The result and the metadata of the circuits
|
59
|
-
"""
|
60
|
-
if isinstance(circuits, QuantumCircuit):
|
61
|
-
circuits = [circuits]
|
62
|
-
metadata = []
|
63
|
-
for circ in circuits:
|
64
|
-
metadata.append(circ.metadata)
|
65
|
-
if clear_metadata:
|
66
|
-
circ.metadata = {}
|
67
|
-
if isinstance(backend, BackendV1):
|
68
|
-
max_circuits = getattr(backend.configuration(), "max_experiments", None)
|
69
|
-
elif isinstance(backend, BackendV2):
|
70
|
-
max_circuits = backend.max_circuits
|
71
|
-
else:
|
72
|
-
raise RuntimeError("Backend version not supported")
|
73
|
-
if max_circuits:
|
74
|
-
jobs = [
|
75
|
-
backend.run(circuits[pos : pos + max_circuits], **run_options)
|
76
|
-
for pos in range(0, len(circuits), max_circuits)
|
77
|
-
]
|
78
|
-
result = [x.result() for x in jobs]
|
79
|
-
else:
|
80
|
-
result = [backend.run(circuits, **run_options).result()]
|
81
|
-
return result, metadata
|
82
|
-
|
83
|
-
|
84
|
-
def _prepare_counts(results: list[Result]):
|
85
|
-
counts = []
|
86
|
-
for res in results:
|
87
|
-
count = res.get_counts()
|
88
|
-
if not isinstance(count, list):
|
89
|
-
count = [count]
|
90
|
-
counts.extend(count)
|
91
|
-
return counts
|
92
|
-
|
93
|
-
|
94
|
-
class BackendEstimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
|
95
|
-
"""Evaluates expectation value using Pauli rotation gates.
|
96
|
-
|
97
|
-
The :class:`~.BackendEstimator` class is a generic implementation of the
|
98
|
-
:class:`~.BaseEstimator` (V1) interface that is used to wrap a :class:`~.BackendV2`
|
99
|
-
(or :class:`~.BackendV1`) object in the :class:`~.BaseEstimator` V1 API. It
|
100
|
-
facilitates using backends that do not provide a native
|
101
|
-
:class:`~.BaseEstimator` V1 implementation in places that work with
|
102
|
-
:class:`~.BaseEstimator` V1.
|
103
|
-
However, if you're using a provider that has a native implementation of
|
104
|
-
:class:`~.BaseEstimatorV1` ( :class:`~.BaseEstimator`) or
|
105
|
-
:class:`~.BaseEstimatorV2`, it is a better
|
106
|
-
choice to leverage that native implementation as it will likely include
|
107
|
-
additional optimizations and be a more efficient implementation.
|
108
|
-
The generic nature of this class precludes doing any provider- or
|
109
|
-
backend-specific optimizations.
|
110
|
-
"""
|
111
|
-
|
112
|
-
@deprecate_func(
|
113
|
-
since="1.2",
|
114
|
-
additional_msg="All implementations of the `BaseEstimatorV1` interface "
|
115
|
-
"have been deprecated in favor of their V2 counterparts. "
|
116
|
-
"The V2 alternative for the `BackendEstimator` class is `BackendEstimatorV2`.",
|
117
|
-
)
|
118
|
-
def __init__(
|
119
|
-
self,
|
120
|
-
backend: BackendV1 | BackendV2,
|
121
|
-
options: dict | None = None,
|
122
|
-
abelian_grouping: bool = True,
|
123
|
-
bound_pass_manager: PassManager | None = None,
|
124
|
-
skip_transpilation: bool = False,
|
125
|
-
):
|
126
|
-
"""Initialize a new BackendEstimator (V1) instance
|
127
|
-
|
128
|
-
Args:
|
129
|
-
backend: (required) the backend to run the primitive on
|
130
|
-
options: Default options.
|
131
|
-
abelian_grouping: Whether the observable should be grouped into
|
132
|
-
commuting
|
133
|
-
bound_pass_manager: An optional pass manager to run after
|
134
|
-
parameter binding.
|
135
|
-
skip_transpilation: If this is set to True the internal compilation
|
136
|
-
of the input circuits is skipped and the circuit objects
|
137
|
-
will be directly executed when this object is called.
|
138
|
-
"""
|
139
|
-
super().__init__(options=options)
|
140
|
-
self._circuits = []
|
141
|
-
self._parameters = []
|
142
|
-
self._observables = []
|
143
|
-
|
144
|
-
self._abelian_grouping = abelian_grouping
|
145
|
-
|
146
|
-
self._backend = backend
|
147
|
-
|
148
|
-
self._transpile_options = Options()
|
149
|
-
self._bound_pass_manager = bound_pass_manager
|
150
|
-
|
151
|
-
self._preprocessed_circuits: list[tuple[QuantumCircuit, list[QuantumCircuit]]] | None = None
|
152
|
-
self._transpiled_circuits: list[QuantumCircuit] | None = None
|
153
|
-
|
154
|
-
self._grouping = list(zip(range(len(self._circuits)), range(len(self._observables))))
|
155
|
-
self._skip_transpilation = skip_transpilation
|
156
|
-
|
157
|
-
self._circuit_ids = {}
|
158
|
-
self._observable_ids = {}
|
159
|
-
|
160
|
-
@property
|
161
|
-
def transpile_options(self) -> Options:
|
162
|
-
"""Return the transpiler options for transpiling the circuits."""
|
163
|
-
return self._transpile_options
|
164
|
-
|
165
|
-
def set_transpile_options(self, **fields):
|
166
|
-
"""Set the transpiler options for transpiler.
|
167
|
-
Args:
|
168
|
-
**fields: The fields to update the options
|
169
|
-
"""
|
170
|
-
self._transpiled_circuits = None
|
171
|
-
self._transpile_options.update_options(**fields)
|
172
|
-
|
173
|
-
@property
|
174
|
-
def preprocessed_circuits(
|
175
|
-
self,
|
176
|
-
) -> list[tuple[QuantumCircuit, list[QuantumCircuit]]]:
|
177
|
-
"""
|
178
|
-
Transpiled quantum circuits produced by preprocessing
|
179
|
-
Returns:
|
180
|
-
List of the transpiled quantum circuit
|
181
|
-
"""
|
182
|
-
self._preprocessed_circuits = self._preprocessing()
|
183
|
-
return self._preprocessed_circuits
|
184
|
-
|
185
|
-
@property
|
186
|
-
def transpiled_circuits(self) -> list[QuantumCircuit]:
|
187
|
-
"""
|
188
|
-
Transpiled quantum circuits.
|
189
|
-
Returns:
|
190
|
-
List of the transpiled quantum circuit
|
191
|
-
Raises:
|
192
|
-
QiskitError: if the instance has been closed.
|
193
|
-
"""
|
194
|
-
self._transpile()
|
195
|
-
return self._transpiled_circuits
|
196
|
-
|
197
|
-
@property
|
198
|
-
def backend(self) -> BackendV1 | BackendV2:
|
199
|
-
"""
|
200
|
-
Returns:
|
201
|
-
The backend which this estimator object based on
|
202
|
-
"""
|
203
|
-
return self._backend
|
204
|
-
|
205
|
-
def _transpile(self):
|
206
|
-
"""Split Transpile"""
|
207
|
-
self._transpiled_circuits = []
|
208
|
-
for common_circuit, diff_circuits in self.preprocessed_circuits:
|
209
|
-
# 1. transpile a common circuit
|
210
|
-
if self._skip_transpilation:
|
211
|
-
transpiled_circuit = common_circuit.copy()
|
212
|
-
final_index_layout = list(range(common_circuit.num_qubits))
|
213
|
-
else:
|
214
|
-
transpiled_circuit = transpile( # pylint:disable=unexpected-keyword-arg
|
215
|
-
common_circuit, self.backend, **self.transpile_options.__dict__
|
216
|
-
)
|
217
|
-
if transpiled_circuit.layout is not None:
|
218
|
-
final_index_layout = transpiled_circuit.layout.final_index_layout()
|
219
|
-
else:
|
220
|
-
final_index_layout = list(range(transpiled_circuit.num_qubits))
|
221
|
-
|
222
|
-
# 2. transpile diff circuits
|
223
|
-
passmanager = _passmanager_for_measurement_circuits(final_index_layout, self.backend)
|
224
|
-
diff_circuits = passmanager.run(diff_circuits)
|
225
|
-
# 3. combine
|
226
|
-
transpiled_circuits = []
|
227
|
-
for diff_circuit in diff_circuits:
|
228
|
-
transpiled_circuit_copy = transpiled_circuit.copy()
|
229
|
-
# diff_circuit is supposed to have a classical register whose name is different from
|
230
|
-
# those of the transpiled_circuit
|
231
|
-
clbits = diff_circuit.cregs[0]
|
232
|
-
for creg in transpiled_circuit_copy.cregs:
|
233
|
-
if clbits.name == creg.name:
|
234
|
-
raise QiskitError(
|
235
|
-
"Classical register for measurements conflict with those of the input "
|
236
|
-
f"circuit: {clbits}. "
|
237
|
-
"Recommended to avoid register names starting with '__'."
|
238
|
-
)
|
239
|
-
transpiled_circuit_copy.add_register(clbits)
|
240
|
-
transpiled_circuit_copy.compose(diff_circuit, clbits=clbits, inplace=True)
|
241
|
-
transpiled_circuit_copy.metadata = diff_circuit.metadata
|
242
|
-
transpiled_circuits.append(transpiled_circuit_copy)
|
243
|
-
self._transpiled_circuits += transpiled_circuits
|
244
|
-
|
245
|
-
def _call(
|
246
|
-
self,
|
247
|
-
circuits: Sequence[int],
|
248
|
-
observables: Sequence[int],
|
249
|
-
parameter_values: Sequence[Sequence[float]],
|
250
|
-
**run_options,
|
251
|
-
) -> EstimatorResult:
|
252
|
-
|
253
|
-
# Transpile
|
254
|
-
self._grouping = list(zip(circuits, observables))
|
255
|
-
transpiled_circuits = self.transpiled_circuits
|
256
|
-
num_observables = [len(m) for (_, m) in self.preprocessed_circuits]
|
257
|
-
accum = [0] + list(accumulate(num_observables))
|
258
|
-
|
259
|
-
# Bind parameters
|
260
|
-
parameter_dicts = [
|
261
|
-
dict(zip(self._parameters[i], value)) for i, value in zip(circuits, parameter_values)
|
262
|
-
]
|
263
|
-
bound_circuits = [
|
264
|
-
(
|
265
|
-
transpiled_circuits[circuit_index]
|
266
|
-
if len(p) == 0
|
267
|
-
else transpiled_circuits[circuit_index].assign_parameters(p)
|
268
|
-
)
|
269
|
-
for i, (p, n) in enumerate(zip(parameter_dicts, num_observables))
|
270
|
-
for circuit_index in range(accum[i], accum[i] + n)
|
271
|
-
]
|
272
|
-
bound_circuits = self._bound_pass_manager_run(bound_circuits)
|
273
|
-
|
274
|
-
# Run
|
275
|
-
result, metadata = _run_circuits(bound_circuits, self._backend, **run_options)
|
276
|
-
|
277
|
-
return self._postprocessing(result, accum, metadata)
|
278
|
-
|
279
|
-
def _run(
|
280
|
-
self,
|
281
|
-
circuits: tuple[QuantumCircuit, ...],
|
282
|
-
observables: tuple[BaseOperator, ...],
|
283
|
-
parameter_values: tuple[tuple[float, ...], ...],
|
284
|
-
**run_options,
|
285
|
-
):
|
286
|
-
circuit_indices = []
|
287
|
-
for circuit in circuits:
|
288
|
-
index = self._circuit_ids.get(_circuit_key(circuit))
|
289
|
-
if index is not None:
|
290
|
-
circuit_indices.append(index)
|
291
|
-
else:
|
292
|
-
circuit_indices.append(len(self._circuits))
|
293
|
-
self._circuit_ids[_circuit_key(circuit)] = len(self._circuits)
|
294
|
-
self._circuits.append(circuit)
|
295
|
-
self._parameters.append(circuit.parameters)
|
296
|
-
observable_indices = []
|
297
|
-
for observable in observables:
|
298
|
-
observable = init_observable(observable)
|
299
|
-
index = self._observable_ids.get(_observable_key(observable))
|
300
|
-
if index is not None:
|
301
|
-
observable_indices.append(index)
|
302
|
-
else:
|
303
|
-
observable_indices.append(len(self._observables))
|
304
|
-
self._observable_ids[_observable_key(observable)] = len(self._observables)
|
305
|
-
self._observables.append(observable)
|
306
|
-
job = PrimitiveJob(
|
307
|
-
self._call, circuit_indices, observable_indices, parameter_values, **run_options
|
308
|
-
)
|
309
|
-
job._submit()
|
310
|
-
return job
|
311
|
-
|
312
|
-
@staticmethod
|
313
|
-
def _measurement_circuit(num_qubits: int, pauli: Pauli):
|
314
|
-
# Note: if pauli is I for all qubits, this function generates a circuit to measure only
|
315
|
-
# the first qubit.
|
316
|
-
# Although such an operator can be optimized out by interpreting it as a constant (1),
|
317
|
-
# this optimization requires changes in various methods. So it is left as future work.
|
318
|
-
qubit_indices = np.arange(pauli.num_qubits)[pauli.z | pauli.x]
|
319
|
-
if not np.any(qubit_indices):
|
320
|
-
qubit_indices = [0]
|
321
|
-
meas_circuit = QuantumCircuit(
|
322
|
-
QuantumRegister(num_qubits, "q"), ClassicalRegister(len(qubit_indices), f"__c_{pauli}")
|
323
|
-
)
|
324
|
-
for clbit, i in enumerate(qubit_indices):
|
325
|
-
if pauli.x[i]:
|
326
|
-
if pauli.z[i]:
|
327
|
-
meas_circuit.sdg(i)
|
328
|
-
meas_circuit.h(i)
|
329
|
-
meas_circuit.measure(i, clbit)
|
330
|
-
return meas_circuit, qubit_indices
|
331
|
-
|
332
|
-
def _preprocessing(self) -> list[tuple[QuantumCircuit, list[QuantumCircuit]]]:
|
333
|
-
"""
|
334
|
-
Preprocessing for evaluation of expectation value using pauli rotation gates.
|
335
|
-
"""
|
336
|
-
preprocessed_circuits = []
|
337
|
-
for group in self._grouping:
|
338
|
-
circuit = self._circuits[group[0]]
|
339
|
-
observable = self._observables[group[1]]
|
340
|
-
diff_circuits: list[QuantumCircuit] = []
|
341
|
-
if self._abelian_grouping:
|
342
|
-
for obs in observable.group_commuting(qubit_wise=True):
|
343
|
-
basis = Pauli(
|
344
|
-
(np.logical_or.reduce(obs.paulis.z), np.logical_or.reduce(obs.paulis.x))
|
345
|
-
)
|
346
|
-
meas_circuit, indices = self._measurement_circuit(circuit.num_qubits, basis)
|
347
|
-
paulis = PauliList.from_symplectic(
|
348
|
-
obs.paulis.z[:, indices],
|
349
|
-
obs.paulis.x[:, indices],
|
350
|
-
obs.paulis.phase,
|
351
|
-
)
|
352
|
-
meas_circuit.metadata = {
|
353
|
-
"paulis": paulis,
|
354
|
-
"coeffs": np.real_if_close(obs.coeffs),
|
355
|
-
}
|
356
|
-
diff_circuits.append(meas_circuit)
|
357
|
-
else:
|
358
|
-
for basis, obs in zip(observable.paulis, observable):
|
359
|
-
meas_circuit, indices = self._measurement_circuit(circuit.num_qubits, basis)
|
360
|
-
paulis = PauliList.from_symplectic(
|
361
|
-
obs.paulis.z[:, indices],
|
362
|
-
obs.paulis.x[:, indices],
|
363
|
-
obs.paulis.phase,
|
364
|
-
)
|
365
|
-
meas_circuit.metadata = {
|
366
|
-
"paulis": paulis,
|
367
|
-
"coeffs": np.real_if_close(obs.coeffs),
|
368
|
-
}
|
369
|
-
diff_circuits.append(meas_circuit)
|
370
|
-
|
371
|
-
preprocessed_circuits.append((circuit.copy(), diff_circuits))
|
372
|
-
return preprocessed_circuits
|
373
|
-
|
374
|
-
def _postprocessing(
|
375
|
-
self, result: list[Result], accum: list[int], metadata: list[dict]
|
376
|
-
) -> EstimatorResult:
|
377
|
-
"""
|
378
|
-
Postprocessing for evaluation of expectation value using pauli rotation gates.
|
379
|
-
"""
|
380
|
-
counts = _prepare_counts(result)
|
381
|
-
expval_list = []
|
382
|
-
var_list = []
|
383
|
-
shots_list = []
|
384
|
-
|
385
|
-
for i, j in zip(accum, accum[1:]):
|
386
|
-
|
387
|
-
combined_expval = 0.0
|
388
|
-
combined_var = 0.0
|
389
|
-
|
390
|
-
for k in range(i, j):
|
391
|
-
meta = metadata[k]
|
392
|
-
paulis = meta["paulis"]
|
393
|
-
coeffs = meta["coeffs"]
|
394
|
-
|
395
|
-
count = counts[k]
|
396
|
-
|
397
|
-
expvals, variances = _pauli_expval_with_variance(count, paulis)
|
398
|
-
|
399
|
-
# Accumulate
|
400
|
-
combined_expval += np.dot(expvals, coeffs)
|
401
|
-
combined_var += np.dot(variances, coeffs**2)
|
402
|
-
|
403
|
-
expval_list.append(combined_expval)
|
404
|
-
var_list.append(combined_var)
|
405
|
-
shots_list.append(sum(counts[i].values()))
|
406
|
-
|
407
|
-
metadata = [{"variance": var, "shots": shots} for var, shots in zip(var_list, shots_list)]
|
408
|
-
|
409
|
-
return EstimatorResult(np.real_if_close(expval_list), metadata)
|
410
|
-
|
411
|
-
def _bound_pass_manager_run(self, circuits):
|
412
|
-
if self._bound_pass_manager is None:
|
413
|
-
return circuits
|
414
|
-
else:
|
415
|
-
output = self._bound_pass_manager.run(circuits)
|
416
|
-
if not isinstance(output, list):
|
417
|
-
output = [output]
|
418
|
-
return output
|
419
|
-
|
420
|
-
|
421
|
-
def _paulis2inds(paulis: PauliList) -> list[int]:
|
422
|
-
"""Convert PauliList to diagonal integers.
|
423
|
-
These are integer representations of the binary string with a
|
424
|
-
1 where there are Paulis, and 0 where there are identities.
|
425
|
-
"""
|
426
|
-
# Treat Z, X, Y the same
|
427
|
-
nonid = paulis.z | paulis.x
|
428
|
-
|
429
|
-
# bits are packed into uint8 in little endian
|
430
|
-
# e.g., i-th bit corresponds to coefficient 2^i
|
431
|
-
packed_vals = np.packbits(nonid, axis=1, bitorder="little")
|
432
|
-
power_uint8 = 1 << (8 * np.arange(packed_vals.shape[1], dtype=object))
|
433
|
-
inds = packed_vals @ power_uint8
|
434
|
-
return inds.tolist()
|
435
|
-
|
436
|
-
|
437
|
-
def _parity(integer: int) -> int:
|
438
|
-
"""Return the parity of an integer"""
|
439
|
-
return bin(integer).count("1") % 2
|
440
|
-
|
441
|
-
|
442
|
-
def _pauli_expval_with_variance(counts: Counts, paulis: PauliList) -> tuple[np.ndarray, np.ndarray]:
|
443
|
-
"""Return array of expval and variance pairs for input Paulis.
|
444
|
-
Note: All non-identity Pauli's are treated as Z-paulis, assuming
|
445
|
-
that basis rotations have been applied to convert them to the
|
446
|
-
diagonal basis.
|
447
|
-
"""
|
448
|
-
# Diag indices
|
449
|
-
size = len(paulis)
|
450
|
-
diag_inds = _paulis2inds(paulis)
|
451
|
-
|
452
|
-
expvals = np.zeros(size, dtype=float)
|
453
|
-
denom = 0 # Total shots for counts dict
|
454
|
-
for bin_outcome, freq in counts.items():
|
455
|
-
split_outcome = bin_outcome.split(" ", 1)[0] if " " in bin_outcome else bin_outcome
|
456
|
-
outcome = int(split_outcome, 2)
|
457
|
-
denom += freq
|
458
|
-
for k in range(size):
|
459
|
-
coeff = (-1) ** _parity(diag_inds[k] & outcome)
|
460
|
-
expvals[k] += freq * coeff
|
461
|
-
|
462
|
-
# Divide by total shots
|
463
|
-
expvals /= denom
|
464
|
-
|
465
|
-
# Compute variance
|
466
|
-
variances = 1 - expvals**2
|
467
|
-
return expvals, variances
|
468
|
-
|
469
|
-
|
470
|
-
def _passmanager_for_measurement_circuits(layout, backend) -> PassManager:
|
471
|
-
passmanager = PassManager([SetLayout(layout)])
|
472
|
-
if isinstance(backend, BackendV2):
|
473
|
-
opt1q = Optimize1qGatesDecomposition(target=backend.target)
|
474
|
-
else:
|
475
|
-
opt1q = Optimize1qGatesDecomposition(basis=backend.configuration().basis_gates)
|
476
|
-
passmanager.append(opt1q)
|
477
|
-
if isinstance(backend, BackendV2) and isinstance(backend.coupling_map, CouplingMap):
|
478
|
-
coupling_map = backend.coupling_map
|
479
|
-
passmanager.append(FullAncillaAllocation(coupling_map))
|
480
|
-
passmanager.append(EnlargeWithAncilla())
|
481
|
-
elif isinstance(backend, BackendV1) and backend.configuration().coupling_map is not None:
|
482
|
-
coupling_map = CouplingMap(backend.configuration().coupling_map)
|
483
|
-
passmanager.append(FullAncillaAllocation(coupling_map))
|
484
|
-
passmanager.append(EnlargeWithAncilla())
|
485
|
-
passmanager.append(ApplyLayout())
|
486
|
-
return passmanager
|