diff --git a/crates/circuit/src/circuit_instruction.rs b/crates/circuit/src/circuit_instruction.rs index a51f67abddd1..7927d5248e4d 100644 --- a/crates/circuit/src/circuit_instruction.rs +++ b/crates/circuit/src/circuit_instruction.rs @@ -626,12 +626,20 @@ pub(crate) fn operation_type_and_data_to_py( } else { PyTuple::new_bound(py, params) }; - let kwargs = [ + let mut kwargs_list = vec![ ("label", label.to_object(py)), ("unit", unit.to_object(py)), ("duration", duration.to_object(py)), - ] - .into_py_dict_bound(py); + ]; + if let Some(params) = params { + if !params.is_empty() { + kwargs_list.push( + ("_skip_validation", true.to_object(py)) + ); + } + } + + let kwargs = kwargs_list.into_py_dict_bound(py); let mut out = gate_class.call_bound(py, args, Some(&kwargs))?; if condition.is_some() { out = out.call_method0(py, "to_mutable")?; diff --git a/qiskit/circuit/gate.py b/qiskit/circuit/gate.py index 132526775860..5e644a2679ef 100644 --- a/qiskit/circuit/gate.py +++ b/qiskit/circuit/gate.py @@ -18,6 +18,7 @@ from qiskit.circuit.parameterexpression import ParameterExpression from qiskit.circuit.exceptions import CircuitError +from qiskit._accelerate.circuit import StandardGate from .annotated_operation import AnnotatedOperation, ControlModifier, PowerModifier from .instruction import Instruction @@ -33,6 +34,7 @@ def __init__( label: str | None = None, duration=None, unit="dt", + _skip_validation=False, ) -> None: """Create a new gate. @@ -42,6 +44,7 @@ def __init__( params: A list of parameters. label: An optional label for the gate. """ + self._skip_validation = _skip_validation self.definition = None super().__init__(name, num_qubits, 0, params, label=label, duration=duration, unit=unit) @@ -238,7 +241,9 @@ def broadcast_arguments(self, qargs: list, cargs: list) -> Iterable[tuple[list, else: raise CircuitError("This gate cannot handle %i arguments" % len(qargs)) - def validate_parameter(self, parameter): + def validate_parameter(self, parameter, _force_validation=False): + if (isinstance(self, StandardGate) or self._skip_validation) and not _force_validation: + return parameter """Gate parameters should be int, float, or ParameterExpression""" if isinstance(parameter, ParameterExpression): if len(parameter.parameters) > 0: diff --git a/qiskit/circuit/library/standard_gates/global_phase.py b/qiskit/circuit/library/standard_gates/global_phase.py index 59d6b56373da..253970ad5f9a 100644 --- a/qiskit/circuit/library/standard_gates/global_phase.py +++ b/qiskit/circuit/library/standard_gates/global_phase.py @@ -40,14 +40,28 @@ class GlobalPhaseGate(Gate): _standard_gate = StandardGate.GlobalPhaseGate def __init__( - self, phase: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt" + self, + phase: ParameterValueType, + label: Optional[str] = None, + *, + duration=None, + unit="dt", + _skip_validation=False, ): """ Args: phase: The value of phase it takes. label: An optional label for the gate. """ - super().__init__("global_phase", 0, [phase], label=label, duration=duration, unit=unit) + super().__init__( + "global_phase", + 0, + [phase], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def _define(self): q = QuantumRegister(0, "q") diff --git a/qiskit/circuit/library/standard_gates/p.py b/qiskit/circuit/library/standard_gates/p.py index 1a792649feab..a1bb0214503b 100644 --- a/qiskit/circuit/library/standard_gates/p.py +++ b/qiskit/circuit/library/standard_gates/p.py @@ -79,10 +79,24 @@ class PhaseGate(Gate): _standard_gate = StandardGate.PhaseGate def __init__( - self, theta: ParameterValueType, label: str | None = None, *, duration=None, unit="dt" + self, + theta: ParameterValueType, + label: str | None = None, + *, + duration=None, + unit="dt", + _skip_validation=False, ): """Create new Phase gate.""" - super().__init__("p", 1, [theta], label=label, duration=duration, unit=unit) + super().__init__( + "p", + 1, + [theta], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def _define(self): # pylint: disable=cyclic-import diff --git a/qiskit/circuit/library/standard_gates/rx.py b/qiskit/circuit/library/standard_gates/rx.py index 5579f9d3707d..1a825485808d 100644 --- a/qiskit/circuit/library/standard_gates/rx.py +++ b/qiskit/circuit/library/standard_gates/rx.py @@ -54,10 +54,24 @@ class RXGate(Gate): _standard_gate = StandardGate.RXGate def __init__( - self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt" + self, + theta: ParameterValueType, + label: Optional[str] = None, + *, + duration=None, + unit="dt", + _skip_validation=False, ): """Create new RX gate.""" - super().__init__("rx", 1, [theta], label=label, duration=duration, unit=unit) + super().__init__( + "rx", + 1, + [theta], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def _define(self): """ diff --git a/qiskit/circuit/library/standard_gates/ry.py b/qiskit/circuit/library/standard_gates/ry.py index e27398cc2960..9308329e0f6b 100644 --- a/qiskit/circuit/library/standard_gates/ry.py +++ b/qiskit/circuit/library/standard_gates/ry.py @@ -53,10 +53,24 @@ class RYGate(Gate): _standard_gate = StandardGate.RYGate def __init__( - self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt" + self, + theta: ParameterValueType, + label: Optional[str] = None, + *, + duration=None, + unit="dt", + _skip_validation=False, ): """Create new RY gate.""" - super().__init__("ry", 1, [theta], label=label, duration=duration, unit=unit) + super().__init__( + "ry", + 1, + [theta], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def _define(self): """ diff --git a/qiskit/circuit/library/standard_gates/rz.py b/qiskit/circuit/library/standard_gates/rz.py index e8ee0f976036..2087d878b72d 100644 --- a/qiskit/circuit/library/standard_gates/rz.py +++ b/qiskit/circuit/library/standard_gates/rz.py @@ -63,10 +63,24 @@ class RZGate(Gate): _standard_gate = StandardGate.RZGate def __init__( - self, phi: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt" + self, + phi: ParameterValueType, + label: Optional[str] = None, + *, + duration=None, + unit="dt", + _skip_validation=False, ): """Create new RZ gate.""" - super().__init__("rz", 1, [phi], label=label, duration=duration, unit=unit) + super().__init__( + "rz", + 1, + [phi], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def _define(self): """ diff --git a/qiskit/circuit/library/standard_gates/u.py b/qiskit/circuit/library/standard_gates/u.py index 3495bc180f08..3af63a21c994 100644 --- a/qiskit/circuit/library/standard_gates/u.py +++ b/qiskit/circuit/library/standard_gates/u.py @@ -80,9 +80,18 @@ def __init__( *, duration=None, unit="dt", + _skip_validation=False, ): """Create new U gate.""" - super().__init__("u", 1, [theta, phi, lam], label=label, duration=duration, unit=unit) + super().__init__( + "u", + 1, + [theta, phi, lam], + label=label, + duration=duration, + unit=unit, + _skip_validation=_skip_validation, + ) def inverse(self, annotated: bool = False): r"""Return inverted U gate. diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index e6fa525f72e8..42070e704e0a 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -2317,7 +2317,7 @@ def _append_standard_gate( expanded_cargs = [self.cbit_argument_conversion(carg) for carg in cargs or []] if params is not None: for param in params: - Gate.validate_parameter(op, param) + Gate.validate_parameter(op, param, _force_validation=True) instructions = InstructionSet(resource_requester=circuit_scope.resolve_classical_resource) broadcast_iter = Gate.broadcast_arguments(op, expanded_qargs, expanded_cargs)