qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +2 -6
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +13 -60
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +5 -5
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +2 -80
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +154 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -10
- qiskit/result/result.py +28 -126
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +1 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +67 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -17,7 +17,9 @@ from __future__ import annotations
|
|
17
17
|
__all__ = [
|
18
18
|
"ExprVisitor",
|
19
19
|
"iter_vars",
|
20
|
+
"iter_identifiers",
|
20
21
|
"structurally_equivalent",
|
22
|
+
"is_lvalue",
|
21
23
|
]
|
22
24
|
|
23
25
|
import typing
|
@@ -43,6 +45,9 @@ class ExprVisitor(typing.Generic[_T_co]):
|
|
43
45
|
def visit_var(self, node: expr.Var, /) -> _T_co: # pragma: no cover
|
44
46
|
return self.visit_generic(node)
|
45
47
|
|
48
|
+
def visit_stretch(self, node: expr.Stretch, /) -> _T_co: # pragma: no cover
|
49
|
+
return self.visit_generic(node)
|
50
|
+
|
46
51
|
def visit_value(self, node: expr.Value, /) -> _T_co: # pragma: no cover
|
47
52
|
return self.visit_generic(node)
|
48
53
|
|
@@ -65,6 +70,36 @@ class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
|
|
65
70
|
def visit_var(self, node, /):
|
66
71
|
yield node
|
67
72
|
|
73
|
+
def visit_stretch(self, node, /):
|
74
|
+
yield from ()
|
75
|
+
|
76
|
+
def visit_value(self, node, /):
|
77
|
+
yield from ()
|
78
|
+
|
79
|
+
def visit_unary(self, node, /):
|
80
|
+
yield from node.operand.accept(self)
|
81
|
+
|
82
|
+
def visit_binary(self, node, /):
|
83
|
+
yield from node.left.accept(self)
|
84
|
+
yield from node.right.accept(self)
|
85
|
+
|
86
|
+
def visit_cast(self, node, /):
|
87
|
+
yield from node.operand.accept(self)
|
88
|
+
|
89
|
+
def visit_index(self, node, /):
|
90
|
+
yield from node.target.accept(self)
|
91
|
+
yield from node.index.accept(self)
|
92
|
+
|
93
|
+
|
94
|
+
class _IdentWalkerImpl(ExprVisitor[typing.Iterable[typing.Union[expr.Var, expr.Stretch]]]):
|
95
|
+
__slots__ = ()
|
96
|
+
|
97
|
+
def visit_var(self, node, /):
|
98
|
+
yield node
|
99
|
+
|
100
|
+
def visit_stretch(self, node, /):
|
101
|
+
yield node
|
102
|
+
|
68
103
|
def visit_value(self, node, /):
|
69
104
|
yield from ()
|
70
105
|
|
@@ -84,6 +119,7 @@ class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
|
|
84
119
|
|
85
120
|
|
86
121
|
_VAR_WALKER = _VarWalkerImpl()
|
122
|
+
_IDENT_WALKER = _IdentWalkerImpl()
|
87
123
|
|
88
124
|
|
89
125
|
def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
|
@@ -102,10 +138,39 @@ def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
|
|
102
138
|
for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
|
103
139
|
if isinstance(node.var, ClassicalRegister):
|
104
140
|
print(node.var.name)
|
141
|
+
|
142
|
+
.. seealso::
|
143
|
+
:func:`iter_identifiers`
|
144
|
+
Get an iterator over all identifier nodes in the expression, including
|
145
|
+
both :class:`~.expr.Var` and :class:`~.expr.Stretch` nodes.
|
105
146
|
"""
|
106
147
|
yield from node.accept(_VAR_WALKER)
|
107
148
|
|
108
149
|
|
150
|
+
def iter_identifiers(node: expr.Expr) -> typing.Iterator[typing.Union[expr.Var, expr.Stretch]]:
|
151
|
+
"""Get an iterator over the :class:`~.expr.Var` and :class:`~.expr.Stretch`
|
152
|
+
nodes referenced at any level in the given :class:`~.expr.Expr`.
|
153
|
+
|
154
|
+
Examples:
|
155
|
+
Print out the name of each :class:`.ClassicalRegister` encountered::
|
156
|
+
|
157
|
+
from qiskit.circuit import ClassicalRegister
|
158
|
+
from qiskit.circuit.classical import expr
|
159
|
+
|
160
|
+
cr1 = ClassicalRegister(3, "a")
|
161
|
+
cr2 = ClassicalRegister(3, "b")
|
162
|
+
|
163
|
+
for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
|
164
|
+
if isinstance(node.var, ClassicalRegister):
|
165
|
+
print(node.var.name)
|
166
|
+
|
167
|
+
.. seealso::
|
168
|
+
:func:`iter_vars`
|
169
|
+
Get an iterator over just the :class:`~.expr.Var` nodes in the expression.
|
170
|
+
"""
|
171
|
+
yield from node.accept(_IDENT_WALKER)
|
172
|
+
|
173
|
+
|
109
174
|
class _StructuralEquivalenceImpl(ExprVisitor[bool]):
|
110
175
|
# The strategy here is to continue to do regular double dispatch through the visitor format,
|
111
176
|
# since we simply exit out with a ``False`` as soon as the structure of the two trees isn't the
|
@@ -134,6 +199,11 @@ class _StructuralEquivalenceImpl(ExprVisitor[bool]):
|
|
134
199
|
other_var = self.other.var
|
135
200
|
return self_var == other_var
|
136
201
|
|
202
|
+
def visit_stretch(self, node, /):
|
203
|
+
if self.other.__class__ is not node.__class__:
|
204
|
+
return False
|
205
|
+
return node.var == self.other.var
|
206
|
+
|
137
207
|
def visit_value(self, node, /):
|
138
208
|
return (
|
139
209
|
node.__class__ is self.other.__class__
|
@@ -240,6 +310,9 @@ class _IsLValueImpl(ExprVisitor[bool]):
|
|
240
310
|
def visit_var(self, node, /):
|
241
311
|
return True
|
242
312
|
|
313
|
+
def visit_stretch(self, node, /):
|
314
|
+
return False
|
315
|
+
|
243
316
|
def visit_value(self, node, /):
|
244
317
|
return False
|
245
318
|
|
@@ -268,6 +341,8 @@ def is_lvalue(node: expr.Expr, /) -> bool:
|
|
268
341
|
the scope that attempts to write to it. This would be an access property of the containing
|
269
342
|
program, however, and not an inherent property of the expression system.
|
270
343
|
|
344
|
+
A constant expression is never an lvalue.
|
345
|
+
|
271
346
|
Examples:
|
272
347
|
Literal values are never l-values; there's no memory location associated with (for example)
|
273
348
|
the constant ``1``::
|
@@ -33,16 +33,15 @@ data, and it's best to point to the same instance of the data where possible rat
|
|
33
33
|
heap-allocating a new version of the same thing. Where possible, the class constructors will return
|
34
34
|
singleton instances to facilitate this.
|
35
35
|
|
36
|
-
The
|
37
|
-
|
38
|
-
:class
|
36
|
+
The :class:`Bool` type represents :class:`.Clbit` and the literals ``True`` and ``False``, the
|
37
|
+
:class:`Uint` type represents :class:`.ClassicalRegister` and Python integers, the :class:`Float`
|
38
|
+
type represents Python floats, and the :class:`Duration` type represents a duration for use in
|
39
|
+
timing-aware circuit operations.
|
39
40
|
|
40
41
|
.. autoclass:: Bool
|
41
42
|
.. autoclass:: Uint
|
42
|
-
|
43
|
-
|
44
|
-
type, which may be slightly different to the 'classical' programming languages you are used to.
|
45
|
-
|
43
|
+
.. autoclass:: Float
|
44
|
+
.. autoclass:: Duration
|
46
45
|
|
47
46
|
Working with types
|
48
47
|
==================
|
@@ -89,12 +88,17 @@ embedded into the :mod:`types` module. You can query the casting kinds using :f
|
|
89
88
|
The return values from this function are an enumeration explaining the types of cast that are
|
90
89
|
allowed from the left type to the right type.
|
91
90
|
|
91
|
+
Note that casts between :class:`Float` and :class:`Uint` are considered dangerous in either
|
92
|
+
direction, and must be done explicitly.
|
93
|
+
|
92
94
|
.. autoclass:: CastKind
|
93
95
|
"""
|
94
96
|
|
95
97
|
__all__ = [
|
96
98
|
"Type",
|
97
99
|
"Bool",
|
100
|
+
"Duration",
|
101
|
+
"Float",
|
98
102
|
"Uint",
|
99
103
|
"Ordering",
|
100
104
|
"order",
|
@@ -105,5 +109,5 @@ __all__ = [
|
|
105
109
|
"cast_kind",
|
106
110
|
]
|
107
111
|
|
108
|
-
from .types import Type, Bool, Uint
|
112
|
+
from .types import Type, Bool, Duration, Float, Uint
|
109
113
|
from .ordering import Ordering, order, is_subtype, is_supertype, greater, CastKind, cast_kind
|
@@ -26,7 +26,7 @@ __all__ = [
|
|
26
26
|
|
27
27
|
import enum
|
28
28
|
|
29
|
-
from .types import Type, Bool, Uint
|
29
|
+
from .types import Type, Bool, Duration, Float, Uint
|
30
30
|
|
31
31
|
|
32
32
|
# While the type system is simple, it's overkill to represent the complete partial ordering graph of
|
@@ -55,10 +55,6 @@ class Ordering(enum.Enum):
|
|
55
55
|
return str(self)
|
56
56
|
|
57
57
|
|
58
|
-
def _order_bool_bool(_a: Bool, _b: Bool, /) -> Ordering:
|
59
|
-
return Ordering.EQUAL
|
60
|
-
|
61
|
-
|
62
58
|
def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
|
63
59
|
if left.width < right.width:
|
64
60
|
return Ordering.LESS
|
@@ -68,8 +64,10 @@ def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
|
|
68
64
|
|
69
65
|
|
70
66
|
_ORDERERS = {
|
71
|
-
(Bool, Bool):
|
67
|
+
(Bool, Bool): lambda _a, _b, /: Ordering.EQUAL,
|
72
68
|
(Uint, Uint): _order_uint_uint,
|
69
|
+
(Float, Float): lambda _a, _b, /: Ordering.EQUAL,
|
70
|
+
(Duration, Duration): lambda _a, _b, /: Ordering.EQUAL,
|
73
71
|
}
|
74
72
|
|
75
73
|
|
@@ -195,8 +193,14 @@ def _uint_cast(from_: Uint, to_: Uint, /) -> CastKind:
|
|
195
193
|
_ALLOWED_CASTS = {
|
196
194
|
(Bool, Bool): lambda _a, _b, /: CastKind.EQUAL,
|
197
195
|
(Bool, Uint): lambda _a, _b, /: CastKind.LOSSLESS,
|
196
|
+
(Bool, Float): lambda _a, _b, /: CastKind.LOSSLESS,
|
198
197
|
(Uint, Bool): lambda _a, _b, /: CastKind.IMPLICIT,
|
199
198
|
(Uint, Uint): _uint_cast,
|
199
|
+
(Uint, Float): lambda _a, _b, /: CastKind.DANGEROUS,
|
200
|
+
(Float, Float): lambda _a, _b, /: CastKind.EQUAL,
|
201
|
+
(Float, Uint): lambda _a, _b, /: CastKind.DANGEROUS,
|
202
|
+
(Float, Bool): lambda _a, _b, /: CastKind.DANGEROUS,
|
203
|
+
(Duration, Duration): lambda _a, _b, /: CastKind.EQUAL,
|
200
204
|
}
|
201
205
|
|
202
206
|
|
@@ -205,7 +209,10 @@ def cast_kind(from_: Type, to_: Type, /) -> CastKind:
|
|
205
209
|
|
206
210
|
Examples:
|
207
211
|
|
208
|
-
..
|
212
|
+
.. plot::
|
213
|
+
:include-source:
|
214
|
+
:nofigs:
|
215
|
+
|
209
216
|
|
210
217
|
>>> from qiskit.circuit.classical import types
|
211
218
|
>>> types.cast_kind(types.Bool(), types.Bool())
|
@@ -22,6 +22,8 @@ from __future__ import annotations
|
|
22
22
|
__all__ = [
|
23
23
|
"Type",
|
24
24
|
"Bool",
|
25
|
+
"Duration",
|
26
|
+
"Float",
|
25
27
|
"Uint",
|
26
28
|
]
|
27
29
|
|
@@ -115,3 +117,37 @@ class Uint(Type):
|
|
115
117
|
|
116
118
|
def __eq__(self, other):
|
117
119
|
return isinstance(other, Uint) and self.width == other.width
|
120
|
+
|
121
|
+
|
122
|
+
@typing.final
|
123
|
+
class Float(Type, metaclass=_Singleton):
|
124
|
+
"""An IEEE-754 double-precision floating point number.
|
125
|
+
In the future, this may also be used to represent other fixed-width floats.
|
126
|
+
"""
|
127
|
+
|
128
|
+
__slots__ = ()
|
129
|
+
|
130
|
+
def __repr__(self):
|
131
|
+
return "Float()"
|
132
|
+
|
133
|
+
def __hash__(self):
|
134
|
+
return hash(self.__class__)
|
135
|
+
|
136
|
+
def __eq__(self, other):
|
137
|
+
return isinstance(other, Float)
|
138
|
+
|
139
|
+
|
140
|
+
@typing.final
|
141
|
+
class Duration(Type, metaclass=_Singleton):
|
142
|
+
"""A length of time, possibly negative."""
|
143
|
+
|
144
|
+
__slots__ = ()
|
145
|
+
|
146
|
+
def __repr__(self):
|
147
|
+
return "Duration()"
|
148
|
+
|
149
|
+
def __hash__(self):
|
150
|
+
return hash(self.__class__)
|
151
|
+
|
152
|
+
def __eq__(self, other):
|
153
|
+
return isinstance(other, Duration)
|
@@ -12,6 +12,7 @@
|
|
12
12
|
|
13
13
|
"""Code from commutative_analysis pass that checks commutation relations between DAG nodes."""
|
14
14
|
|
15
|
+
from __future__ import annotations
|
15
16
|
from typing import List, Union, Set, Optional
|
16
17
|
|
17
18
|
from qiskit.circuit.operation import Operation
|
@@ -19,11 +20,31 @@ from qiskit._accelerate.commutation_checker import CommutationChecker as RustChe
|
|
19
20
|
|
20
21
|
|
21
22
|
class CommutationChecker:
|
22
|
-
"""
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
r"""Check commutations of two operations.
|
24
|
+
|
25
|
+
Two unitaries :math:`A` and :math:`B` on :math:`n` qubits commute if
|
26
|
+
|
27
|
+
.. math::
|
28
|
+
|
29
|
+
\frac{2^n F_{\text{process}}(AB, BA) + 1}{2^n + 1} > 1 - \varepsilon,
|
30
|
+
|
31
|
+
where
|
32
|
+
|
33
|
+
.. math::
|
34
|
+
|
35
|
+
F_{\text{process}}(U_1, U_2) = \left|\frac{\mathrm{Tr}(U_1 U_2^\dagger)}{2^n} \right|^2,
|
36
|
+
|
37
|
+
and we set :math:`\varepsilon` to :math:`10^{-12}` to account for round-off errors on
|
38
|
+
few-qubit systems. This metric is chosen for consistency with other closeness checks in
|
39
|
+
Qiskit.
|
40
|
+
|
41
|
+
When possible, commutation relations are queried from a lookup table. This is the case
|
42
|
+
for standard gates without parameters (such as :class:`.XGate` or :class:`.HGate`) or
|
43
|
+
gates with free parameters (such as :class:`.RXGate` with a :class:`.ParameterExpression` as
|
44
|
+
angle). Otherwise, a matrix-based check is performed, where two operations are said to
|
45
|
+
commute, if the average gate fidelity of performing the commutation is above a certain threshold
|
46
|
+
(see ``approximation_degree``). The result of this commutation is then added to the
|
47
|
+
cached lookup table.
|
27
48
|
"""
|
28
49
|
|
29
50
|
def __init__(
|
@@ -40,9 +61,10 @@ class CommutationChecker:
|
|
40
61
|
op1,
|
41
62
|
op2,
|
42
63
|
max_num_qubits: int = 3,
|
64
|
+
approximation_degree: float = 1.0,
|
43
65
|
) -> bool:
|
44
66
|
"""Checks if two DAGOpNodes commute."""
|
45
|
-
return self.cc.commute_nodes(op1, op2, max_num_qubits)
|
67
|
+
return self.cc.commute_nodes(op1, op2, max_num_qubits, approximation_degree)
|
46
68
|
|
47
69
|
def commute(
|
48
70
|
self,
|
@@ -53,6 +75,7 @@ class CommutationChecker:
|
|
53
75
|
qargs2: List,
|
54
76
|
cargs2: List,
|
55
77
|
max_num_qubits: int = 3,
|
78
|
+
approximation_degree: float = 1.0,
|
56
79
|
) -> bool:
|
57
80
|
"""
|
58
81
|
Checks if two Operations commute. The return value of `True` means that the operations
|
@@ -69,11 +92,15 @@ class CommutationChecker:
|
|
69
92
|
cargs2: second operation's clbits.
|
70
93
|
max_num_qubits: the maximum number of qubits to consider, the check may be skipped if
|
71
94
|
the number of qubits for either operation exceeds this amount.
|
95
|
+
approximation_degree: If the average gate fidelity in between the two operations
|
96
|
+
is above this number (up to ``1e-12``) they are assumed to commute.
|
72
97
|
|
73
98
|
Returns:
|
74
99
|
bool: whether two operations commute.
|
75
100
|
"""
|
76
|
-
return self.cc.commute(
|
101
|
+
return self.cc.commute(
|
102
|
+
op1, qargs1, cargs1, op2, qargs2, cargs2, max_num_qubits, approximation_degree
|
103
|
+
)
|
77
104
|
|
78
105
|
def num_cached_entries(self):
|
79
106
|
"""Returns number of cached entries"""
|
@@ -18,11 +18,42 @@ from .control_flow import ControlFlowOp
|
|
18
18
|
from .continue_loop import ContinueLoopOp
|
19
19
|
from .break_loop import BreakLoopOp
|
20
20
|
|
21
|
+
from .box import BoxOp
|
21
22
|
from .if_else import IfElseOp
|
22
23
|
from .while_loop import WhileLoopOp
|
23
24
|
from .for_loop import ForLoopOp
|
24
25
|
from .switch_case import SwitchCaseOp, CASE_DEFAULT
|
25
26
|
|
26
27
|
|
27
|
-
CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case"))
|
28
|
+
CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case", "box"))
|
28
29
|
"""Set of the instruction names of Qiskit's known control-flow operations."""
|
30
|
+
|
31
|
+
|
32
|
+
def get_control_flow_name_mapping():
|
33
|
+
"""Return a dictionary mapping the names of control-flow operations
|
34
|
+
to their corresponding classes."
|
35
|
+
|
36
|
+
Examples:
|
37
|
+
|
38
|
+
.. code-block:: python
|
39
|
+
|
40
|
+
from qiskit.circuit import get_control_flow_name_mapping
|
41
|
+
|
42
|
+
ctrl_flow_name_map = get_control_flow_name_mapping()
|
43
|
+
if_else_object = ctrl_flow_name_map["if_else"]
|
44
|
+
|
45
|
+
print(if_else_object)
|
46
|
+
|
47
|
+
.. code-block:: text
|
48
|
+
|
49
|
+
<class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
|
50
|
+
"""
|
51
|
+
|
52
|
+
name_mapping = {
|
53
|
+
"if_else": IfElseOp,
|
54
|
+
"while_loop": WhileLoopOp,
|
55
|
+
"for_loop": ForLoopOp,
|
56
|
+
"switch_case": SwitchCaseOp,
|
57
|
+
"box": BoxOp,
|
58
|
+
}
|
59
|
+
return name_mapping
|
@@ -17,14 +17,16 @@ from __future__ import annotations
|
|
17
17
|
import dataclasses
|
18
18
|
from typing import Iterable, Tuple, Set, Union, TypeVar, TYPE_CHECKING
|
19
19
|
|
20
|
+
from qiskit.circuit import ( # pylint: disable=cyclic-import
|
21
|
+
ClassicalRegister,
|
22
|
+
Clbit,
|
23
|
+
QuantumRegister,
|
24
|
+
)
|
20
25
|
from qiskit.circuit.classical import expr, types
|
21
26
|
from qiskit.circuit.exceptions import CircuitError
|
22
|
-
from qiskit.circuit.register import Register
|
23
|
-
from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
|
24
|
-
from qiskit.circuit.quantumregister import QuantumRegister
|
25
27
|
|
26
28
|
if TYPE_CHECKING:
|
27
|
-
from qiskit.circuit import QuantumCircuit
|
29
|
+
from qiskit.circuit import QuantumCircuit, Register
|
28
30
|
|
29
31
|
_ConditionT = TypeVar(
|
30
32
|
"_ConditionT", bound=Union[Tuple[ClassicalRegister, int], Tuple[Clbit, int], expr.Expr]
|
@@ -180,10 +182,12 @@ def _unify_circuit_resources_rebuild( # pylint: disable=invalid-name # (it's t
|
|
180
182
|
*circuit.cregs,
|
181
183
|
global_phase=circuit.global_phase,
|
182
184
|
inputs=circuit.iter_input_vars(),
|
183
|
-
captures=circuit.
|
185
|
+
captures=circuit.iter_captures(),
|
184
186
|
)
|
185
187
|
for var in circuit.iter_declared_vars():
|
186
188
|
out.add_uninitialized_var(var)
|
189
|
+
for stretch in circuit.iter_declared_stretches():
|
190
|
+
out.add_stretch(stretch)
|
187
191
|
for instruction in circuit.data:
|
188
192
|
out._append(instruction)
|
189
193
|
out_circuits.append(out)
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2025.
|
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
|
+
"""Simple box basic block."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import typing
|
18
|
+
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from .control_flow import ControlFlowOp
|
21
|
+
|
22
|
+
if typing.TYPE_CHECKING:
|
23
|
+
from qiskit.circuit import QuantumCircuit
|
24
|
+
|
25
|
+
|
26
|
+
class BoxOp(ControlFlowOp):
|
27
|
+
"""A scoped "box" of operations on a circuit that are treated atomically in the greater context.
|
28
|
+
|
29
|
+
A "box" is a control-flow construct that is entered unconditionally. The contents of the box
|
30
|
+
behave somewhat as if the start and end of the box were barriers, except it is permissible to
|
31
|
+
commute operations "all the way" through the box. The box is also an explicit scope for the
|
32
|
+
purposes of variables, stretches and compiler passes.
|
33
|
+
|
34
|
+
Typically you create this by using the builder-interface form of :meth:`.QuantumCircuit.box`.
|
35
|
+
"""
|
36
|
+
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
body: QuantumCircuit,
|
40
|
+
duration: None = None,
|
41
|
+
unit: typing.Literal["dt", "s", "ms", "us", "ns", "ps"] = "dt",
|
42
|
+
label: str | None = None,
|
43
|
+
):
|
44
|
+
"""
|
45
|
+
Default constructor of :class:`BoxOp`.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
body: the circuit to use as the body of the box. This should explicit close over any
|
49
|
+
:class:`.expr.Var` variables that must be incident from the outer circuit. The
|
50
|
+
expected number of qubit and clbits for the resulting instruction are inferred from
|
51
|
+
the number in the circuit, even if they are idle.
|
52
|
+
duration: an optional duration for the box as a whole.
|
53
|
+
unit: the unit of the ``duration``.
|
54
|
+
label: an optional string label for the instruction.
|
55
|
+
"""
|
56
|
+
super().__init__("box", body.num_qubits, body.num_clbits, [body], label=label)
|
57
|
+
self.duration = duration
|
58
|
+
self.unit = unit
|
59
|
+
|
60
|
+
@property
|
61
|
+
def params(self):
|
62
|
+
return self._params
|
63
|
+
|
64
|
+
@params.setter
|
65
|
+
def params(self, parameters):
|
66
|
+
# pylint: disable=cyclic-import
|
67
|
+
from qiskit.circuit import QuantumCircuit
|
68
|
+
|
69
|
+
(body,) = parameters
|
70
|
+
|
71
|
+
if not isinstance(body, QuantumCircuit):
|
72
|
+
raise CircuitError(
|
73
|
+
"BoxOp expects a body parameter of type "
|
74
|
+
f"QuantumCircuit, but received {type(body)}."
|
75
|
+
)
|
76
|
+
|
77
|
+
if body.num_qubits != self.num_qubits or body.num_clbits != self.num_clbits:
|
78
|
+
raise CircuitError(
|
79
|
+
"Attempted to assign a body parameter with a num_qubits or "
|
80
|
+
"num_clbits different than that of the BoxOp. "
|
81
|
+
f"BoxOp num_qubits/clbits: {self.num_qubits}/{self.num_clbits} "
|
82
|
+
f"Supplied body num_qubits/clbits: {body.num_qubits}/{body.num_clbits}."
|
83
|
+
)
|
84
|
+
|
85
|
+
self._params = [body]
|
86
|
+
|
87
|
+
@property
|
88
|
+
def body(self):
|
89
|
+
"""The ``body`` :class:`.QuantumCircuit` of the operation.
|
90
|
+
|
91
|
+
This is the same as object returned as the sole entry in :meth:`params` and :meth:`blocks`.
|
92
|
+
"""
|
93
|
+
# Not settable via this property; the only meaningful way to replace a body is via
|
94
|
+
# larger `QuantumCircuit` methods, or using `replace_blocks`.
|
95
|
+
return self.params[0]
|
96
|
+
|
97
|
+
@property
|
98
|
+
def blocks(self):
|
99
|
+
return (self._params[0],)
|
100
|
+
|
101
|
+
def replace_blocks(self, blocks):
|
102
|
+
(body,) = blocks
|
103
|
+
return BoxOp(body, duration=self.duration, unit=self.unit, label=self.label)
|
104
|
+
|
105
|
+
def __eq__(self, other):
|
106
|
+
return (
|
107
|
+
isinstance(other, BoxOp)
|
108
|
+
and self.duration == other.duration
|
109
|
+
and self.unit == other.unit
|
110
|
+
and super().__eq__(other)
|
111
|
+
)
|
112
|
+
|
113
|
+
|
114
|
+
class BoxContext:
|
115
|
+
"""Context-manager that powers :meth:`.QuantumCircuit.box`.
|
116
|
+
|
117
|
+
This is not part of the public interface, and should not be instantiated by users.
|
118
|
+
"""
|
119
|
+
|
120
|
+
__slots__ = ("_circuit", "_duration", "_unit", "_label")
|
121
|
+
|
122
|
+
def __init__(
|
123
|
+
self,
|
124
|
+
circuit: QuantumCircuit,
|
125
|
+
*,
|
126
|
+
duration: None = None,
|
127
|
+
unit: typing.Literal["dt", "s", "ms", "us", "ns", "ps"] = "dt",
|
128
|
+
label: str | None = None,
|
129
|
+
):
|
130
|
+
"""
|
131
|
+
Args:
|
132
|
+
circuit: the outermost scope of the circuit under construction.
|
133
|
+
duration: the final duration of the box.
|
134
|
+
unit: the unit of ``duration``.
|
135
|
+
label: an optional label for the box.
|
136
|
+
"""
|
137
|
+
self._circuit = circuit
|
138
|
+
self._duration = duration
|
139
|
+
self._unit = unit
|
140
|
+
self._label = label
|
141
|
+
|
142
|
+
def __enter__(self):
|
143
|
+
# For a box to have the semantics of internal qubit alignment with a resolvable duration, we
|
144
|
+
# can't allow conditional jumps to exit it. Technically an unconditional `break` or
|
145
|
+
# `continue` could work, but we're not getting into that.
|
146
|
+
self._circuit._push_scope(allow_jumps=False)
|
147
|
+
|
148
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
149
|
+
if exc_type is not None:
|
150
|
+
# If we're leaving the context manager because an exception was raised, there's nothing
|
151
|
+
# to do except restore the circuit state.
|
152
|
+
self._circuit._pop_scope()
|
153
|
+
return False
|
154
|
+
scope = self._circuit._pop_scope()
|
155
|
+
# Boxes do not need to pass any further resources in, because there's no jumps out of a
|
156
|
+
# `box` permitted.
|
157
|
+
body = scope.build(scope.qubits(), scope.clbits())
|
158
|
+
self._circuit.append(
|
159
|
+
BoxOp(body, duration=self._duration, unit=self._unit, label=self._label),
|
160
|
+
body.qubits,
|
161
|
+
body.clbits,
|
162
|
+
)
|
163
|
+
return False
|
@@ -48,7 +48,7 @@ class BreakLoopPlaceholder(InstructionPlaceholder):
|
|
48
48
|
|
49
49
|
def concrete_instruction(self, qubits, clbits):
|
50
50
|
return (
|
51
|
-
|
51
|
+
BreakLoopOp(len(qubits), len(clbits), label=self.label),
|
52
52
|
InstructionResources(qubits=tuple(qubits), clbits=tuple(clbits)),
|
53
53
|
)
|
54
54
|
|