qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0rc1__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 +1 -1
- 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/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 +156 -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 +392 -384
- 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 +41 -127
- 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 +190 -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 +108 -10
- 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 +32 -24
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
- qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
- qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
- qiskit/providers/models/__init__.py +11 -0
- 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 +9 -17
- 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 +578 -481
- 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/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 +3 -3
- 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 +14 -16
- 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 +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- 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 +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +82 -63
- 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_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 +11 -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/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 +1 -1
- 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 +11 -11
- 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 +80 -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 +117 -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 +19 -67
- 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 +5 -12
- 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.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/top_level.txt +0 -0
@@ -28,21 +28,9 @@ from itertools import product
|
|
28
28
|
from functools import partial
|
29
29
|
import numpy as np
|
30
30
|
|
31
|
-
from qiskit.
|
32
|
-
from qiskit.
|
33
|
-
from qiskit.
|
34
|
-
from qiskit.transpiler.exceptions import TranspilerError
|
35
|
-
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
36
|
-
from qiskit.synthesis.one_qubit import one_qubit_decompose
|
37
|
-
from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import _possible_decomposers
|
38
|
-
from qiskit.synthesis.two_qubit.xx_decompose import XXDecomposer, XXEmbodiments
|
39
|
-
from qiskit.synthesis.two_qubit.two_qubit_decompose import (
|
40
|
-
TwoQubitBasisDecomposer,
|
41
|
-
TwoQubitWeylDecomposition,
|
42
|
-
GATE_NAME_MAP,
|
43
|
-
)
|
44
|
-
from qiskit.quantum_info import Operator
|
45
|
-
from qiskit.circuit import ControlFlowOp, Gate, Parameter
|
31
|
+
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
32
|
+
from qiskit.circuit import Gate, Parameter, CircuitInstruction
|
33
|
+
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
|
46
34
|
from qiskit.circuit.library.standard_gates import (
|
47
35
|
iSwapGate,
|
48
36
|
CXGate,
|
@@ -51,14 +39,54 @@ from qiskit.circuit.library.standard_gates import (
|
|
51
39
|
RZXGate,
|
52
40
|
RZZGate,
|
53
41
|
ECRGate,
|
42
|
+
RXGate,
|
43
|
+
SXGate,
|
44
|
+
XGate,
|
45
|
+
RZGate,
|
46
|
+
UGate,
|
47
|
+
PhaseGate,
|
48
|
+
U1Gate,
|
49
|
+
U2Gate,
|
50
|
+
U3Gate,
|
51
|
+
RYGate,
|
52
|
+
RGate,
|
54
53
|
)
|
55
|
-
from qiskit.
|
54
|
+
from qiskit.converters import circuit_to_dag, dag_to_circuit
|
55
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit, DAGOpNode
|
56
|
+
from qiskit.exceptions import QiskitError
|
57
|
+
from qiskit.providers.models import BackendProperties
|
58
|
+
from qiskit.quantum_info import Operator
|
59
|
+
from qiskit.synthesis.one_qubit import one_qubit_decompose
|
60
|
+
from qiskit.synthesis.two_qubit.xx_decompose import XXDecomposer, XXEmbodiments
|
61
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import (
|
62
|
+
TwoQubitBasisDecomposer,
|
63
|
+
TwoQubitWeylDecomposition,
|
64
|
+
)
|
65
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
66
|
+
from qiskit.transpiler.coupling import CouplingMap
|
67
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
56
68
|
from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import (
|
57
69
|
Optimize1qGatesDecomposition,
|
70
|
+
_possible_decomposers,
|
58
71
|
)
|
59
|
-
from qiskit.
|
60
|
-
from qiskit.
|
61
|
-
|
72
|
+
from qiskit.transpiler.passes.synthesis import plugin
|
73
|
+
from qiskit.transpiler.target import Target
|
74
|
+
|
75
|
+
|
76
|
+
GATE_NAME_MAP = {
|
77
|
+
"cx": CXGate._standard_gate,
|
78
|
+
"rx": RXGate._standard_gate,
|
79
|
+
"sx": SXGate._standard_gate,
|
80
|
+
"x": XGate._standard_gate,
|
81
|
+
"rz": RZGate._standard_gate,
|
82
|
+
"u": UGate._standard_gate,
|
83
|
+
"p": PhaseGate._standard_gate,
|
84
|
+
"u1": U1Gate._standard_gate,
|
85
|
+
"u2": U2Gate._standard_gate,
|
86
|
+
"u3": U3Gate._standard_gate,
|
87
|
+
"ry": RYGate._standard_gate,
|
88
|
+
"r": RGate._standard_gate,
|
89
|
+
}
|
62
90
|
|
63
91
|
|
64
92
|
KAK_GATE_NAMES = {
|
@@ -415,7 +443,7 @@ class UnitarySynthesis(TransformationPass):
|
|
415
443
|
if self.method == "default":
|
416
444
|
# If the method is the default, we only need to evaluate one set of keyword arguments.
|
417
445
|
# To simplify later logic, and avoid cases where static analysis might complain that we
|
418
|
-
# haven't
|
446
|
+
# haven't initialized the "default" handler, we rebind the names so they point to the
|
419
447
|
# same object as the chosen method.
|
420
448
|
default_method = plugin_method
|
421
449
|
default_kwargs = plugin_kwargs
|
@@ -480,7 +508,9 @@ class UnitarySynthesis(TransformationPass):
|
|
480
508
|
self, dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
|
481
509
|
):
|
482
510
|
"""Inner loop for the optimizer, after all DAG-independent set-up has been completed."""
|
483
|
-
for node in dag.op_nodes(
|
511
|
+
for node in dag.op_nodes():
|
512
|
+
if node.name not in CONTROL_FLOW_OP_NAMES:
|
513
|
+
continue
|
484
514
|
node.op = node.op.replace_blocks(
|
485
515
|
[
|
486
516
|
dag_to_circuit(
|
@@ -503,9 +533,9 @@ class UnitarySynthesis(TransformationPass):
|
|
503
533
|
|
504
534
|
out_dag = dag.copy_empty_like()
|
505
535
|
for node in dag.topological_op_nodes():
|
506
|
-
if node.
|
536
|
+
if node.name == "unitary" and len(node.qargs) >= self._min_qubits:
|
507
537
|
synth_dag = None
|
508
|
-
unitary = node.
|
538
|
+
unitary = node.matrix
|
509
539
|
n_qubits = len(node.qargs)
|
510
540
|
if (
|
511
541
|
plugin_method.max_qubits is not None and n_qubits > plugin_method.max_qubits
|
@@ -520,35 +550,42 @@ class UnitarySynthesis(TransformationPass):
|
|
520
550
|
)
|
521
551
|
synth_dag = method.run(unitary, **kwargs)
|
522
552
|
if synth_dag is None:
|
523
|
-
out_dag.
|
553
|
+
out_dag._apply_op_node_back(node)
|
524
554
|
continue
|
525
555
|
if isinstance(synth_dag, DAGCircuit):
|
526
556
|
qubit_map = dict(zip(synth_dag.qubits, node.qargs))
|
527
557
|
for node in synth_dag.topological_op_nodes():
|
528
|
-
|
529
|
-
|
530
|
-
)
|
558
|
+
node.qargs = tuple(qubit_map[x] for x in node.qargs)
|
559
|
+
out_dag._apply_op_node_back(node)
|
531
560
|
out_dag.global_phase += synth_dag.global_phase
|
532
561
|
else:
|
533
562
|
node_list, global_phase, gate = synth_dag
|
534
563
|
qubits = node.qargs
|
564
|
+
user_gate_node = DAGOpNode(gate)
|
535
565
|
for (
|
536
|
-
|
566
|
+
gate,
|
537
567
|
params,
|
538
568
|
qargs,
|
539
569
|
) in node_list:
|
540
|
-
if
|
541
|
-
|
570
|
+
if gate is None:
|
571
|
+
node = DAGOpNode.from_instruction(
|
572
|
+
user_gate_node._to_circuit_instruction().replace(
|
573
|
+
params=user_gate_node.params,
|
574
|
+
qubits=tuple(qubits[x] for x in qargs),
|
575
|
+
),
|
576
|
+
dag=out_dag,
|
577
|
+
)
|
542
578
|
else:
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
579
|
+
node = DAGOpNode.from_instruction(
|
580
|
+
CircuitInstruction.from_standard(
|
581
|
+
gate, tuple(qubits[x] for x in qargs), params
|
582
|
+
),
|
583
|
+
dag=out_dag,
|
584
|
+
)
|
585
|
+
out_dag._apply_op_node_back(node)
|
549
586
|
out_dag.global_phase += global_phase
|
550
587
|
else:
|
551
|
-
out_dag.
|
588
|
+
out_dag._apply_op_node_back(node)
|
552
589
|
return out_dag
|
553
590
|
|
554
591
|
|
@@ -975,8 +1012,8 @@ class DefaultUnitarySynthesis(plugin.UnitarySynthesisPlugin):
|
|
975
1012
|
# if the gates in synthesis are in the opposite direction of the preferred direction
|
976
1013
|
# resynthesize a new operator which is the original conjugated by swaps.
|
977
1014
|
# this new operator is doubly mirrored from the original and is locally equivalent.
|
978
|
-
for
|
979
|
-
if
|
1015
|
+
for gate, _params, qubits in synth_circ:
|
1016
|
+
if gate is None or gate == CXGate._standard_gate:
|
980
1017
|
synth_direction = qubits
|
981
1018
|
if synth_direction is not None and synth_direction != preferred_direction:
|
982
1019
|
# TODO: Avoid using a dag to correct the synthesis direction
|
@@ -1011,5 +1048,8 @@ class DefaultUnitarySynthesis(plugin.UnitarySynthesisPlugin):
|
|
1011
1048
|
flip_bits = out_dag.qubits[::-1]
|
1012
1049
|
for node in synth_circ.topological_op_nodes():
|
1013
1050
|
qubits = tuple(flip_bits[synth_circ.find_bit(x).index] for x in node.qargs)
|
1014
|
-
|
1051
|
+
node = DAGOpNode.from_instruction(
|
1052
|
+
node._to_circuit_instruction().replace(qubits=qubits, params=node.params)
|
1053
|
+
)
|
1054
|
+
out_dag._apply_op_node_back(node)
|
1015
1055
|
return out_dag
|
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
"""Check if the gates follow the right direction with respect to the coupling map."""
|
14
14
|
|
15
|
-
from qiskit.circuit import
|
15
|
+
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
16
16
|
from qiskit.converters import circuit_to_dag
|
17
17
|
from qiskit.transpiler.basepasses import AnalysisPass
|
18
18
|
|
@@ -39,7 +39,7 @@ class CheckGateDirection(AnalysisPass):
|
|
39
39
|
edges = self.coupling_map.get_edges()
|
40
40
|
# Don't include directives to avoid things like barrier, which are assumed always supported.
|
41
41
|
for node in dag.op_nodes(include_directives=False):
|
42
|
-
if
|
42
|
+
if node.name in CONTROL_FLOW_OP_NAMES:
|
43
43
|
for block in node.op.blocks:
|
44
44
|
inner_wire_map = {
|
45
45
|
inner: wire_map[outer] for outer, inner in zip(node.qargs, block.qubits)
|
@@ -57,7 +57,7 @@ class CheckGateDirection(AnalysisPass):
|
|
57
57
|
def _target_visit(self, dag, wire_map):
|
58
58
|
# Don't include directives to avoid things like barrier, which are assumed always supported.
|
59
59
|
for node in dag.op_nodes(include_directives=False):
|
60
|
-
if
|
60
|
+
if node.name in CONTROL_FLOW_OP_NAMES:
|
61
61
|
for block in node.op.blocks:
|
62
62
|
inner_wire_map = {
|
63
63
|
inner: wire_map[outer] for outer, inner in zip(node.qargs, block.qubits)
|
@@ -65,7 +65,7 @@ class CheckGateDirection(AnalysisPass):
|
|
65
65
|
if not self._target_visit(circuit_to_dag(block), inner_wire_map):
|
66
66
|
return False
|
67
67
|
elif len(node.qargs) == 2 and not self.target.instruction_supported(
|
68
|
-
node.
|
68
|
+
node.name, (wire_map[node.qargs[0]], wire_map[node.qargs[1]])
|
69
69
|
):
|
70
70
|
return False
|
71
71
|
return True
|
@@ -14,7 +14,6 @@
|
|
14
14
|
|
15
15
|
from qiskit.transpiler.basepasses import AnalysisPass
|
16
16
|
from qiskit.transpiler.target import Target
|
17
|
-
from qiskit.circuit.controlflow import ControlFlowOp
|
18
17
|
from qiskit.converters import circuit_to_dag
|
19
18
|
|
20
19
|
|
@@ -73,7 +72,7 @@ class CheckMap(AnalysisPass):
|
|
73
72
|
|
74
73
|
def _recurse(self, dag, wire_map) -> bool:
|
75
74
|
for node in dag.op_nodes(include_directives=False):
|
76
|
-
if
|
75
|
+
if node.is_control_flow():
|
77
76
|
for block in node.op.blocks:
|
78
77
|
inner_wire_map = {
|
79
78
|
inner: wire_map[outer] for inner, outer in zip(block.qubits, node.qargs)
|
@@ -85,10 +84,8 @@ class CheckMap(AnalysisPass):
|
|
85
84
|
and not dag.has_calibration_for(node)
|
86
85
|
and (wire_map[node.qargs[0]], wire_map[node.qargs[1]]) not in self.qargs
|
87
86
|
):
|
88
|
-
self.property_set["check_map_msg"] =
|
89
|
-
node.name,
|
90
|
-
wire_map[node.qargs[0]],
|
91
|
-
wire_map[node.qargs[1]],
|
87
|
+
self.property_set["check_map_msg"] = (
|
88
|
+
f"{node.name}({wire_map[node.qargs[0]]}, {wire_map[node.qargs[1]]}) failed"
|
92
89
|
)
|
93
90
|
return False
|
94
91
|
return True
|
@@ -17,12 +17,11 @@ from qiskit.circuit import (
|
|
17
17
|
CircuitInstruction,
|
18
18
|
ClassicalRegister,
|
19
19
|
Clbit,
|
20
|
-
ControlFlowOp,
|
21
20
|
IfElseOp,
|
22
21
|
QuantumCircuit,
|
23
22
|
)
|
24
23
|
from qiskit.dagcircuit import DAGCircuit
|
25
|
-
from qiskit.transpiler import TransformationPass
|
24
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
26
25
|
|
27
26
|
|
28
27
|
class ConvertConditionsToIfOps(TransformationPass):
|
@@ -37,7 +36,7 @@ class ConvertConditionsToIfOps(TransformationPass):
|
|
37
36
|
was modified and ``False`` if not."""
|
38
37
|
modified = False
|
39
38
|
for node in dag.op_nodes():
|
40
|
-
if
|
39
|
+
if node.is_control_flow():
|
41
40
|
modified_blocks = False
|
42
41
|
new_dags = []
|
43
42
|
for block in node.op.blocks:
|
@@ -51,7 +50,7 @@ class ConvertConditionsToIfOps(TransformationPass):
|
|
51
50
|
node.op.replace_blocks(dag_to_circuit(block) for block in new_dags),
|
52
51
|
inplace=True,
|
53
52
|
)
|
54
|
-
elif
|
53
|
+
elif node.condition is None:
|
55
54
|
continue
|
56
55
|
else:
|
57
56
|
target, value = node.op.condition
|
@@ -43,7 +43,7 @@ class Error(AnalysisPass):
|
|
43
43
|
if action in ["raise", "warn", "log"]:
|
44
44
|
self.action = action
|
45
45
|
else:
|
46
|
-
raise TranspilerError("Unknown action:
|
46
|
+
raise TranspilerError(f"Unknown action: {action}")
|
47
47
|
|
48
48
|
def run(self, _):
|
49
49
|
"""Run the Error pass on `dag`."""
|
@@ -66,4 +66,4 @@ class Error(AnalysisPass):
|
|
66
66
|
logger = logging.getLogger(__name__)
|
67
67
|
logger.info(msg)
|
68
68
|
else:
|
69
|
-
raise TranspilerError("Unknown action:
|
69
|
+
raise TranspilerError(f"Unknown action: {self.action}")
|
@@ -37,12 +37,12 @@ class FixedPoint(AnalysisPass):
|
|
37
37
|
def run(self, dag):
|
38
38
|
"""Run the FixedPoint pass on `dag`."""
|
39
39
|
current_value = self.property_set[self._property]
|
40
|
-
fixed_point_previous_property = "_fixed_point_previous_
|
40
|
+
fixed_point_previous_property = f"_fixed_point_previous_{self._property}"
|
41
41
|
|
42
42
|
if self.property_set[fixed_point_previous_property] is None:
|
43
|
-
self.property_set["
|
43
|
+
self.property_set[f"{self._property}_fixed_point"] = False
|
44
44
|
else:
|
45
45
|
fixed_point_reached = self.property_set[fixed_point_previous_property] == current_value
|
46
|
-
self.property_set["
|
46
|
+
self.property_set[f"{self._property}_fixed_point"] = fixed_point_reached
|
47
47
|
|
48
48
|
self.property_set[fixed_point_previous_property] = deepcopy(current_value)
|
@@ -67,7 +67,7 @@ class GateDirection(TransformationPass):
|
|
67
67
|
└──────┘ └───┘└──────┘└───┘
|
68
68
|
|
69
69
|
This pass assumes that the positions of the qubits in the :attr:`.DAGCircuit.qubits` attribute
|
70
|
-
are the physical qubit
|
70
|
+
are the physical qubit indices. For example if ``dag.qubits[0]`` is qubit 0 in the
|
71
71
|
:class:`.CouplingMap` or :class:`.Target`.
|
72
72
|
"""
|
73
73
|
|
@@ -12,7 +12,6 @@
|
|
12
12
|
|
13
13
|
"""Check if all gates in the DAGCircuit are in the specified basis gates."""
|
14
14
|
|
15
|
-
from qiskit.circuit import ControlFlowOp
|
16
15
|
from qiskit.converters import circuit_to_dag
|
17
16
|
from qiskit.transpiler.basepasses import AnalysisPass
|
18
17
|
|
@@ -55,7 +54,7 @@ class GatesInBasis(AnalysisPass):
|
|
55
54
|
return True
|
56
55
|
# Control-flow ops still need to be supported, so don't skip them in the
|
57
56
|
# previous checks.
|
58
|
-
if
|
57
|
+
if gate.is_control_flow():
|
59
58
|
for block in gate.op.blocks:
|
60
59
|
inner_wire_map = {
|
61
60
|
inner: wire_map[outer]
|
qiskit/transpiler/passmanager.py
CHANGED
@@ -18,7 +18,7 @@ import io
|
|
18
18
|
import re
|
19
19
|
from collections.abc import Iterator, Iterable, Callable
|
20
20
|
from functools import wraps
|
21
|
-
from typing import Union, List, Any
|
21
|
+
from typing import Union, List, Any, TypeVar
|
22
22
|
|
23
23
|
from qiskit.circuit import QuantumCircuit
|
24
24
|
from qiskit.converters import circuit_to_dag, dag_to_circuit
|
@@ -31,7 +31,7 @@ from .basepasses import BasePass
|
|
31
31
|
from .exceptions import TranspilerError
|
32
32
|
from .layout import TranspileLayout, Layout
|
33
33
|
|
34
|
-
_CircuitsT = Union[List[QuantumCircuit], QuantumCircuit]
|
34
|
+
_CircuitsT = TypeVar("_CircuitsT", bound=Union[List[QuantumCircuit], QuantumCircuit])
|
35
35
|
|
36
36
|
|
37
37
|
class PassManager(BasePassManager):
|
@@ -121,6 +121,7 @@ class PassManager(BasePassManager):
|
|
121
121
|
# Ordered list of original qubits
|
122
122
|
original_qubits_reverse = {v: k for k, v in original_qubit_indices.items()}
|
123
123
|
original_qubits = []
|
124
|
+
# pylint: disable-next=consider-using-enumerate
|
124
125
|
for i in range(len(original_qubits_reverse)):
|
125
126
|
original_qubits.append(original_qubits_reverse[i])
|
126
127
|
|
@@ -139,7 +140,7 @@ class PassManager(BasePassManager):
|
|
139
140
|
self.property_set["layout"] = t_initial_layout
|
140
141
|
self.property_set["final_layout"] = new_final_layout
|
141
142
|
|
142
|
-
def append(
|
143
|
+
def append( # pylint:disable=arguments-renamed
|
143
144
|
self,
|
144
145
|
passes: Task | list[Task],
|
145
146
|
) -> None:
|
@@ -153,7 +154,7 @@ class PassManager(BasePassManager):
|
|
153
154
|
"""
|
154
155
|
super().append(tasks=passes)
|
155
156
|
|
156
|
-
def replace(
|
157
|
+
def replace( # pylint:disable=arguments-renamed
|
157
158
|
self,
|
158
159
|
index: int,
|
159
160
|
passes: Task | list[Task],
|
@@ -167,7 +168,7 @@ class PassManager(BasePassManager):
|
|
167
168
|
super().replace(index, tasks=passes)
|
168
169
|
|
169
170
|
# pylint: disable=arguments-differ
|
170
|
-
def run(
|
171
|
+
def run( # pylint:disable=arguments-renamed
|
171
172
|
self,
|
172
173
|
circuits: _CircuitsT,
|
173
174
|
output_name: str | None = None,
|
@@ -337,7 +338,7 @@ class StagedPassManager(PassManager):
|
|
337
338
|
"scheduling",
|
338
339
|
]
|
339
340
|
self._validate_stages(stages)
|
340
|
-
# Set through parent class since `__setattr__`
|
341
|
+
# Set through parent class since `__setattr__` requires `expanded_stages` to be defined
|
341
342
|
super().__setattr__("_stages", tuple(stages))
|
342
343
|
super().__setattr__("_expanded_stages", tuple(self._generate_expanded_stages()))
|
343
344
|
super().__init__()
|