qiskit 1.1.1__cp38-abi3-win32.whl → 1.2.0__cp38-abi3-win32.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 +27 -24
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +6 -3
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/__init__.py +8 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +158 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +395 -385
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +42 -128
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +197 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +113 -12
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +33 -25
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
- qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
- qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
- qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
- qiskit/providers/fake_provider/generic_backend_v2.py +519 -68
- qiskit/providers/models/__init__.py +48 -11
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +12 -20
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +582 -479
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/__init__.py +1 -1
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +14 -12
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -2
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +24 -14
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +6 -5
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +6 -6
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +84 -64
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +6 -15
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +5 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +83 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +62 -24
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +12 -5
- qiskit/visualization/pass_manager_visualization.py +9 -9
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/METADATA +28 -28
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/RECORD +346 -344
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/WHEEL +1 -1
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
qiskit/VERSION.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
qiskit/__init__.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
# pylint: disable=wrong-import-position
|
13
|
+
# pylint: disable=wrong-import-position,wrong-import-order
|
14
14
|
|
15
15
|
"""Main Qiskit public functionality."""
|
16
16
|
|
@@ -52,36 +52,38 @@ if sys.version_info < (3, 9):
|
|
52
52
|
)
|
53
53
|
|
54
54
|
|
55
|
-
import
|
55
|
+
from . import _accelerate
|
56
56
|
import qiskit._numpy_compat
|
57
57
|
|
58
58
|
# Globally define compiled submodules. The normal import mechanism will not find compiled submodules
|
59
59
|
# in _accelerate because it relies on file paths, but PyO3 generates only one shared library file.
|
60
60
|
# We manually define them on import so people can directly import qiskit._accelerate.* submodules
|
61
61
|
# and not have to rely on attribute access. No action needed for top-level extension packages.
|
62
|
-
sys.modules["qiskit._accelerate.circuit"] =
|
63
|
-
sys.modules["qiskit._accelerate.convert_2q_block_matrix"] =
|
64
|
-
|
65
|
-
|
66
|
-
sys.modules["qiskit._accelerate.
|
67
|
-
sys.modules["qiskit._accelerate.
|
68
|
-
sys.modules["qiskit._accelerate.isometry"] = qiskit._accelerate.isometry
|
69
|
-
sys.modules["qiskit._accelerate.uc_gate"] = qiskit._accelerate.uc_gate
|
62
|
+
sys.modules["qiskit._accelerate.circuit"] = _accelerate.circuit
|
63
|
+
sys.modules["qiskit._accelerate.convert_2q_block_matrix"] = _accelerate.convert_2q_block_matrix
|
64
|
+
sys.modules["qiskit._accelerate.dense_layout"] = _accelerate.dense_layout
|
65
|
+
sys.modules["qiskit._accelerate.error_map"] = _accelerate.error_map
|
66
|
+
sys.modules["qiskit._accelerate.isometry"] = _accelerate.isometry
|
67
|
+
sys.modules["qiskit._accelerate.uc_gate"] = _accelerate.uc_gate
|
70
68
|
sys.modules["qiskit._accelerate.euler_one_qubit_decomposer"] = (
|
71
|
-
|
69
|
+
_accelerate.euler_one_qubit_decomposer
|
72
70
|
)
|
73
|
-
sys.modules["qiskit._accelerate.nlayout"] =
|
74
|
-
sys.modules["qiskit._accelerate.optimize_1q_gates"] =
|
75
|
-
sys.modules["qiskit._accelerate.pauli_expval"] =
|
76
|
-
sys.modules["qiskit._accelerate.qasm2"] =
|
77
|
-
sys.modules["qiskit._accelerate.qasm3"] =
|
78
|
-
sys.modules["qiskit._accelerate.results"] =
|
79
|
-
sys.modules["qiskit._accelerate.sabre"] =
|
80
|
-
sys.modules["qiskit._accelerate.sampled_exp_val"] =
|
81
|
-
sys.modules["qiskit._accelerate.sparse_pauli_op"] =
|
82
|
-
sys.modules["qiskit._accelerate.
|
83
|
-
sys.modules["qiskit._accelerate.
|
84
|
-
sys.modules["qiskit._accelerate.
|
71
|
+
sys.modules["qiskit._accelerate.nlayout"] = _accelerate.nlayout
|
72
|
+
sys.modules["qiskit._accelerate.optimize_1q_gates"] = _accelerate.optimize_1q_gates
|
73
|
+
sys.modules["qiskit._accelerate.pauli_expval"] = _accelerate.pauli_expval
|
74
|
+
sys.modules["qiskit._accelerate.qasm2"] = _accelerate.qasm2
|
75
|
+
sys.modules["qiskit._accelerate.qasm3"] = _accelerate.qasm3
|
76
|
+
sys.modules["qiskit._accelerate.results"] = _accelerate.results
|
77
|
+
sys.modules["qiskit._accelerate.sabre"] = _accelerate.sabre
|
78
|
+
sys.modules["qiskit._accelerate.sampled_exp_val"] = _accelerate.sampled_exp_val
|
79
|
+
sys.modules["qiskit._accelerate.sparse_pauli_op"] = _accelerate.sparse_pauli_op
|
80
|
+
sys.modules["qiskit._accelerate.star_prerouting"] = _accelerate.star_prerouting
|
81
|
+
sys.modules["qiskit._accelerate.stochastic_swap"] = _accelerate.stochastic_swap
|
82
|
+
sys.modules["qiskit._accelerate.two_qubit_decompose"] = _accelerate.two_qubit_decompose
|
83
|
+
sys.modules["qiskit._accelerate.vf2_layout"] = _accelerate.vf2_layout
|
84
|
+
sys.modules["qiskit._accelerate.synthesis.permutation"] = _accelerate.synthesis.permutation
|
85
|
+
sys.modules["qiskit._accelerate.synthesis.linear"] = _accelerate.synthesis.linear
|
86
|
+
sys.modules["qiskit._accelerate.synthesis.clifford"] = _accelerate.synthesis.clifford
|
85
87
|
|
86
88
|
from qiskit.exceptions import QiskitError, MissingOptionalLibraryError
|
87
89
|
|
@@ -100,7 +102,7 @@ import qiskit.circuit.reset
|
|
100
102
|
_config = _user_config.get_config()
|
101
103
|
|
102
104
|
from qiskit.compiler import transpile, assemble, schedule, sequence
|
103
|
-
|
105
|
+
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
|
104
106
|
from .version import __version__
|
105
107
|
|
106
108
|
__all__ = [
|
@@ -114,4 +116,5 @@ __all__ = [
|
|
114
116
|
"schedule",
|
115
117
|
"sequence",
|
116
118
|
"transpile",
|
119
|
+
"generate_preset_pass_manager",
|
117
120
|
]
|
qiskit/_accelerate.pyd
CHANGED
Binary file
|
qiskit/_numpy_compat.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""
|
13
|
+
"""Compatibility helpers for the Numpy 1.x to 2.0 transition."""
|
14
14
|
|
15
15
|
import re
|
16
16
|
import typing
|
@@ -12,6 +12,7 @@
|
|
12
12
|
|
13
13
|
"""Assemble function for converting a list of circuits into a qobj."""
|
14
14
|
import copy
|
15
|
+
import warnings
|
15
16
|
from collections import defaultdict
|
16
17
|
from typing import Dict, List, Optional, Tuple
|
17
18
|
|
@@ -35,6 +36,7 @@ from qiskit.qobj import (
|
|
35
36
|
QobjHeader,
|
36
37
|
)
|
37
38
|
from qiskit.utils.parallel import parallel_map
|
39
|
+
from qiskit.utils import deprecate_func
|
38
40
|
|
39
41
|
|
40
42
|
PulseLibrary = Dict[str, List[complex]]
|
@@ -87,20 +89,26 @@ def _assemble_circuit(
|
|
87
89
|
metadata = circuit.metadata
|
88
90
|
if metadata is None:
|
89
91
|
metadata = {}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
with warnings.catch_warnings():
|
93
|
+
# The class QobjExperimentHeader is deprecated
|
94
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
95
|
+
header = QobjExperimentHeader(
|
96
|
+
qubit_labels=qubit_labels,
|
97
|
+
n_qubits=num_qubits,
|
98
|
+
qreg_sizes=qreg_sizes,
|
99
|
+
clbit_labels=clbit_labels,
|
100
|
+
memory_slots=memory_slots,
|
101
|
+
creg_sizes=creg_sizes,
|
102
|
+
name=circuit.name,
|
103
|
+
global_phase=float(circuit.global_phase),
|
104
|
+
metadata=metadata,
|
105
|
+
)
|
101
106
|
|
102
107
|
# TODO: why do we need n_qubits and memory_slots in both the header and the config
|
103
|
-
|
108
|
+
with warnings.catch_warnings():
|
109
|
+
# The class QasmQobjExperimentConfig is deprecated
|
110
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
111
|
+
config = QasmQobjExperimentConfig(n_qubits=num_qubits, memory_slots=memory_slots)
|
104
112
|
calibrations, pulse_library = _assemble_pulse_gates(circuit, run_config)
|
105
113
|
if calibrations:
|
106
114
|
config.calibrations = calibrations
|
@@ -118,7 +126,7 @@ def _assemble_circuit(
|
|
118
126
|
|
119
127
|
instructions = []
|
120
128
|
for op_context in circuit.data:
|
121
|
-
instruction = op_context.operation.
|
129
|
+
instruction = op_context.operation._assemble()
|
122
130
|
|
123
131
|
# Add register attributes to the instruction
|
124
132
|
qargs = op_context.qubits
|
@@ -151,13 +159,16 @@ def _assemble_circuit(
|
|
151
159
|
]
|
152
160
|
|
153
161
|
conditional_reg_idx = memory_slots + max_conditional_idx
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
162
|
+
with warnings.catch_warnings():
|
163
|
+
# The class QasmQobjInstruction is deprecated
|
164
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
165
|
+
conversion_bfunc = QasmQobjInstruction(
|
166
|
+
name="bfunc",
|
167
|
+
mask="0x%X" % mask, # pylint: disable=consider-using-f-string
|
168
|
+
relation="==",
|
169
|
+
val="0x%X" % val, # pylint: disable=consider-using-f-string
|
170
|
+
register=conditional_reg_idx,
|
171
|
+
)
|
161
172
|
instructions.append(conversion_bfunc)
|
162
173
|
instruction.conditional = conditional_reg_idx
|
163
174
|
max_conditional_idx += 1
|
@@ -166,10 +177,13 @@ def _assemble_circuit(
|
|
166
177
|
del instruction._condition
|
167
178
|
|
168
179
|
instructions.append(instruction)
|
169
|
-
|
170
|
-
QasmQobjExperiment
|
171
|
-
|
172
|
-
|
180
|
+
with warnings.catch_warnings():
|
181
|
+
# The class QasmQobjExperiment is deprecated
|
182
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
183
|
+
return (
|
184
|
+
QasmQobjExperiment(instructions=instructions, header=header, config=config),
|
185
|
+
pulse_library,
|
186
|
+
)
|
173
187
|
|
174
188
|
|
175
189
|
def _assemble_pulse_gates(
|
@@ -299,42 +313,14 @@ def _configure_experiment_los(
|
|
299
313
|
return experiments
|
300
314
|
|
301
315
|
|
302
|
-
def
|
316
|
+
def _assemble_circuits(
|
303
317
|
circuits: List[QuantumCircuit], run_config: RunConfig, qobj_id: int, qobj_header: QobjHeader
|
304
318
|
) -> QasmQobj:
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
qobj_id: identifier for the generated qobj
|
311
|
-
qobj_header: header to pass to the results
|
312
|
-
|
313
|
-
Returns:
|
314
|
-
The qobj to be run on the backends
|
315
|
-
|
316
|
-
Examples:
|
317
|
-
|
318
|
-
.. code-block:: python
|
319
|
-
|
320
|
-
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
|
321
|
-
from qiskit.assembler import assemble_circuits
|
322
|
-
from qiskit.assembler.run_config import RunConfig
|
323
|
-
# Build a circuit to convert into a Qobj
|
324
|
-
q = QuantumRegister(2)
|
325
|
-
c = ClassicalRegister(2)
|
326
|
-
qc = QuantumCircuit(q, c)
|
327
|
-
qc.h(q[0])
|
328
|
-
qc.cx(q[0], q[1])
|
329
|
-
qc.measure(q, c)
|
330
|
-
# Assemble a Qobj from the input circuit
|
331
|
-
qobj = assemble_circuits(circuits=[qc],
|
332
|
-
qobj_id="custom-id",
|
333
|
-
qobj_header=[],
|
334
|
-
run_config=RunConfig(shots=2000, memory=True, init_qubits=True))
|
335
|
-
"""
|
336
|
-
# assemble the circuit experiments
|
337
|
-
experiments_and_pulse_libs = parallel_map(_assemble_circuit, circuits, [run_config])
|
319
|
+
with warnings.catch_warnings():
|
320
|
+
# Still constructs Qobj, that is deprecated. The message is hard to trace to a module,
|
321
|
+
# because concurrency is hard.
|
322
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
323
|
+
experiments_and_pulse_libs = parallel_map(_assemble_circuit, circuits, [run_config])
|
338
324
|
experiments = []
|
339
325
|
pulse_library = {}
|
340
326
|
for exp, lib in experiments_and_pulse_libs:
|
@@ -346,10 +332,16 @@ def assemble_circuits(
|
|
346
332
|
experiments, calibrations = _extract_common_calibrations(experiments)
|
347
333
|
|
348
334
|
# configure LO freqs per circuit
|
349
|
-
|
335
|
+
with warnings.catch_warnings():
|
336
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
337
|
+
lo_converter = converters.LoConfigConverter(
|
338
|
+
QasmQobjExperimentConfig, **run_config.to_dict()
|
339
|
+
)
|
350
340
|
experiments = _configure_experiment_los(experiments, lo_converter, run_config)
|
351
341
|
|
352
|
-
|
342
|
+
with warnings.catch_warnings():
|
343
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
344
|
+
qobj_config = QasmQobjConfig()
|
353
345
|
if run_config:
|
354
346
|
qobj_config_dict = run_config.to_dict()
|
355
347
|
|
@@ -379,7 +371,10 @@ def assemble_circuits(
|
|
379
371
|
if m_los:
|
380
372
|
qobj_config_dict["meas_lo_freq"] = [freq / 1e9 for freq in m_los]
|
381
373
|
|
382
|
-
|
374
|
+
with warnings.catch_warnings():
|
375
|
+
# The class QasmQobjConfig is deprecated
|
376
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
377
|
+
qobj_config = QasmQobjConfig(**qobj_config_dict)
|
383
378
|
|
384
379
|
qubit_sizes = []
|
385
380
|
memory_slot_sizes = []
|
@@ -402,7 +397,55 @@ def assemble_circuits(
|
|
402
397
|
|
403
398
|
if calibrations and calibrations.gates:
|
404
399
|
qobj_config.calibrations = calibrations
|
400
|
+
with warnings.catch_warnings():
|
401
|
+
# The class QasmQobj is deprecated
|
402
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
403
|
+
return QasmQobj(
|
404
|
+
qobj_id=qobj_id, config=qobj_config, experiments=experiments, header=qobj_header
|
405
|
+
)
|
405
406
|
|
406
|
-
|
407
|
-
|
408
|
-
|
407
|
+
|
408
|
+
@deprecate_func(
|
409
|
+
since="1.2",
|
410
|
+
removal_timeline="in the 2.0 release",
|
411
|
+
additional_msg="The `Qobj` class and related functionality are part of the deprecated `BackendV1` "
|
412
|
+
"workflow, and no longer necessary for `BackendV2`. If a user workflow requires "
|
413
|
+
"`Qobj` it likely relies on deprecated functionality and should be updated to "
|
414
|
+
"use `BackendV2`.",
|
415
|
+
)
|
416
|
+
def assemble_circuits(
|
417
|
+
circuits: List[QuantumCircuit], run_config: RunConfig, qobj_id: int, qobj_header: QobjHeader
|
418
|
+
) -> QasmQobj:
|
419
|
+
"""Assembles a list of circuits into a qobj that can be run on the backend.
|
420
|
+
|
421
|
+
Args:
|
422
|
+
circuits: circuit(s) to assemble
|
423
|
+
run_config: configuration of the runtime environment
|
424
|
+
qobj_id: identifier for the generated qobj
|
425
|
+
qobj_header: header to pass to the results
|
426
|
+
|
427
|
+
Returns:
|
428
|
+
The qobj to be run on the backends
|
429
|
+
|
430
|
+
Examples:
|
431
|
+
|
432
|
+
.. code-block:: python
|
433
|
+
|
434
|
+
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
|
435
|
+
from qiskit.assembler import assemble_circuits
|
436
|
+
from qiskit.assembler.run_config import RunConfig
|
437
|
+
# Build a circuit to convert into a Qobj
|
438
|
+
q = QuantumRegister(2)
|
439
|
+
c = ClassicalRegister(2)
|
440
|
+
qc = QuantumCircuit(q, c)
|
441
|
+
qc.h(q[0])
|
442
|
+
qc.cx(q[0], q[1])
|
443
|
+
qc.measure(q, c)
|
444
|
+
# Assemble a Qobj from the input circuit
|
445
|
+
qobj = assemble_circuits(circuits=[qc],
|
446
|
+
qobj_id="custom-id",
|
447
|
+
qobj_header=[],
|
448
|
+
run_config=RunConfig(shots=2000, memory=True, init_qubits=True))
|
449
|
+
"""
|
450
|
+
# assemble the circuit experiments
|
451
|
+
return _assemble_circuits(circuits, run_config, qobj_id, qobj_header)
|
@@ -152,7 +152,7 @@ def _assemble_experiments(
|
|
152
152
|
# TODO: add other experimental header items (see circuit assembler)
|
153
153
|
qobj_experiment_header = qobj.QobjExperimentHeader(
|
154
154
|
memory_slots=max_memory_slot + 1, # Memory slots are 0 indexed
|
155
|
-
name=sched.name or "Experiment
|
155
|
+
name=sched.name or f"Experiment-{idx}",
|
156
156
|
metadata=metadata,
|
157
157
|
)
|
158
158
|
|
@@ -306,18 +306,11 @@ def _validate_meas_map(
|
|
306
306
|
common_next = next_inst_qubits.intersection(meas_set)
|
307
307
|
if common_instr_qubits and common_next:
|
308
308
|
raise QiskitError(
|
309
|
-
"Qubits {} and {} are in the same measurement
|
309
|
+
f"Qubits {common_instr_qubits} and {common_next} are in the same measurement "
|
310
|
+
f"grouping: {meas_map}. "
|
310
311
|
"They must either be acquired at the same time, or disjointly"
|
311
|
-
". Instead, they were acquired at times: {}-{} and "
|
312
|
-
"{}-{}"
|
313
|
-
common_instr_qubits,
|
314
|
-
common_next,
|
315
|
-
meas_map,
|
316
|
-
inst[0][0],
|
317
|
-
inst_end_time,
|
318
|
-
next_inst_time,
|
319
|
-
next_inst_time + next_inst[0][1],
|
320
|
-
)
|
312
|
+
f". Instead, they were acquired at times: {inst[0][0]}-{inst_end_time} and "
|
313
|
+
f"{next_inst_time}-{next_inst_time + next_inst[0][1]}"
|
321
314
|
)
|
322
315
|
|
323
316
|
|
qiskit/assembler/disassemble.py
CHANGED
@@ -23,6 +23,7 @@ from qiskit.circuit.quantumregister import QuantumRegister
|
|
23
23
|
|
24
24
|
from qiskit.qobj import PulseQobjInstruction
|
25
25
|
from qiskit.qobj.converters import QobjToInstructionConverter
|
26
|
+
from qiskit.utils import deprecate_func
|
26
27
|
|
27
28
|
# A ``CircuitModule`` is a representation of a circuit execution on the backend.
|
28
29
|
# It is currently a list of quantum circuits to execute, a run Qobj dictionary
|
@@ -37,6 +38,14 @@ CircuitModule = NewType(
|
|
37
38
|
PulseModule = NewType("PulseModule", Tuple[List[pulse.Schedule], Dict[str, Any], Dict[str, Any]])
|
38
39
|
|
39
40
|
|
41
|
+
@deprecate_func(
|
42
|
+
since="1.2",
|
43
|
+
removal_timeline="in the 2.0 release",
|
44
|
+
additional_msg="The `Qobj` class and related functionality are part of the deprecated "
|
45
|
+
"`BackendV1` workflow, and no longer necessary for `BackendV2`. If a user "
|
46
|
+
"workflow requires `Qobj` it likely relies on deprecated functionality and "
|
47
|
+
"should be updated to use `BackendV2`.",
|
48
|
+
)
|
40
49
|
def disassemble(qobj) -> Union[CircuitModule, PulseModule]:
|
41
50
|
"""Disassemble a qobj and return the circuits or pulse schedules, run_config, and user header.
|
42
51
|
|
@@ -109,7 +118,7 @@ def _qobj_to_circuit_cals(qobj, pulse_lib):
|
|
109
118
|
config = (tuple(gate["qubits"]), tuple(gate["params"]))
|
110
119
|
cal = {
|
111
120
|
config: pulse.Schedule(
|
112
|
-
name="{
|
121
|
+
name=f"{gate['name']} {str(gate['params'])} {str(gate['qubits'])}"
|
113
122
|
)
|
114
123
|
}
|
115
124
|
for instruction in gate["instructions"]:
|
qiskit/circuit/__init__.py
CHANGED
@@ -270,7 +270,7 @@ circuit. The top-level ones are:
|
|
270
270
|
* :class:`ContinueLoopOp`, to move immediately to the next iteration of the containing loop
|
271
271
|
* :class:`ForLoopOp`, to loop over a fixed range of values
|
272
272
|
* :class:`IfElseOp`, to conditionally enter one of two subcircuits
|
273
|
-
* :class:`SwitchCaseOp`, to conditionally enter one of many
|
273
|
+
* :class:`SwitchCaseOp`, to conditionally enter one of many subcircuits
|
274
274
|
* :class:`WhileLoopOp`, to repeat a subcircuit until a condition is falsified.
|
275
275
|
|
276
276
|
:ref:`Circuits can include classical expressions that are evaluated in real time
|
@@ -301,9 +301,10 @@ assist compilation workflows. These include:
|
|
301
301
|
* :data:`SessionEquivalenceLibrary`, a mutable instance of :class:`EquivalenceLibrary` which is used
|
302
302
|
by default by the compiler's :class:`.BasisTranslator`.
|
303
303
|
|
304
|
-
There
|
304
|
+
There are also utilities for generating random circuits:
|
305
305
|
|
306
|
-
* :func
|
306
|
+
* :func:`.random_circuit`
|
307
|
+
* :func:`.random_clifford_circuit`
|
307
308
|
|
308
309
|
Finally, the circuit module has its own exception class, to indicate when things went wrong in
|
309
310
|
circuit-specific manners:
|
@@ -1004,6 +1005,7 @@ Generating random circuits
|
|
1004
1005
|
|
1005
1006
|
.. currentmodule:: qiskit.circuit.random
|
1006
1007
|
.. autofunction:: random_circuit
|
1008
|
+
.. autofunction:: random_clifford_circuit
|
1007
1009
|
.. currentmodule:: qiskit.circuit
|
1008
1010
|
|
1009
1011
|
|
@@ -1250,3 +1252,4 @@ from .controlflow import (
|
|
1250
1252
|
)
|
1251
1253
|
|
1252
1254
|
from .annotated_operation import AnnotatedOperation, InverseModifier, ControlModifier, PowerModifier
|
1255
|
+
from .random import random_circuit, random_clifford_circuit
|
@@ -31,7 +31,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
|
31
31
|
call its :meth:`map_condition`, :meth:`map_target` or :meth:`map_expr` methods as appropriate,
|
32
32
|
which will return the new object that should be used.
|
33
33
|
|
34
|
-
If an ``add_register`` callable is given to the
|
34
|
+
If an ``add_register`` callable is given to the initializer, the mapper will use it to attempt
|
35
35
|
to add new aliasing registers to the outer circuit object, if there is not already a suitable
|
36
36
|
register for the mapping available in the circuit. If this parameter is not given, a
|
37
37
|
``ValueError`` will be raised instead. The given ``add_register`` callable may choose to raise
|
@@ -73,12 +73,12 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
|
73
73
|
|
74
74
|
def map_condition(self, condition, /, *, allow_reorder=False):
|
75
75
|
"""Map the given ``condition`` so that it only references variables in the destination
|
76
|
-
circuit (as given to this class on
|
76
|
+
circuit (as given to this class on initialization).
|
77
77
|
|
78
78
|
If ``allow_reorder`` is ``True``, then when a legacy condition (the two-tuple form) is made
|
79
79
|
on a register that has a counterpart in the destination with all the same (mapped) bits but
|
80
80
|
in a different order, then that register will be used and the value suitably modified to
|
81
|
-
make the equality condition work. This is maintaining legacy (tested)
|
81
|
+
make the equality condition work. This is maintaining legacy (tested) behavior of
|
82
82
|
:meth:`.DAGCircuit.compose`; nowhere else does this, and in general this would require *far*
|
83
83
|
more complex classical rewriting than Terra needs to worry about in the full expression era.
|
84
84
|
"""
|
@@ -91,7 +91,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
|
91
91
|
return (self.bit_map[target], value)
|
92
92
|
if not allow_reorder:
|
93
93
|
return (self._map_register(target), value)
|
94
|
-
# This is maintaining the legacy
|
94
|
+
# This is maintaining the legacy behavior of `DAGCircuit.compose`. We don't attempt to
|
95
95
|
# speed-up this lookup with a cache, since that would just make the more standard cases more
|
96
96
|
# annoying to deal with.
|
97
97
|
mapped_bits_order = [self.bit_map[bit] for bit in target]
|
@@ -114,7 +114,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
|
114
114
|
|
115
115
|
def map_target(self, target, /):
|
116
116
|
"""Map the real-time variables in a ``target`` of a :class:`.SwitchCaseOp` to the new
|
117
|
-
circuit, as defined in the ``circuit`` argument of the
|
117
|
+
circuit, as defined in the ``circuit`` argument of the initializer of this class."""
|
118
118
|
if isinstance(target, Clbit):
|
119
119
|
return self.bit_map[target]
|
120
120
|
if isinstance(target, ClassicalRegister):
|
qiskit/circuit/_utils.py
CHANGED
@@ -19,19 +19,6 @@ import numpy
|
|
19
19
|
from qiskit import _numpy_compat
|
20
20
|
from qiskit.exceptions import QiskitError
|
21
21
|
from qiskit.circuit.exceptions import CircuitError
|
22
|
-
from .parametervector import ParameterVectorElement
|
23
|
-
|
24
|
-
|
25
|
-
def sort_parameters(parameters):
|
26
|
-
"""Sort an iterable of :class:`.Parameter` instances into a canonical order, respecting the
|
27
|
-
ordering relationships between elements of :class:`.ParameterVector`\\ s."""
|
28
|
-
|
29
|
-
def key(parameter):
|
30
|
-
if isinstance(parameter, ParameterVectorElement):
|
31
|
-
return (parameter.vector.name, parameter.index)
|
32
|
-
return (parameter.name,)
|
33
|
-
|
34
|
-
return sorted(parameters, key=key)
|
35
22
|
|
36
23
|
|
37
24
|
def _compute_control_matrix(base_mat, num_ctrl_qubits, ctrl_state=None):
|
qiskit/circuit/add_control.py
CHANGED
@@ -73,7 +73,7 @@ def control(
|
|
73
73
|
) -> ControlledGate:
|
74
74
|
"""Return controlled version of gate using controlled rotations. This function
|
75
75
|
first checks the name of the operation to see if it knows of a method from which
|
76
|
-
to generate a controlled version. Currently these are
|
76
|
+
to generate a controlled version. Currently, these are ``x``, ``rx``, ``ry``, and ``rz``.
|
77
77
|
If a method is not directly known, it calls the unroller to convert to `u1`, `u3`,
|
78
78
|
and `cx` gates.
|
79
79
|
|
@@ -18,6 +18,7 @@ import dataclasses
|
|
18
18
|
from typing import Union, List
|
19
19
|
|
20
20
|
from qiskit.circuit.operation import Operation
|
21
|
+
from qiskit.circuit.parameterexpression import ParameterValueType
|
21
22
|
from qiskit.circuit._utils import _compute_control_matrix, _ctrl_state_to_int
|
22
23
|
from qiskit.circuit.exceptions import CircuitError
|
23
24
|
|
@@ -132,7 +133,7 @@ class AnnotatedOperation(Operation):
|
|
132
133
|
|
133
134
|
def copy(self) -> "AnnotatedOperation":
|
134
135
|
"""Return a copy of the :class:`~.AnnotatedOperation`."""
|
135
|
-
return AnnotatedOperation(base_op=self.base_op, modifiers=self.modifiers.copy())
|
136
|
+
return AnnotatedOperation(base_op=self.base_op.copy(), modifiers=self.modifiers.copy())
|
136
137
|
|
137
138
|
def to_matrix(self):
|
138
139
|
"""Return a matrix representation (allowing to construct Operator)."""
|
@@ -219,6 +220,27 @@ class AnnotatedOperation(Operation):
|
|
219
220
|
extended_modifiers.append(PowerModifier(exponent))
|
220
221
|
return AnnotatedOperation(self.base_op, extended_modifiers)
|
221
222
|
|
223
|
+
@property
|
224
|
+
def params(self) -> list[ParameterValueType]:
|
225
|
+
"""The params of the underlying base operation."""
|
226
|
+
return getattr(self.base_op, "params", [])
|
227
|
+
|
228
|
+
@params.setter
|
229
|
+
def params(self, value: list[ParameterValueType]):
|
230
|
+
if hasattr(self.base_op, "params"):
|
231
|
+
self.base_op.params = value
|
232
|
+
else:
|
233
|
+
raise AttributeError(
|
234
|
+
f"Cannot set attribute ``params`` on the base operation {self.base_op}."
|
235
|
+
)
|
236
|
+
|
237
|
+
def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
|
238
|
+
"""Validate a parameter for the underlying base operation."""
|
239
|
+
if hasattr(self.base_op, "validate_parameter"):
|
240
|
+
return self.base_op.validate_parameter(parameter)
|
241
|
+
|
242
|
+
raise AttributeError(f"Cannot validate parameters on the base operation {self.base_op}.")
|
243
|
+
|
222
244
|
|
223
245
|
def _canonicalize_modifiers(modifiers):
|
224
246
|
"""
|
@@ -53,7 +53,7 @@ class Expr(abc.ABC):
|
|
53
53
|
expressions, and it does not make sense to add more outside of Qiskit library code.
|
54
54
|
|
55
55
|
All subclasses are responsible for setting their ``type`` attribute in their ``__init__``, and
|
56
|
-
should not call the parent
|
56
|
+
should not call the parent initializer."""
|
57
57
|
|
58
58
|
__slots__ = ("type",)
|
59
59
|
|
@@ -193,7 +193,7 @@ class Var(Expr):
|
|
193
193
|
return self
|
194
194
|
|
195
195
|
def __deepcopy__(self, memo):
|
196
|
-
# ... as are all my
|
196
|
+
# ... as are all my constituent parts.
|
197
197
|
return self
|
198
198
|
|
199
199
|
|
@@ -241,7 +241,7 @@ class Unary(Expr):
|
|
241
241
|
|
242
242
|
# If adding opcodes, remember to add helper constructor functions in `constructors.py`.
|
243
243
|
# The opcode integers should be considered a public interface; they are used by
|
244
|
-
#
|
244
|
+
# serialization formats that may transfer data between different versions of Qiskit.
|
245
245
|
BIT_NOT = 1
|
246
246
|
"""Bitwise negation. ``~operand``."""
|
247
247
|
LOGIC_NOT = 2
|
@@ -309,7 +309,7 @@ class Binary(Expr):
|
|
309
309
|
|
310
310
|
# If adding opcodes, remember to add helper constructor functions in `constructors.py`
|
311
311
|
# The opcode integers should be considered a public interface; they are used by
|
312
|
-
#
|
312
|
+
# serialization formats that may transfer data between different versions of Qiskit.
|
313
313
|
BIT_AND = 1
|
314
314
|
"""Bitwise "and". ``lhs & rhs``."""
|
315
315
|
BIT_OR = 2
|
@@ -29,7 +29,7 @@ _T_co = typing.TypeVar("_T_co", covariant=True)
|
|
29
29
|
|
30
30
|
class ExprVisitor(typing.Generic[_T_co]):
|
31
31
|
"""Base class for visitors to the :class:`Expr` tree. Subclasses should override whichever of
|
32
|
-
the ``visit_*`` methods that they are able to handle, and should be
|
32
|
+
the ``visit_*`` methods that they are able to handle, and should be organized such that
|
33
33
|
non-existent methods will never be called."""
|
34
34
|
|
35
35
|
# The method names are self-explanatory and docstrings would just be noise.
|
@@ -40,7 +40,7 @@ literals ``True`` and ``False``), and unsigned integers (corresponding to
|
|
40
40
|
.. autoclass:: Bool
|
41
41
|
.. autoclass:: Uint
|
42
42
|
|
43
|
-
Note that :class:`Uint` defines a family of types
|
43
|
+
Note that :class:`Uint` defines a family of types parametrized by their width; it is not one single
|
44
44
|
type, which may be slightly different to the 'classical' programming languages you are used to.
|
45
45
|
|
46
46
|
|
@@ -29,7 +29,7 @@ import typing
|
|
29
29
|
|
30
30
|
|
31
31
|
class _Singleton(type):
|
32
|
-
"""Metaclass to make the child, which should take zero
|
32
|
+
"""Metaclass to make the child, which should take zero initialization arguments, a singleton
|
33
33
|
object."""
|
34
34
|
|
35
35
|
def _get_singleton_instance(cls):
|
@@ -76,7 +76,7 @@ class Type:
|
|
76
76
|
def __setstate__(self, state):
|
77
77
|
_dict, slots = state
|
78
78
|
for slot, value in slots.items():
|
79
|
-
# We need to overcome the type's enforcement of immutability post
|
79
|
+
# We need to overcome the type's enforcement of immutability post initialization.
|
80
80
|
super().__setattr__(slot, value)
|
81
81
|
|
82
82
|
|
@@ -51,6 +51,14 @@ QuantumCircuit:
|
|
51
51
|
Following Qiskit's little-endian bit ordering convention, the left-most bit (``a``) is the most
|
52
52
|
significant bit and the right-most bit (``d``) is the least significant bit.
|
53
53
|
|
54
|
+
.. warning::
|
55
|
+
|
56
|
+
The functionality of `qiskit.circuit.classicalfunction` requires `tweedledum`,
|
57
|
+
which isn't available on all platforms (up to Python version 3.11).
|
58
|
+
See `tweedledum installation guide
|
59
|
+
<https://github.com/boschmitt/tweedledum/tree/master?tab=readme-ov-file#installation>`_
|
60
|
+
for more details.
|
61
|
+
|
54
62
|
Supplementary Information
|
55
63
|
=========================
|
56
64
|
|