qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.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.abi3.so +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/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 +395 -387
- 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 +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 +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 +514 -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 +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 +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 +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 +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 +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 +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_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/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 +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 +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 +18 -23
- 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 +2 -2
- 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.0.dist-info}/METADATA +12 -12
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
- {qiskit-1.1.2.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.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -80,15 +80,13 @@ class Permutation(QuantumCircuit):
|
|
80
80
|
|
81
81
|
name = "permutation_" + np.array_str(pattern).replace(" ", ",")
|
82
82
|
|
83
|
-
circuit = QuantumCircuit(num_qubits, name=name)
|
84
|
-
|
85
83
|
super().__init__(num_qubits, name=name)
|
86
84
|
|
87
85
|
# pylint: disable=cyclic-import
|
88
|
-
from qiskit.synthesis.permutation
|
86
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
89
87
|
|
90
|
-
|
91
|
-
|
88
|
+
circuit = synth_permutation_basic(pattern)
|
89
|
+
circuit.name = name
|
92
90
|
|
93
91
|
all_qubits = self.qubits
|
94
92
|
self.append(circuit.to_gate(), all_qubits)
|
@@ -184,10 +182,11 @@ class PermutationGate(Gate):
|
|
184
182
|
|
185
183
|
def _qasm2_decomposition(self):
|
186
184
|
# pylint: disable=cyclic-import
|
187
|
-
from qiskit.synthesis.permutation
|
185
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
188
186
|
|
189
187
|
name = f"permutation__{'_'.join(str(n) for n in self.pattern)}_"
|
190
|
-
|
191
|
-
|
192
|
-
|
188
|
+
|
189
|
+
out = synth_permutation_basic(self.pattern)
|
190
|
+
out.name = name
|
191
|
+
|
193
192
|
return out.to_gate()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2020.
|
3
|
+
# (C) Copyright IBM 2020, 2024.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -148,10 +148,10 @@ class UCGate(Gate):
|
|
148
148
|
the diagonal gate is also returned.
|
149
149
|
"""
|
150
150
|
diag = np.ones(2**self.num_qubits).tolist()
|
151
|
-
q = QuantumRegister(self.num_qubits)
|
151
|
+
q = QuantumRegister(self.num_qubits, "q")
|
152
152
|
q_controls = q[1:]
|
153
153
|
q_target = q[0]
|
154
|
-
circuit = QuantumCircuit(q)
|
154
|
+
circuit = QuantumCircuit(q, name="uc")
|
155
155
|
# If there is no control, we use the ZYZ decomposition
|
156
156
|
if not q_controls:
|
157
157
|
circuit.unitary(self.params[0], [q])
|
@@ -69,7 +69,7 @@ class UCPauliRotGate(Gate):
|
|
69
69
|
def _define(self):
|
70
70
|
ucr_circuit = self._dec_ucrot()
|
71
71
|
gate = ucr_circuit.to_instruction()
|
72
|
-
q = QuantumRegister(self.num_qubits)
|
72
|
+
q = QuantumRegister(self.num_qubits, "q")
|
73
73
|
ucr_circuit = QuantumCircuit(q)
|
74
74
|
ucr_circuit.append(gate, q[:])
|
75
75
|
self.definition = ucr_circuit
|
@@ -79,7 +79,7 @@ class UCPauliRotGate(Gate):
|
|
79
79
|
Finds a decomposition of a UC rotation gate into elementary gates
|
80
80
|
(C-NOTs and single-qubit rotations).
|
81
81
|
"""
|
82
|
-
q = QuantumRegister(self.num_qubits)
|
82
|
+
q = QuantumRegister(self.num_qubits, "q")
|
83
83
|
circuit = QuantumCircuit(q)
|
84
84
|
q_target = q[0]
|
85
85
|
q_controls = q[1:]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2017,
|
3
|
+
# (C) Copyright IBM 2017, 2024.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -30,14 +30,8 @@ from qiskit.circuit.library.standard_gates.u import UGate
|
|
30
30
|
from qiskit.quantum_info.operators.predicates import matrix_equal
|
31
31
|
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
32
32
|
|
33
|
-
# pylint: disable=cyclic-import
|
34
|
-
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
35
|
-
from qiskit.synthesis.two_qubit.two_qubit_decompose import two_qubit_cnot_decompose
|
36
|
-
|
37
33
|
from .isometry import Isometry
|
38
34
|
|
39
|
-
_DECOMPOSER1Q = OneQubitEulerDecomposer("U")
|
40
|
-
|
41
35
|
if typing.TYPE_CHECKING:
|
42
36
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
43
37
|
|
@@ -143,13 +137,21 @@ class UnitaryGate(Gate):
|
|
143
137
|
def _define(self):
|
144
138
|
"""Calculate a subcircuit that implements this unitary."""
|
145
139
|
if self.num_qubits == 1:
|
140
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
141
|
+
|
146
142
|
q = QuantumRegister(1, "q")
|
147
143
|
qc = QuantumCircuit(q, name=self.name)
|
148
|
-
theta, phi, lam, global_phase =
|
144
|
+
theta, phi, lam, global_phase = OneQubitEulerDecomposer("U").angles_and_phase(
|
145
|
+
self.to_matrix()
|
146
|
+
)
|
149
147
|
qc._append(UGate(theta, phi, lam), [q[0]], [])
|
150
148
|
qc.global_phase = global_phase
|
151
149
|
self.definition = qc
|
152
150
|
elif self.num_qubits == 2:
|
151
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import ( # pylint: disable=cyclic-import
|
152
|
+
two_qubit_cnot_decompose,
|
153
|
+
)
|
154
|
+
|
153
155
|
self.definition = two_qubit_cnot_decompose(self.to_matrix())
|
154
156
|
else:
|
155
157
|
from qiskit.synthesis.unitary.qsd import ( # pylint: disable=cyclic-import
|
@@ -163,7 +165,7 @@ class UnitaryGate(Gate):
|
|
163
165
|
num_ctrl_qubits: int = 1,
|
164
166
|
label: str | None = None,
|
165
167
|
ctrl_state: int | str | None = None,
|
166
|
-
annotated: bool =
|
168
|
+
annotated: bool | None = None,
|
167
169
|
) -> ControlledGate | AnnotatedOperation:
|
168
170
|
"""Return controlled version of gate.
|
169
171
|
|
@@ -172,8 +174,8 @@ class UnitaryGate(Gate):
|
|
172
174
|
label: Optional gate label.
|
173
175
|
ctrl_state: The control state in decimal or as a bit string (e.g. ``"1011"``).
|
174
176
|
If ``None``, use ``2**num_ctrl_qubits - 1``.
|
175
|
-
annotated: indicates whether the controlled gate
|
176
|
-
as an annotated gate.
|
177
|
+
annotated: indicates whether the controlled gate should be implemented
|
178
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
177
179
|
|
178
180
|
Returns:
|
179
181
|
Controlled version of gate.
|
@@ -74,7 +74,7 @@ class GraphState(QuantumCircuit):
|
|
74
74
|
raise CircuitError("The adjacency matrix must be symmetric.")
|
75
75
|
|
76
76
|
num_qubits = len(adjacency_matrix)
|
77
|
-
circuit = QuantumCircuit(num_qubits, name="graph:
|
77
|
+
circuit = QuantumCircuit(num_qubits, name=f"graph: {adjacency_matrix}")
|
78
78
|
|
79
79
|
circuit.h(range(num_qubits))
|
80
80
|
for i in range(num_qubits):
|
@@ -103,8 +103,7 @@ class HamiltonianGate(Gate):
|
|
103
103
|
time = float(self.params[1])
|
104
104
|
except TypeError as ex:
|
105
105
|
raise TypeError(
|
106
|
-
"Unable to generate Unitary matrix for "
|
107
|
-
"unbound t parameter {}".format(self.params[1])
|
106
|
+
f"Unable to generate Unitary matrix for unbound t parameter {self.params[1]}"
|
108
107
|
) from ex
|
109
108
|
arr = scipy.linalg.expm(-1j * self.params[0] * time)
|
110
109
|
dtype = complex if dtype is None else dtype
|
@@ -82,7 +82,7 @@ class HiddenLinearFunction(QuantumCircuit):
|
|
82
82
|
raise CircuitError("The adjacency matrix must be symmetric.")
|
83
83
|
|
84
84
|
num_qubits = len(adjacency_matrix)
|
85
|
-
circuit = QuantumCircuit(num_qubits, name="hlf:
|
85
|
+
circuit = QuantumCircuit(num_qubits, name=f"hlf: {adjacency_matrix}")
|
86
86
|
|
87
87
|
circuit.h(range(num_qubits))
|
88
88
|
for i in range(num_qubits):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2021.
|
3
|
+
# (C) Copyright IBM 2021, 2024.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -22,7 +22,6 @@ from qiskit.circuit.parameter import Parameter
|
|
22
22
|
from qiskit.circuit.quantumregister import QuantumRegister
|
23
23
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
24
24
|
from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
|
25
|
-
from qiskit.synthesis.evolution import LieTrotter
|
26
25
|
|
27
26
|
from .n_local import NLocal
|
28
27
|
|
@@ -185,6 +184,8 @@ class EvolvedOperatorAnsatz(NLocal):
|
|
185
184
|
gate = HamiltonianGate(operator, time)
|
186
185
|
# otherwise, use the PauliEvolutionGate
|
187
186
|
else:
|
187
|
+
from qiskit.synthesis.evolution import LieTrotter
|
188
|
+
|
188
189
|
evolution = LieTrotter() if self._evolution is None else self._evolution
|
189
190
|
gate = PauliEvolutionGate(operator, time, synthesis=evolution)
|
190
191
|
|
@@ -162,7 +162,7 @@ class NLocal(BlueprintCircuit):
|
|
162
162
|
self._bounds: list[tuple[float | None, float | None]] | None = None
|
163
163
|
self._flatten = flatten
|
164
164
|
|
165
|
-
# During the build, if a subclass hasn't overridden our
|
165
|
+
# During the build, if a subclass hasn't overridden our parametrization methods, we can use
|
166
166
|
# a newer fast-path method to parametrise the rotation and entanglement blocks if internally
|
167
167
|
# those are just simple stdlib gates that have been promoted to circuits. We don't
|
168
168
|
# precalculate the fast-path layers themselves because there's far too much that can be
|
@@ -441,9 +441,8 @@ class NLocal(BlueprintCircuit):
|
|
441
441
|
):
|
442
442
|
raise ValueError(
|
443
443
|
"The length of ordered parameters must be equal to the number of "
|
444
|
-
"settable parameters in the circuit ({}),
|
445
|
-
|
446
|
-
)
|
444
|
+
f"settable parameters in the circuit ({self.num_parameters_settable}),"
|
445
|
+
f" but is {len(parameters)}"
|
447
446
|
)
|
448
447
|
self._ordered_parameters = parameters
|
449
448
|
self._invalidate()
|
@@ -1094,7 +1093,7 @@ def _stdlib_gate_from_simple_block(block: QuantumCircuit) -> _StdlibGateResult |
|
|
1094
1093
|
return None
|
1095
1094
|
instruction = block.data[0]
|
1096
1095
|
# If the single instruction isn't a standard-library gate that spans the full width of the block
|
1097
|
-
# in the correct order, we're not simple. If the gate isn't fully
|
1096
|
+
# in the correct order, we're not simple. If the gate isn't fully parametrized with pure,
|
1098
1097
|
# unique `Parameter` instances (expressions are too complex) that are in order, we're not
|
1099
1098
|
# simple.
|
1100
1099
|
if (
|
@@ -118,7 +118,7 @@ class PauliTwoDesign(TwoLocal):
|
|
118
118
|
qubits = range(self.num_qubits)
|
119
119
|
|
120
120
|
# if no gates for this layer were generated, generate them
|
121
|
-
if i not in self._gates
|
121
|
+
if i not in self._gates:
|
122
122
|
self._gates[i] = list(self._rng.choice(["rx", "ry", "rz"], self.num_qubits))
|
123
123
|
# if not enough gates exist, add more
|
124
124
|
elif len(self._gates[i]) < self.num_qubits:
|
@@ -97,20 +97,18 @@ class QAOAAnsatz(EvolvedOperatorAnsatz):
|
|
97
97
|
valid = False
|
98
98
|
if raise_on_failure:
|
99
99
|
raise ValueError(
|
100
|
-
"The number of qubits of the initial state {}
|
101
|
-
"
|
102
|
-
|
103
|
-
)
|
100
|
+
f"The number of qubits of the initial state {self.initial_state.num_qubits}"
|
101
|
+
" does not match "
|
102
|
+
f"the number of qubits of the cost operator {self.num_qubits}"
|
104
103
|
)
|
105
104
|
|
106
105
|
if self.mixer_operator is not None and self.mixer_operator.num_qubits != self.num_qubits:
|
107
106
|
valid = False
|
108
107
|
if raise_on_failure:
|
109
108
|
raise ValueError(
|
110
|
-
"The number of qubits of the mixer {}
|
111
|
-
"
|
112
|
-
|
113
|
-
)
|
109
|
+
f"The number of qubits of the mixer {self.mixer_operator.num_qubits}"
|
110
|
+
f" does not match "
|
111
|
+
f"the number of qubits of the cost operator {self.num_qubits}"
|
114
112
|
)
|
115
113
|
|
116
114
|
return valid
|
@@ -87,7 +87,7 @@ class TwoLocal(NLocal):
|
|
87
87
|
|
88
88
|
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True)
|
89
89
|
>>> qc = QuantumCircuit(3)
|
90
|
-
>>> qc
|
90
|
+
>>> qc &= two
|
91
91
|
>>> print(qc.decompose().draw())
|
92
92
|
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
|
93
93
|
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
|
@@ -59,7 +59,12 @@ class UnitaryOverlap(QuantumCircuit):
|
|
59
59
|
"""
|
60
60
|
|
61
61
|
def __init__(
|
62
|
-
self,
|
62
|
+
self,
|
63
|
+
unitary1: QuantumCircuit,
|
64
|
+
unitary2: QuantumCircuit,
|
65
|
+
prefix1: str = "p1",
|
66
|
+
prefix2: str = "p2",
|
67
|
+
insert_barrier: bool = False,
|
63
68
|
):
|
64
69
|
"""
|
65
70
|
Args:
|
@@ -69,6 +74,7 @@ class UnitaryOverlap(QuantumCircuit):
|
|
69
74
|
if it is parameterized. Defaults to ``"p1"``.
|
70
75
|
prefix2: The name of the parameter vector associated to ``unitary2``,
|
71
76
|
if it is parameterized. Defaults to ``"p2"``.
|
77
|
+
insert_barrier: Whether to insert a barrier between the two unitaries.
|
72
78
|
|
73
79
|
Raises:
|
74
80
|
CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
|
@@ -95,6 +101,8 @@ class UnitaryOverlap(QuantumCircuit):
|
|
95
101
|
# Generate the actual overlap circuit
|
96
102
|
super().__init__(unitaries[0].num_qubits, name="UnitaryOverlap")
|
97
103
|
self.compose(unitaries[0], inplace=True)
|
104
|
+
if insert_barrier:
|
105
|
+
self.barrier()
|
98
106
|
self.compose(unitaries[1].inverse(), inplace=True)
|
99
107
|
|
100
108
|
|
@@ -104,8 +112,6 @@ def _check_unitary(circuit):
|
|
104
112
|
for instruction in circuit.data:
|
105
113
|
if not isinstance(instruction.operation, (Gate, Barrier)):
|
106
114
|
raise CircuitError(
|
107
|
-
|
108
|
-
|
109
|
-
' a gate. "{}" is not a gate instruction'
|
110
|
-
).format(instruction.operation.name)
|
115
|
+
"One or more instructions cannot be converted to"
|
116
|
+
f' a gate. "{instruction.operation.name}" is not a gate instruction'
|
111
117
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This code is part of Qiskit.
|
2
2
|
#
|
3
|
-
# (C) Copyright IBM 2021,
|
3
|
+
# (C) Copyright IBM 2021, 2024.
|
4
4
|
#
|
5
5
|
# This code is licensed under the Apache License, Version 2.0. You may
|
6
6
|
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
@@ -14,14 +14,16 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
from typing import Union, Optional
|
17
|
+
from typing import Union, Optional, TYPE_CHECKING
|
18
18
|
import numpy as np
|
19
19
|
|
20
20
|
from qiskit.circuit.gate import Gate
|
21
21
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
22
|
-
from qiskit.synthesis.evolution import EvolutionSynthesis, LieTrotter
|
23
22
|
from qiskit.quantum_info import Pauli, SparsePauliOp
|
24
23
|
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from qiskit.synthesis.evolution import EvolutionSynthesis
|
26
|
+
|
25
27
|
|
26
28
|
class PauliEvolutionGate(Gate):
|
27
29
|
r"""Time-evolution of an operator consisting of Paulis.
|
@@ -107,6 +109,8 @@ class PauliEvolutionGate(Gate):
|
|
107
109
|
operator = _to_sparse_pauli_op(operator)
|
108
110
|
|
109
111
|
if synthesis is None:
|
112
|
+
from qiskit.synthesis.evolution import LieTrotter
|
113
|
+
|
110
114
|
synthesis = LieTrotter()
|
111
115
|
|
112
116
|
if label is None:
|
@@ -15,6 +15,7 @@
|
|
15
15
|
from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
|
16
16
|
from qiskit.circuit.quantumregister import QuantumRegister
|
17
17
|
from qiskit.circuit._utils import with_gate_array
|
18
|
+
from qiskit._accelerate.circuit import StandardGate
|
18
19
|
|
19
20
|
|
20
21
|
@with_gate_array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]])
|
@@ -48,6 +49,8 @@ class DCXGate(SingletonGate):
|
|
48
49
|
\end{pmatrix}
|
49
50
|
"""
|
50
51
|
|
52
|
+
_standard_gate = StandardGate.DCXGate
|
53
|
+
|
51
54
|
def __init__(self, label=None, *, duration=None, unit="dt"):
|
52
55
|
"""Create new DCX gate."""
|
53
56
|
super().__init__("dcx", 2, [], label=label, duration=duration, unit=unit)
|
@@ -17,6 +17,7 @@ import numpy as np
|
|
17
17
|
from qiskit.circuit._utils import with_gate_array
|
18
18
|
from qiskit.circuit.quantumregister import QuantumRegister
|
19
19
|
from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
|
20
|
+
from qiskit._accelerate.circuit import StandardGate
|
20
21
|
from .rzx import RZXGate
|
21
22
|
from .x import XGate
|
22
23
|
|
@@ -84,6 +85,8 @@ class ECRGate(SingletonGate):
|
|
84
85
|
\end{pmatrix}
|
85
86
|
"""
|
86
87
|
|
88
|
+
_standard_gate = StandardGate.ECRGate
|
89
|
+
|
87
90
|
def __init__(self, label=None, *, duration=None, unit="dt"):
|
88
91
|
"""Create new ECR gate."""
|
89
92
|
super().__init__("ecr", 2, [], label=label, duration=duration, unit=unit)
|
@@ -20,6 +20,7 @@ from qiskit.circuit.gate import Gate
|
|
20
20
|
from qiskit.circuit.quantumregister import QuantumRegister
|
21
21
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
22
|
from qiskit.circuit.parameterexpression import ParameterValueType
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
23
24
|
|
24
25
|
|
25
26
|
class GlobalPhaseGate(Gate):
|
@@ -36,6 +37,8 @@ class GlobalPhaseGate(Gate):
|
|
36
37
|
\end{pmatrix}
|
37
38
|
"""
|
38
39
|
|
40
|
+
_standard_gate = StandardGate.GlobalPhaseGate
|
41
|
+
|
39
42
|
def __init__(
|
40
43
|
self, phase: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
41
44
|
):
|
@@ -11,12 +11,16 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Hadamard gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
from math import sqrt, pi
|
15
18
|
from typing import Optional, Union
|
16
19
|
import numpy
|
17
20
|
from qiskit.circuit.singleton import SingletonGate, SingletonControlledGate, stdlib_singleton_key
|
18
21
|
from qiskit.circuit.quantumregister import QuantumRegister
|
19
22
|
from qiskit.circuit._utils import with_gate_array, with_controlled_gate_array
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
20
24
|
|
21
25
|
_H_ARRAY = 1 / sqrt(2) * numpy.array([[1, 1], [1, -1]], dtype=numpy.complex128)
|
22
26
|
|
@@ -51,6 +55,8 @@ class HGate(SingletonGate):
|
|
51
55
|
\end{pmatrix}
|
52
56
|
"""
|
53
57
|
|
58
|
+
_standard_gate = StandardGate.HGate
|
59
|
+
|
54
60
|
def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
|
55
61
|
"""Create new H gate."""
|
56
62
|
super().__init__("h", 1, [], label=label, duration=duration, unit=unit)
|
@@ -76,9 +82,9 @@ class HGate(SingletonGate):
|
|
76
82
|
def control(
|
77
83
|
self,
|
78
84
|
num_ctrl_qubits: int = 1,
|
79
|
-
label:
|
80
|
-
ctrl_state:
|
81
|
-
annotated: bool =
|
85
|
+
label: str | None = None,
|
86
|
+
ctrl_state: int | str | None = None,
|
87
|
+
annotated: bool | None = None,
|
82
88
|
):
|
83
89
|
"""Return a (multi-)controlled-H gate.
|
84
90
|
|
@@ -89,8 +95,8 @@ class HGate(SingletonGate):
|
|
89
95
|
label: An optional label for the gate [Default: ``None``]
|
90
96
|
ctrl_state: control state expressed as integer,
|
91
97
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
92
|
-
annotated: indicates whether the controlled gate
|
93
|
-
as an annotated gate.
|
98
|
+
annotated: indicates whether the controlled gate should be implemented
|
99
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
94
100
|
|
95
101
|
Returns:
|
96
102
|
ControlledGate: controlled version of this gate.
|
@@ -182,6 +188,8 @@ class CHGate(SingletonControlledGate):
|
|
182
188
|
\end{pmatrix}
|
183
189
|
"""
|
184
190
|
|
191
|
+
_standard_gate = StandardGate.CHGate
|
192
|
+
|
185
193
|
def __init__(
|
186
194
|
self,
|
187
195
|
label: Optional[str] = None,
|
@@ -15,6 +15,7 @@
|
|
15
15
|
from typing import Optional
|
16
16
|
from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
|
17
17
|
from qiskit.circuit._utils import with_gate_array
|
18
|
+
from qiskit._accelerate.circuit import StandardGate
|
18
19
|
|
19
20
|
|
20
21
|
@with_gate_array([[1, 0], [0, 1]])
|
@@ -45,6 +46,8 @@ class IGate(SingletonGate):
|
|
45
46
|
└───┘
|
46
47
|
"""
|
47
48
|
|
49
|
+
_standard_gate = StandardGate.IGate
|
50
|
+
|
48
51
|
def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
|
49
52
|
"""Create new Identity gate."""
|
50
53
|
super().__init__("id", 1, [], label=label, duration=duration, unit=unit)
|
@@ -19,6 +19,7 @@ import numpy as np
|
|
19
19
|
from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
|
20
20
|
from qiskit.circuit.quantumregister import QuantumRegister
|
21
21
|
from qiskit.circuit._utils import with_gate_array
|
22
|
+
from qiskit._accelerate.circuit import StandardGate
|
22
23
|
|
23
24
|
from .xx_plus_yy import XXPlusYYGate
|
24
25
|
|
@@ -85,6 +86,8 @@ class iSwapGate(SingletonGate):
|
|
85
86
|
\end{pmatrix}
|
86
87
|
"""
|
87
88
|
|
89
|
+
_standard_gate = StandardGate.ISwapGate
|
90
|
+
|
88
91
|
def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
|
89
92
|
"""Create new iSwap gate."""
|
90
93
|
super().__init__("iswap", 2, [], label=label, duration=duration, unit=unit)
|
@@ -18,7 +18,7 @@ import math
|
|
18
18
|
from typing import Optional, Union, Tuple, List
|
19
19
|
import numpy as np
|
20
20
|
|
21
|
-
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit
|
21
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit, ParameterExpression
|
22
22
|
from qiskit.circuit.library.standard_gates.x import MCXGate
|
23
23
|
from qiskit.circuit.library.standard_gates.u3 import _generate_gray_code
|
24
24
|
from qiskit.circuit.parameterexpression import ParameterValueType
|
@@ -227,8 +227,8 @@ def mcrx(
|
|
227
227
|
"""
|
228
228
|
from .rx import RXGate
|
229
229
|
|
230
|
-
control_qubits = self.
|
231
|
-
target_qubit = self.
|
230
|
+
control_qubits = self._qbit_argument_conversion(q_controls)
|
231
|
+
target_qubit = self._qbit_argument_conversion(q_target)
|
232
232
|
if len(target_qubit) != 1:
|
233
233
|
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
234
234
|
all_qubits = control_qubits + target_qubit
|
@@ -258,6 +258,9 @@ def mcrx(
|
|
258
258
|
use_basis_gates=use_basis_gates,
|
259
259
|
)
|
260
260
|
else:
|
261
|
+
if isinstance(theta, ParameterExpression):
|
262
|
+
raise QiskitError(f"Cannot synthesize MCRX with unbound parameter: {theta}.")
|
263
|
+
|
261
264
|
cgate = _mcsu2_real_diagonal(
|
262
265
|
RXGate(theta).to_matrix(),
|
263
266
|
num_controls=len(control_qubits),
|
@@ -272,8 +275,8 @@ def mcry(
|
|
272
275
|
q_controls: Union[QuantumRegister, List[Qubit]],
|
273
276
|
q_target: Qubit,
|
274
277
|
q_ancillae: Optional[Union[QuantumRegister, Tuple[QuantumRegister, int]]] = None,
|
275
|
-
mode: str = None,
|
276
|
-
use_basis_gates=False,
|
278
|
+
mode: Optional[str] = None,
|
279
|
+
use_basis_gates: bool = False,
|
277
280
|
):
|
278
281
|
"""
|
279
282
|
Apply Multiple-Controlled Y rotation gate
|
@@ -292,11 +295,11 @@ def mcry(
|
|
292
295
|
"""
|
293
296
|
from .ry import RYGate
|
294
297
|
|
295
|
-
control_qubits = self.
|
296
|
-
target_qubit = self.
|
298
|
+
control_qubits = self._qbit_argument_conversion(q_controls)
|
299
|
+
target_qubit = self._qbit_argument_conversion(q_target)
|
297
300
|
if len(target_qubit) != 1:
|
298
301
|
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
299
|
-
ancillary_qubits = [] if q_ancillae is None else self.
|
302
|
+
ancillary_qubits = [] if q_ancillae is None else self._qbit_argument_conversion(q_ancillae)
|
300
303
|
all_qubits = control_qubits + target_qubit + ancillary_qubits
|
301
304
|
target_qubit = target_qubit[0]
|
302
305
|
self._check_dups(all_qubits)
|
@@ -333,6 +336,9 @@ def mcry(
|
|
333
336
|
use_basis_gates=use_basis_gates,
|
334
337
|
)
|
335
338
|
else:
|
339
|
+
if isinstance(theta, ParameterExpression):
|
340
|
+
raise QiskitError(f"Cannot synthesize MCRY with unbound parameter: {theta}.")
|
341
|
+
|
336
342
|
cgate = _mcsu2_real_diagonal(
|
337
343
|
RYGate(theta).to_matrix(),
|
338
344
|
num_controls=len(control_qubits),
|
@@ -365,8 +371,8 @@ def mcrz(
|
|
365
371
|
"""
|
366
372
|
from .rz import CRZGate, RZGate
|
367
373
|
|
368
|
-
control_qubits = self.
|
369
|
-
target_qubit = self.
|
374
|
+
control_qubits = self._qbit_argument_conversion(q_controls)
|
375
|
+
target_qubit = self._qbit_argument_conversion(q_target)
|
370
376
|
if len(target_qubit) != 1:
|
371
377
|
raise QiskitError("The mcrz gate needs a single qubit as target.")
|
372
378
|
all_qubits = control_qubits + target_qubit
|
@@ -383,6 +389,9 @@ def mcrz(
|
|
383
389
|
else:
|
384
390
|
self.append(CRZGate(lam), control_qubits + [target_qubit])
|
385
391
|
else:
|
392
|
+
if isinstance(lam, ParameterExpression):
|
393
|
+
raise QiskitError(f"Cannot synthesize MCRZ with unbound parameter: {lam}.")
|
394
|
+
|
386
395
|
cgate = _mcsu2_real_diagonal(
|
387
396
|
RZGate(lam).to_matrix(),
|
388
397
|
num_controls=len(control_qubits),
|