qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__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 +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- 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 +236 -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 +469 -154
- 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/graph_state.py +1 -0
- 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 +7 -10
- 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 +14 -62
- 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 +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- 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/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- 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 +7 -8
- 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 +5 -82
- 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 +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- 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 -11
- qiskit/result/result.py +38 -134
- 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 +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- 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 +3 -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 +2 -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 +3 -2
- 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 +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- 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 +134 -62
- 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 +107 -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 +78 -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/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.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.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -27,7 +27,6 @@ def _dag_to_dagdependency_v2(dag):
|
|
27
27
|
dagdependency.name = dag.name
|
28
28
|
dagdependency.metadata = dag.metadata
|
29
29
|
dagdependency.global_phase = dag.global_phase
|
30
|
-
dagdependency.calibrations = dag._calibrations_prop
|
31
30
|
|
32
31
|
dagdependency.add_qubits(dag.qubits)
|
33
32
|
dagdependency.add_clbits(dag.clbits)
|
@@ -34,12 +34,6 @@ def dagdependency_to_circuit(dagdependency):
|
|
34
34
|
)
|
35
35
|
circuit.metadata = dagdependency.metadata
|
36
36
|
|
37
|
-
if hasattr(dagdependency, "_calibrations_prop"):
|
38
|
-
circuit._calibrations_prop = dagdependency._calibrations_prop
|
39
|
-
else:
|
40
|
-
# This can be _DAGDependencyV2
|
41
|
-
circuit._calibrations_prop = dagdependency.calibrations
|
42
|
-
|
43
37
|
for node in dagdependency.topological_nodes():
|
44
38
|
circuit._append(CircuitInstruction(node.op.copy(), node.qargs, node.cargs))
|
45
39
|
|
@@ -12,7 +12,6 @@
|
|
12
12
|
|
13
13
|
"""Helper function for converting a dag dependency to a dag circuit"""
|
14
14
|
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
15
|
-
from qiskit.dagcircuit.dagdependency import DAGDependency
|
16
15
|
|
17
16
|
|
18
17
|
def dagdependency_to_dag(dagdependency):
|
@@ -45,10 +44,5 @@ def dagdependency_to_dag(dagdependency):
|
|
45
44
|
|
46
45
|
# copy metadata
|
47
46
|
dagcircuit.global_phase = dagdependency.global_phase
|
48
|
-
if isinstance(dagdependency, DAGDependency):
|
49
|
-
dagcircuit._calibrations_prop = dagdependency._calibrations_prop
|
50
|
-
else:
|
51
|
-
# This can be _DAGDependencyV2
|
52
|
-
dagcircuit._calibrations_prop = dagdependency.calibrations
|
53
47
|
|
54
48
|
return dagcircuit
|
@@ -139,7 +139,9 @@ class BlockCollector:
|
|
139
139
|
"""Returns whether there are uncollected (pending) nodes"""
|
140
140
|
return len(self._pending_nodes) > 0
|
141
141
|
|
142
|
-
def collect_matching_block(
|
142
|
+
def collect_matching_block(
|
143
|
+
self, filter_fn: Callable, max_block_width: int | None
|
144
|
+
) -> list[DAGOpNode | DAGDepNode]:
|
143
145
|
"""Iteratively collects the largest block of input nodes (that is, nodes with
|
144
146
|
``_in_degree`` equal to 0) that match a given filtering function.
|
145
147
|
Examples of this include collecting blocks of swap gates,
|
@@ -150,6 +152,7 @@ class BlockCollector:
|
|
150
152
|
Returns the block of collected nodes.
|
151
153
|
"""
|
152
154
|
current_block = []
|
155
|
+
current_block_qargs = set()
|
153
156
|
unprocessed_pending_nodes = self._pending_nodes
|
154
157
|
self._pending_nodes = []
|
155
158
|
|
@@ -158,19 +161,28 @@ class BlockCollector:
|
|
158
161
|
# - any node that match filter_fn is added to the current_block,
|
159
162
|
# and some of its successors may be moved to unprocessed_pending_nodes.
|
160
163
|
while unprocessed_pending_nodes:
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
164
|
+
node = unprocessed_pending_nodes.pop()
|
165
|
+
|
166
|
+
if max_block_width is not None:
|
167
|
+
# for efficiency, only update new_qargs when max_block_width is specified
|
168
|
+
new_qargs = current_block_qargs.copy()
|
169
|
+
new_qargs.update(node.qargs)
|
170
|
+
width_within_budget = len(new_qargs) <= max_block_width
|
171
|
+
else:
|
172
|
+
new_qargs = set()
|
173
|
+
width_within_budget = True
|
174
|
+
|
175
|
+
if filter_fn(node) and width_within_budget:
|
176
|
+
current_block.append(node)
|
177
|
+
current_block_qargs = new_qargs
|
178
|
+
|
179
|
+
# update the _in_degree of node's successors
|
180
|
+
for suc in self._direct_succs(node):
|
181
|
+
self._in_degree[suc] -= 1
|
182
|
+
if self._in_degree[suc] == 0:
|
183
|
+
unprocessed_pending_nodes.append(suc)
|
184
|
+
else:
|
185
|
+
self._pending_nodes.append(node)
|
174
186
|
|
175
187
|
return current_block
|
176
188
|
|
@@ -181,6 +193,7 @@ class BlockCollector:
|
|
181
193
|
min_block_size=2,
|
182
194
|
split_layers=False,
|
183
195
|
collect_from_back=False,
|
196
|
+
max_block_width=None,
|
184
197
|
):
|
185
198
|
"""Collects all blocks that match a given filtering function filter_fn.
|
186
199
|
This iteratively finds the largest block that does not match filter_fn,
|
@@ -193,6 +206,8 @@ class BlockCollector:
|
|
193
206
|
qubit subsets. The option ``split_layers`` allows to split collected blocks
|
194
207
|
into layers of non-overlapping instructions. The option ``min_block_size``
|
195
208
|
specifies the minimum number of gates in the block for the block to be collected.
|
209
|
+
The option ``max_block_width`` specificies the maximum number of qubits over
|
210
|
+
which a block can be defined.
|
196
211
|
|
197
212
|
By default, blocks are collected in the direction from the inputs towards the outputs
|
198
213
|
of the circuit. The option ``collect_from_back`` allows to change this direction,
|
@@ -212,8 +227,8 @@ class BlockCollector:
|
|
212
227
|
# Iteratively collect non-matching and matching blocks.
|
213
228
|
matching_blocks: list[list[DAGOpNode | DAGDepNode]] = []
|
214
229
|
while self._have_uncollected_nodes():
|
215
|
-
self.collect_matching_block(not_filter_fn)
|
216
|
-
matching_block = self.collect_matching_block(filter_fn)
|
230
|
+
self.collect_matching_block(not_filter_fn, max_block_width=None)
|
231
|
+
matching_block = self.collect_matching_block(filter_fn, max_block_width=max_block_width)
|
217
232
|
if matching_block:
|
218
233
|
matching_blocks.append(matching_block)
|
219
234
|
|
@@ -377,10 +392,7 @@ class BlockCollapser:
|
|
377
392
|
wire_pos_map.update({qb: ix for ix, qb in enumerate(sorted_clbits)})
|
378
393
|
|
379
394
|
for node in block:
|
380
|
-
|
381
|
-
cond = getattr(node.op, "_condition", None)
|
382
|
-
if cond is not None:
|
383
|
-
instructions.c_if(*cond)
|
395
|
+
qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
|
384
396
|
|
385
397
|
# Collapse this quantum circuit into an operation.
|
386
398
|
op = collapse_fn(qc)
|
@@ -17,19 +17,17 @@ from __future__ import annotations
|
|
17
17
|
import math
|
18
18
|
import heapq
|
19
19
|
import typing
|
20
|
-
from collections import OrderedDict
|
20
|
+
from collections import OrderedDict
|
21
21
|
from collections.abc import Iterator
|
22
22
|
|
23
23
|
import rustworkx as rx
|
24
24
|
|
25
25
|
from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
|
26
26
|
from qiskit.circuit.controlflow import condition_resources
|
27
|
-
from qiskit.circuit
|
28
|
-
from qiskit.circuit
|
27
|
+
from qiskit.circuit import QuantumRegister, Qubit
|
28
|
+
from qiskit.circuit import ClassicalRegister, Clbit
|
29
29
|
from qiskit.dagcircuit.exceptions import DAGDependencyError
|
30
30
|
from qiskit.dagcircuit.dagdepnode import DAGDepNode
|
31
|
-
from qiskit.pulse import Schedule
|
32
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
33
31
|
|
34
32
|
if typing.TYPE_CHECKING:
|
35
33
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
@@ -115,7 +113,6 @@ class DAGDependency:
|
|
115
113
|
self.clbits = []
|
116
114
|
|
117
115
|
self._global_phase: float | ParameterExpression = 0.0
|
118
|
-
self._calibrations: dict[str, dict[tuple, Schedule]] = defaultdict(dict)
|
119
116
|
|
120
117
|
self.duration = None
|
121
118
|
self.unit = "dt"
|
@@ -146,37 +143,6 @@ class DAGDependency:
|
|
146
143
|
else:
|
147
144
|
self._global_phase = angle % (2 * math.pi)
|
148
145
|
|
149
|
-
@property
|
150
|
-
@deprecate_pulse_dependency(is_property=True)
|
151
|
-
def calibrations(self) -> dict[str, dict[tuple, Schedule]]:
|
152
|
-
"""Return calibration dictionary.
|
153
|
-
|
154
|
-
The custom pulse definition of a given gate is of the form
|
155
|
-
``{'gate_name': {(qubits, params): schedule}}``.
|
156
|
-
"""
|
157
|
-
return self._calibrations_prop
|
158
|
-
|
159
|
-
@calibrations.setter
|
160
|
-
@deprecate_pulse_dependency(is_property=True)
|
161
|
-
def calibrations(self, calibrations: dict[str, dict[tuple, Schedule]]):
|
162
|
-
"""Set the circuit calibration data from a dictionary of calibration definition.
|
163
|
-
|
164
|
-
Args:
|
165
|
-
calibrations (dict): A dictionary of input in the format
|
166
|
-
{'gate_name': {(qubits, gate_params): schedule}}
|
167
|
-
"""
|
168
|
-
self._calibrations_prop = calibrations
|
169
|
-
|
170
|
-
@property
|
171
|
-
def _calibrations_prop(self) -> dict[str, dict[tuple, Schedule]]:
|
172
|
-
"""An alternative path to be used internally to avoid deprecation warnings"""
|
173
|
-
return dict(self._calibrations)
|
174
|
-
|
175
|
-
@_calibrations_prop.setter
|
176
|
-
def _calibrations_prop(self, calibrations: dict[str, dict[tuple, Schedule]]):
|
177
|
-
"""An alternative path to be used internally to avoid deprecation warnings"""
|
178
|
-
self._calibrations = defaultdict(dict, calibrations)
|
179
|
-
|
180
146
|
def to_retworkx(self):
|
181
147
|
"""Returns the DAGDependency in retworkx format."""
|
182
148
|
return self._multi_graph
|
@@ -15,10 +15,9 @@
|
|
15
15
|
|
16
16
|
import itertools
|
17
17
|
import math
|
18
|
-
from collections import OrderedDict,
|
18
|
+
from collections import OrderedDict, namedtuple
|
19
19
|
from typing import Dict, List, Generator, Any
|
20
20
|
|
21
|
-
import numpy as np
|
22
21
|
import rustworkx as rx
|
23
22
|
|
24
23
|
from qiskit.circuit import (
|
@@ -26,11 +25,10 @@ from qiskit.circuit import (
|
|
26
25
|
ClassicalRegister,
|
27
26
|
Qubit,
|
28
27
|
Clbit,
|
29
|
-
Gate,
|
30
28
|
ParameterExpression,
|
31
29
|
)
|
32
30
|
from qiskit.circuit.controlflow import condition_resources
|
33
|
-
from qiskit.circuit
|
31
|
+
from qiskit.circuit import Bit
|
34
32
|
from qiskit.dagcircuit.dagnode import DAGOpNode
|
35
33
|
from qiskit.dagcircuit.exceptions import DAGDependencyError
|
36
34
|
from qiskit.circuit.commutation_checker import CommutationChecker
|
@@ -110,7 +108,6 @@ class _DAGDependencyV2:
|
|
110
108
|
self._clbit_indices: Dict[Clbit, BitLocations] = {}
|
111
109
|
|
112
110
|
self._global_phase = 0
|
113
|
-
self._calibrations = defaultdict(dict)
|
114
111
|
|
115
112
|
# Map of number of each kind of op, keyed on op name
|
116
113
|
self._op_names = {}
|
@@ -142,81 +139,6 @@ class _DAGDependencyV2:
|
|
142
139
|
else:
|
143
140
|
self._global_phase = angle % (2 * math.pi)
|
144
141
|
|
145
|
-
@property
|
146
|
-
def calibrations(self):
|
147
|
-
"""Return calibration dictionary.
|
148
|
-
|
149
|
-
The custom pulse definition of a given gate is of the form
|
150
|
-
``{'gate_name': {(qubits, params): schedule}}``.
|
151
|
-
"""
|
152
|
-
return dict(self._calibrations)
|
153
|
-
|
154
|
-
@calibrations.setter
|
155
|
-
def calibrations(self, calibrations):
|
156
|
-
"""Set the circuit calibration data from a dictionary of calibration definition.
|
157
|
-
|
158
|
-
Args:
|
159
|
-
calibrations (dict): A dictionary of input in the format
|
160
|
-
{'gate_name': {(qubits, gate_params): schedule}}
|
161
|
-
"""
|
162
|
-
self._calibrations = defaultdict(dict, calibrations)
|
163
|
-
|
164
|
-
def add_calibration(self, gate, qubits, schedule, params=None):
|
165
|
-
"""Register a low-level, custom pulse definition for the given gate.
|
166
|
-
|
167
|
-
Args:
|
168
|
-
gate (Union[Gate, str]): Gate information.
|
169
|
-
qubits (Union[int, Tuple[int]]): List of qubits to be measured.
|
170
|
-
schedule (Schedule): Schedule information.
|
171
|
-
params (Optional[List[Union[float, Parameter]]]): A list of parameters.
|
172
|
-
|
173
|
-
Raises:
|
174
|
-
Exception: if the gate is of type string and params is None.
|
175
|
-
"""
|
176
|
-
|
177
|
-
def _format(operand):
|
178
|
-
try:
|
179
|
-
# Using float/complex value as a dict key is not good idea.
|
180
|
-
# This makes the mapping quite sensitive to the rounding error.
|
181
|
-
# However, the mechanism is already tied to the execution model (i.e. pulse gate)
|
182
|
-
# and we cannot easily update this rule.
|
183
|
-
# The same logic exists in QuantumCircuit.add_calibration.
|
184
|
-
evaluated = complex(operand)
|
185
|
-
if np.isreal(evaluated):
|
186
|
-
evaluated = float(evaluated.real)
|
187
|
-
if evaluated.is_integer():
|
188
|
-
evaluated = int(evaluated)
|
189
|
-
return evaluated
|
190
|
-
except TypeError:
|
191
|
-
# Unassigned parameter
|
192
|
-
return operand
|
193
|
-
|
194
|
-
if isinstance(gate, Gate):
|
195
|
-
params = gate.params
|
196
|
-
gate = gate.name
|
197
|
-
if params is not None:
|
198
|
-
params = tuple(map(_format, params))
|
199
|
-
else:
|
200
|
-
params = ()
|
201
|
-
|
202
|
-
self._calibrations[gate][(tuple(qubits), params)] = schedule
|
203
|
-
|
204
|
-
def has_calibration_for(self, node):
|
205
|
-
"""Return True if the dag has a calibration defined for the node operation. In this
|
206
|
-
case, the operation does not need to be translated to the device basis.
|
207
|
-
"""
|
208
|
-
if not self.calibrations or node.op.name not in self.calibrations:
|
209
|
-
return False
|
210
|
-
qubits = tuple(self.qubits.index(qubit) for qubit in node.qargs)
|
211
|
-
params = []
|
212
|
-
for p in node.op.params:
|
213
|
-
if isinstance(p, ParameterExpression) and not p.parameters:
|
214
|
-
params.append(float(p))
|
215
|
-
else:
|
216
|
-
params.append(p)
|
217
|
-
params = tuple(params)
|
218
|
-
return (qubits, params) in self.calibrations[node.op.name]
|
219
|
-
|
220
142
|
def size(self):
|
221
143
|
"""Returns the number of gates in the circuit"""
|
222
144
|
return len(self._multi_graph)
|
@@ -525,8 +447,6 @@ class _DAGDependencyV2:
|
|
525
447
|
target_dag = _DAGDependencyV2()
|
526
448
|
target_dag.name = self.name
|
527
449
|
target_dag._global_phase = self._global_phase
|
528
|
-
target_dag.duration = self.duration
|
529
|
-
target_dag.unit = self.unit
|
530
450
|
target_dag.metadata = self.metadata
|
531
451
|
target_dag._key_cache = self._key_cache
|
532
452
|
target_dag.comm_checker = self.comm_checker
|
@@ -534,6 +454,9 @@ class _DAGDependencyV2:
|
|
534
454
|
target_dag.add_qubits(self.qubits)
|
535
455
|
target_dag.add_clbits(self.clbits)
|
536
456
|
|
457
|
+
target_dag.duration = self.duration
|
458
|
+
target_dag.unit = self.unit
|
459
|
+
|
537
460
|
for qreg in self.qregs.values():
|
538
461
|
target_dag.add_qreg(qreg)
|
539
462
|
for creg in self.cregs.values():
|
qiskit/dagcircuit/dagnode.py
CHANGED
@@ -19,6 +19,7 @@ import uuid
|
|
19
19
|
|
20
20
|
import qiskit._accelerate.circuit
|
21
21
|
from qiskit.circuit import (
|
22
|
+
BoxOp,
|
22
23
|
Clbit,
|
23
24
|
ClassicalRegister,
|
24
25
|
IfElseOp,
|
@@ -92,8 +93,12 @@ def _make_expr_key(bit_indices):
|
|
92
93
|
|
93
94
|
|
94
95
|
def _condition_op_eq(node1, node2, bit_indices1, bit_indices2):
|
95
|
-
cond1 =
|
96
|
-
cond2 =
|
96
|
+
cond1 = None
|
97
|
+
cond2 = None
|
98
|
+
if node1.is_control_flow():
|
99
|
+
cond1 = node1.op.condition
|
100
|
+
if node2.is_control_flow():
|
101
|
+
cond2 = node2.op.condition
|
97
102
|
if isinstance(cond1, expr.Expr) and isinstance(cond2, expr.Expr):
|
98
103
|
if not expr.structurally_equivalent(
|
99
104
|
cond1, cond2, _make_expr_key(bit_indices1), _make_expr_key(bit_indices2)
|
@@ -166,11 +171,18 @@ def _for_loop_eq(node1, node2, bit_indices1, bit_indices2):
|
|
166
171
|
)
|
167
172
|
|
168
173
|
|
174
|
+
def _box_eq(node1, node2, bit_indices1, bit_indices2):
|
175
|
+
return node1.op.duration == node2.op.duration and _circuit_to_dag(
|
176
|
+
node1.op.blocks[0], node1.qargs, node1.cargs, bit_indices1
|
177
|
+
) == _circuit_to_dag(node2.op.blocks[0], node2.qargs, node2.cargs, bit_indices2)
|
178
|
+
|
179
|
+
|
169
180
|
_SEMANTIC_EQ_CONTROL_FLOW = {
|
170
181
|
IfElseOp: _condition_op_eq,
|
171
182
|
WhileLoopOp: _condition_op_eq,
|
172
183
|
SwitchCaseOp: _switch_case_eq,
|
173
184
|
ForLoopOp: _for_loop_eq,
|
185
|
+
BoxOp: _box_eq,
|
174
186
|
}
|
175
187
|
|
176
188
|
_SEMANTIC_EQ_SYMMETRIC = frozenset({"barrier", "swap", "break_loop", "continue_loop"})
|
qiskit/passmanager/__init__.py
CHANGED
@@ -87,7 +87,10 @@ Such task might be easily done by converting the input numbers into string.
|
|
87
87
|
We use the pass manager framework here, putting the efficiency aside for
|
88
88
|
a moment to learn how to build a custom Qiskit compiler.
|
89
89
|
|
90
|
-
..
|
90
|
+
.. plot::
|
91
|
+
:include-source:
|
92
|
+
:nofigs:
|
93
|
+
:context:
|
91
94
|
|
92
95
|
from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
|
93
96
|
|
@@ -111,7 +114,10 @@ the final conversion.
|
|
111
114
|
|
112
115
|
Next, we implement a pass that removes a digit when the number is five.
|
113
116
|
|
114
|
-
..
|
117
|
+
.. plot::
|
118
|
+
:include-source:
|
119
|
+
:nofigs:
|
120
|
+
:context:
|
115
121
|
|
116
122
|
class RemoveFive(GenericPass):
|
117
123
|
|
@@ -124,7 +130,10 @@ Finally, we instantiate a pass manager and schedule the task with it.
|
|
124
130
|
Running the pass manager with random row of numbers returns
|
125
131
|
new numbers that don't contain five.
|
126
132
|
|
127
|
-
..
|
133
|
+
.. plot::
|
134
|
+
:include-source:
|
135
|
+
:nofigs:
|
136
|
+
:context:
|
128
137
|
|
129
138
|
pm = ToyPassManager()
|
130
139
|
pm.append(task)
|
@@ -143,7 +152,10 @@ six digits or less. Such control can be implemented by a flow controller.
|
|
143
152
|
We start from an analysis pass that provides the flow controller
|
144
153
|
with information about the number of digits.
|
145
154
|
|
146
|
-
..
|
155
|
+
.. plot::
|
156
|
+
:include-source:
|
157
|
+
:nofigs:
|
158
|
+
:context:
|
147
159
|
|
148
160
|
class CountDigits(GenericPass):
|
149
161
|
|
@@ -155,7 +167,10 @@ with information about the number of digits.
|
|
155
167
|
Then, we wrap the remove five task with the :class:`.ConditionalController`
|
156
168
|
that runs the stored tasks only when the condition is met.
|
157
169
|
|
158
|
-
..
|
170
|
+
.. plot::
|
171
|
+
:include-source:
|
172
|
+
:nofigs:
|
173
|
+
:context:
|
159
174
|
|
160
175
|
def digit_condition(property_set):
|
161
176
|
# Return True when condition is met.
|
@@ -168,7 +183,10 @@ that runs the stored tasks only when the condition is met.
|
|
168
183
|
|
169
184
|
As before, we schedule these passes with the pass manager and run.
|
170
185
|
|
171
|
-
..
|
186
|
+
.. plot::
|
187
|
+
:include-source:
|
188
|
+
:nofigs:
|
189
|
+
:context:
|
172
190
|
|
173
191
|
pm = ToyPassManager()
|
174
192
|
pm.append(analysis_task)
|
@@ -14,7 +14,6 @@
|
|
14
14
|
from __future__ import annotations
|
15
15
|
|
16
16
|
import logging
|
17
|
-
import warnings
|
18
17
|
from abc import ABC, abstractmethod
|
19
18
|
from collections.abc import Callable, Iterable
|
20
19
|
from itertools import chain
|
@@ -30,8 +29,6 @@ from .compilation_status import PropertySet, WorkflowStatus, PassManagerState
|
|
30
29
|
|
31
30
|
logger = logging.getLogger(__name__)
|
32
31
|
|
33
|
-
_MISSING = object()
|
34
|
-
|
35
32
|
|
36
33
|
class BasePassManager(ABC):
|
37
34
|
"""Pass manager base class."""
|
@@ -178,7 +175,7 @@ class BasePassManager(ABC):
|
|
178
175
|
callback: Callable = None,
|
179
176
|
num_processes: int = None,
|
180
177
|
*,
|
181
|
-
property_set: object =
|
178
|
+
property_set: dict[str, object] | None = None,
|
182
179
|
**kwargs,
|
183
180
|
) -> Any:
|
184
181
|
"""Run all the passes on the specified ``in_programs``.
|
@@ -216,25 +213,16 @@ class BasePassManager(ABC):
|
|
216
213
|
execution is enabled. This argument overrides ``num_processes`` in the user
|
217
214
|
configuration file, and the ``QISKIT_NUM_PROCS`` environment variable. If set
|
218
215
|
to ``None`` the system default or local user configuration will be used.
|
219
|
-
property_set:
|
220
|
-
|
221
|
-
|
216
|
+
property_set: If given, the initial value to use as the :class:`.PropertySet` for the
|
217
|
+
pass manager pipeline. This can be used to persist analysis from one run to
|
218
|
+
another, in cases where you know the analysis is safe to share. Beware that some
|
219
|
+
analysis will be specific to the input circuit and the particular :class:`.Target`,
|
220
|
+
so you should take a lot of care when using this argument.
|
222
221
|
kwargs: Arbitrary arguments passed to the compiler frontend and backend.
|
223
222
|
|
224
223
|
Returns:
|
225
224
|
The transformed program(s).
|
226
225
|
"""
|
227
|
-
if property_set is not _MISSING:
|
228
|
-
warnings.warn(
|
229
|
-
"From Qiskit 2.0, 'property_set' will be a reserved keyword argument of"
|
230
|
-
" 'BasePassManager.run', and not passed on to the conversion functions."
|
231
|
-
" This subclass of 'BasePassManager' needs to use a different keyword argument"
|
232
|
-
" for passing on this data.",
|
233
|
-
FutureWarning,
|
234
|
-
stacklevel=2,
|
235
|
-
)
|
236
|
-
kwargs["property_set"] = property_set
|
237
|
-
|
238
226
|
if not self._tasks and not kwargs and callback is None:
|
239
227
|
return in_programs
|
240
228
|
|
@@ -247,7 +235,13 @@ class BasePassManager(ABC):
|
|
247
235
|
# ourselves, since that can be quite expensive.
|
248
236
|
if len(in_programs) == 1 or not should_run_in_parallel(num_processes):
|
249
237
|
out = [
|
250
|
-
_run_workflow(
|
238
|
+
_run_workflow(
|
239
|
+
program=program,
|
240
|
+
pass_manager=self,
|
241
|
+
callback=callback,
|
242
|
+
initial_property_set=property_set,
|
243
|
+
**kwargs,
|
244
|
+
)
|
251
245
|
for program in in_programs
|
252
246
|
]
|
253
247
|
if len(in_programs) == 1 and not is_list:
|
@@ -264,7 +258,10 @@ class BasePassManager(ABC):
|
|
264
258
|
return parallel_map(
|
265
259
|
_run_workflow_in_new_process,
|
266
260
|
values=in_programs,
|
267
|
-
task_kwargs={
|
261
|
+
task_kwargs={
|
262
|
+
"pass_manager_bin": dill.dumps(self),
|
263
|
+
"initial_property_set": property_set,
|
264
|
+
},
|
268
265
|
num_processes=num_processes,
|
269
266
|
)
|
270
267
|
|
@@ -288,6 +285,8 @@ class BasePassManager(ABC):
|
|
288
285
|
def _run_workflow(
|
289
286
|
program: Any,
|
290
287
|
pass_manager: BasePassManager,
|
288
|
+
*,
|
289
|
+
initial_property_set: dict[str, object] | None = None,
|
291
290
|
**kwargs,
|
292
291
|
) -> Any:
|
293
292
|
"""Run single program optimization with a pass manager.
|
@@ -307,12 +306,12 @@ def _run_workflow(
|
|
307
306
|
input_program=program,
|
308
307
|
**kwargs,
|
309
308
|
)
|
309
|
+
property_set = (
|
310
|
+
PropertySet() if initial_property_set is None else PropertySet(initial_property_set)
|
311
|
+
)
|
310
312
|
passmanager_ir, final_state = flow_controller.execute(
|
311
313
|
passmanager_ir=passmanager_ir,
|
312
|
-
state=PassManagerState(
|
313
|
-
workflow_status=initial_status,
|
314
|
-
property_set=PropertySet(),
|
315
|
-
),
|
314
|
+
state=PassManagerState(workflow_status=initial_status, property_set=property_set),
|
316
315
|
callback=kwargs.get("callback", None),
|
317
316
|
)
|
318
317
|
# The `property_set` has historically been returned as a mutable attribute on `PassManager`
|
@@ -335,6 +334,8 @@ def _run_workflow(
|
|
335
334
|
def _run_workflow_in_new_process(
|
336
335
|
program: Any,
|
337
336
|
pass_manager_bin: bytes,
|
337
|
+
*,
|
338
|
+
initial_property_set: dict[str, object] | None,
|
338
339
|
) -> Any:
|
339
340
|
"""Run single program optimization in new process.
|
340
341
|
|
@@ -348,4 +349,5 @@ def _run_workflow_in_new_process(
|
|
348
349
|
return _run_workflow(
|
349
350
|
program=program,
|
350
351
|
pass_manager=dill.loads(pass_manager_bin),
|
352
|
+
initial_property_set=initial_property_set,
|
351
353
|
)
|