Skip to content

Commit 2f81bde

Browse files
committed
Skip validation on gate creation from rust
1 parent 3ea95de commit 2f81bde

File tree

9 files changed

+108
-16
lines changed

9 files changed

+108
-16
lines changed

crates/circuit/src/circuit_instruction.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -626,12 +626,20 @@ pub(crate) fn operation_type_and_data_to_py(
626626
} else {
627627
PyTuple::new_bound(py, params)
628628
};
629-
let kwargs = [
629+
let mut kwargs_list = vec![
630630
("label", label.to_object(py)),
631631
("unit", unit.to_object(py)),
632632
("duration", duration.to_object(py)),
633-
]
634-
.into_py_dict_bound(py);
633+
];
634+
if let Some(params) = params {
635+
if !params.is_empty() {
636+
kwargs_list.push(
637+
("_skip_validation", true.to_object(py))
638+
);
639+
}
640+
}
641+
642+
let kwargs = kwargs_list.into_py_dict_bound(py);
635643
let mut out = gate_class.call_bound(py, args, Some(&kwargs))?;
636644
if condition.is_some() {
637645
out = out.call_method0(py, "to_mutable")?;

qiskit/circuit/gate.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
from qiskit.circuit.parameterexpression import ParameterExpression
2020
from qiskit.circuit.exceptions import CircuitError
21+
from qiskit._accelerate.circuit import StandardGate
2122
from .annotated_operation import AnnotatedOperation, ControlModifier, PowerModifier
2223
from .instruction import Instruction
2324

@@ -33,6 +34,7 @@ def __init__(
3334
label: str | None = None,
3435
duration=None,
3536
unit="dt",
37+
_skip_validation=False,
3638
) -> None:
3739
"""Create a new gate.
3840
@@ -42,6 +44,7 @@ def __init__(
4244
params: A list of parameters.
4345
label: An optional label for the gate.
4446
"""
47+
self._skip_validation = _skip_validation
4548
self.definition = None
4649
super().__init__(name, num_qubits, 0, params, label=label, duration=duration, unit=unit)
4750

@@ -238,7 +241,9 @@ def broadcast_arguments(self, qargs: list, cargs: list) -> Iterable[tuple[list,
238241
else:
239242
raise CircuitError("This gate cannot handle %i arguments" % len(qargs))
240243

241-
def validate_parameter(self, parameter):
244+
def validate_parameter(self, parameter, _force_validation=False):
245+
if (isinstance(self, StandardGate) or self._skip_validation) and not _force_validation:
246+
return parameter
242247
"""Gate parameters should be int, float, or ParameterExpression"""
243248
if isinstance(parameter, ParameterExpression):
244249
if len(parameter.parameters) > 0:

qiskit/circuit/library/standard_gates/global_phase.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,28 @@ class GlobalPhaseGate(Gate):
4040
_standard_gate = StandardGate.GlobalPhaseGate
4141

4242
def __init__(
43-
self, phase: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
43+
self,
44+
phase: ParameterValueType,
45+
label: Optional[str] = None,
46+
*,
47+
duration=None,
48+
unit="dt",
49+
_skip_validation=False,
4450
):
4551
"""
4652
Args:
4753
phase: The value of phase it takes.
4854
label: An optional label for the gate.
4955
"""
50-
super().__init__("global_phase", 0, [phase], label=label, duration=duration, unit=unit)
56+
super().__init__(
57+
"global_phase",
58+
0,
59+
[phase],
60+
label=label,
61+
duration=duration,
62+
unit=unit,
63+
_skip_validation=_skip_validation,
64+
)
5165

5266
def _define(self):
5367
q = QuantumRegister(0, "q")

qiskit/circuit/library/standard_gates/p.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,24 @@ class PhaseGate(Gate):
7979
_standard_gate = StandardGate.PhaseGate
8080

8181
def __init__(
82-
self, theta: ParameterValueType, label: str | None = None, *, duration=None, unit="dt"
82+
self,
83+
theta: ParameterValueType,
84+
label: str | None = None,
85+
*,
86+
duration=None,
87+
unit="dt",
88+
_skip_validation=False,
8389
):
8490
"""Create new Phase gate."""
85-
super().__init__("p", 1, [theta], label=label, duration=duration, unit=unit)
91+
super().__init__(
92+
"p",
93+
1,
94+
[theta],
95+
label=label,
96+
duration=duration,
97+
unit=unit,
98+
_skip_validation=_skip_validation,
99+
)
86100

87101
def _define(self):
88102
# pylint: disable=cyclic-import

qiskit/circuit/library/standard_gates/rx.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,24 @@ class RXGate(Gate):
5454
_standard_gate = StandardGate.RXGate
5555

5656
def __init__(
57-
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
57+
self,
58+
theta: ParameterValueType,
59+
label: Optional[str] = None,
60+
*,
61+
duration=None,
62+
unit="dt",
63+
_skip_validation=False,
5864
):
5965
"""Create new RX gate."""
60-
super().__init__("rx", 1, [theta], label=label, duration=duration, unit=unit)
66+
super().__init__(
67+
"rx",
68+
1,
69+
[theta],
70+
label=label,
71+
duration=duration,
72+
unit=unit,
73+
_skip_validation=_skip_validation,
74+
)
6175

6276
def _define(self):
6377
"""

qiskit/circuit/library/standard_gates/ry.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,24 @@ class RYGate(Gate):
5353
_standard_gate = StandardGate.RYGate
5454

5555
def __init__(
56-
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
56+
self,
57+
theta: ParameterValueType,
58+
label: Optional[str] = None,
59+
*,
60+
duration=None,
61+
unit="dt",
62+
_skip_validation=False,
5763
):
5864
"""Create new RY gate."""
59-
super().__init__("ry", 1, [theta], label=label, duration=duration, unit=unit)
65+
super().__init__(
66+
"ry",
67+
1,
68+
[theta],
69+
label=label,
70+
duration=duration,
71+
unit=unit,
72+
_skip_validation=_skip_validation,
73+
)
6074

6175
def _define(self):
6276
"""

qiskit/circuit/library/standard_gates/rz.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,24 @@ class RZGate(Gate):
6363
_standard_gate = StandardGate.RZGate
6464

6565
def __init__(
66-
self, phi: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
66+
self,
67+
phi: ParameterValueType,
68+
label: Optional[str] = None,
69+
*,
70+
duration=None,
71+
unit="dt",
72+
_skip_validation=False,
6773
):
6874
"""Create new RZ gate."""
69-
super().__init__("rz", 1, [phi], label=label, duration=duration, unit=unit)
75+
super().__init__(
76+
"rz",
77+
1,
78+
[phi],
79+
label=label,
80+
duration=duration,
81+
unit=unit,
82+
_skip_validation=_skip_validation,
83+
)
7084

7185
def _define(self):
7286
"""

qiskit/circuit/library/standard_gates/u.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,18 @@ def __init__(
8080
*,
8181
duration=None,
8282
unit="dt",
83+
_skip_validation=False,
8384
):
8485
"""Create new U gate."""
85-
super().__init__("u", 1, [theta, phi, lam], label=label, duration=duration, unit=unit)
86+
super().__init__(
87+
"u",
88+
1,
89+
[theta, phi, lam],
90+
label=label,
91+
duration=duration,
92+
unit=unit,
93+
_skip_validation=_skip_validation,
94+
)
8695

8796
def inverse(self, annotated: bool = False):
8897
r"""Return inverted U gate.

qiskit/circuit/quantumcircuit.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2317,7 +2317,7 @@ def _append_standard_gate(
23172317
expanded_cargs = [self.cbit_argument_conversion(carg) for carg in cargs or []]
23182318
if params is not None:
23192319
for param in params:
2320-
Gate.validate_parameter(op, param)
2320+
Gate.validate_parameter(op, param, _force_validation=True)
23212321

23222322
instructions = InstructionSet(resource_requester=circuit_scope.resolve_classical_resource)
23232323
broadcast_iter = Gate.broadcast_arguments(op, expanded_qargs, expanded_cargs)

0 commit comments

Comments
 (0)