Skip to content

Commit 8b38d1e

Browse files
authored
Enhance the ISA check with validation of rzz angle (#1953)
* Enhance the ISA check with validation of rzz angle * lint * lint
1 parent fd2d7c0 commit 8b38d1e

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"backend_name": "fake_fractional", "backend_version": "1.0.5", "n_qubits": 5, "basis_gates": ["id", "rz", "sx", "x", "cx", "reset", "rx", "rzx"], "gates": [{"name": "id", "parameters": [], "qasm_def": "gate id q { U(0, 0, 0) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "rz", "parameters": ["theta"], "qasm_def": "gate rz(theta) q { U(0, 0, theta) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "sx", "parameters": [], "qasm_def": "gate sx q { U(pi/2, 3*pi/2, pi/2) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "x", "parameters": [], "qasm_def": "gate x q { U(pi, 0, pi) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "cx", "parameters": [], "qasm_def": "gate cx q0, q1 { CX q0, q1; }", "coupling_map": [[0, 1], [1, 0], [1, 2], [1, 3], [2, 1], [3, 1], [3, 4], [4, 3]]}, {"name": "reset", "parameters": null, "qasm_def": null}], "local": false, "simulator": false, "conditional": false, "open_pulse": true, "memory": true, "max_shots": 8192, "coupling_map": [[0, 1], [1, 0], [1, 2], [1, 3], [2, 1], [3, 1], [3, 4], [4, 3]], "dynamic_reprate_enabled": true, "supported_instructions": ["measure", "u3", "setf", "x", "delay", "id", "acquire", "sx", "u2", "u1", "cx", "shiftf", "play", "rz", "reset", "rx", "rzx", "if_else", "while_loop"], "rep_delay_range": [0.0, 500.0], "default_rep_delay": 250.0, "max_experiments": 900, "sample_name": "family: Falcon, revision: 4, segment: T", "n_registers": 1, "credits_required": true, "online_date": "2021-01-08T05:00:00+00:00", "description": "5 qubit device fractional tester", "dt": 0.2222222222222222, "dtm": 0.2222222222222222, "processor_type": {"family": "Falcon", "revision": 4, "segment": "T"}, "parametric_pulses": ["gaussian", "gaussian_square", "drag", "constant"], "allow_q_object": true, "multi_meas_enabled": true, "quantum_volume": 8, "qubit_channel_mapping": [["u0", "m0", "d0", "u1"], ["u4", "u3", "u0", "u2", "m1", "u1", "d1", "u5"], ["d2", "u4", "u2", "m2"], ["u3", "u7", "m3", "d3", "u6", "u5"], ["d4", "u6", "m4", "u7"]], "uchannels_enabled": true, "url": "None", "allow_object_storage": true, "n_uchannels": 8, "u_channel_lo": [[{"q": 1, "scale": [1.0, 0.0]}], [{"q": 0, "scale": [1.0, 0.0]}], [{"q": 2, "scale": [1.0, 0.0]}], [{"q": 3, "scale": [1.0, 0.0]}], [{"q": 1, "scale": [1.0, 0.0]}], [{"q": 1, "scale": [1.0, 0.0]}], [{"q": 4, "scale": [1.0, 0.0]}], [{"q": 3, "scale": [1.0, 0.0]}]], "meas_levels": [1, 2], "qubit_lo_range": [[4.52968554992376, 5.52968554992376], [4.628321697435369, 5.628321697435369], [4.74749131011471, 5.74749131011471], [4.803339662601714, 5.803339662601714], [4.591790567452984, 5.5917905674529855]], "meas_lo_range": [[6.925143125000002, 7.925143125000002], [6.721646720000002, 7.721646720000002], [6.971842939, 7.971842939], [6.8653172320000015, 7.8653172320000015], [6.919067567000002, 7.919067567000002]], "meas_kernels": ["hw_boxcar"], "discriminators": ["hw_centroid", "linear_discriminator", "quadratic_discriminator"], "rep_times": [1000.0], "meas_map": [[0, 1, 2, 3, 4]], "acquisition_latency": [], "conditional_latency": [], "hamiltonian": {"description": "Qubits are modeled as Duffing oscillators. In this case, the system includes higher energy states, i.e. not just |0> and |1>. The Pauli operators are generalized via the following set of transformations:\n\n$(\\mathbb{I}-\\sigma_{i}^z)/2 \\rightarrow O_i \\equiv b^\\dagger_{i} b_{i}$,\n\n$\\sigma_{+} \\rightarrow b^\\dagger$,\n\n$\\sigma_{-} \\rightarrow b$,\n\n$\\sigma_{i}^X \\rightarrow b^\\dagger_{i} + b_{i}$.\n\nQubits are coupled through resonator buses. The provided Hamiltonian has been projected into the zero excitation subspace of the resonator buses leading to an effective qubit-qubit flip-flop interaction. The qubit resonance frequencies in the Hamiltonian are the cavity dressed frequencies and not exactly what is returned by the backend defaults, which also includes the dressing due to the qubit-qubit interactions.\n\nQuantities are returned in angular frequencies, with units 2*pi*GHz.\n\nWARNING: Currently not all system Hamiltonian information is available to the public, missing values have been replaced with 0.\n", "h_latex": "\\begin{align} \\mathcal{H}/\\hbar = & \\sum_{i=0}^{4}\\left(\\frac{\\omega_{q,i}}{2}(\\mathbb{I}-\\sigma_i^{z})+\\frac{\\Delta_{i}}{2}(O_i^2-O_i)+\\Omega_{d,i}D_i(t)\\sigma_i^{X}\\right) \\\\ & + J_{0,1}(\\sigma_{0}^{+}\\sigma_{1}^{-}+\\sigma_{0}^{-}\\sigma_{1}^{+}) + J_{1,3}(\\sigma_{1}^{+}\\sigma_{3}^{-}+\\sigma_{1}^{-}\\sigma_{3}^{+}) + J_{3,4}(\\sigma_{3}^{+}\\sigma_{4}^{-}+\\sigma_{3}^{-}\\sigma_{4}^{+}) + J_{1,2}(\\sigma_{1}^{+}\\sigma_{2}^{-}+\\sigma_{1}^{-}\\sigma_{2}^{+}) \\\\ & + \\Omega_{d,0}(U_{0}^{(0,1)}(t))\\sigma_{0}^{X} + \\Omega_{d,1}(U_{1}^{(1,0)}(t)+U_{3}^{(1,3)}(t)+U_{2}^{(1,2)}(t))\\sigma_{1}^{X} \\\\ & + \\Omega_{d,2}(U_{4}^{(2,1)}(t))\\sigma_{2}^{X} + \\Omega_{d,3}(U_{5}^{(3,1)}(t)+U_{6}^{(3,4)}(t))\\sigma_{3}^{X} \\\\ & + \\Omega_{d,4}(U_{7}^{(4,3)}(t))\\sigma_{4}^{X} \\\\ \\end{align}", "h_str": ["_SUM[i,0,4,wq{i}/2*(I{i}-Z{i})]", "_SUM[i,0,4,delta{i}/2*O{i}*O{i}]", "_SUM[i,0,4,-delta{i}/2*O{i}]", "_SUM[i,0,4,omegad{i}*X{i}||D{i}]", "jq0q1*Sp0*Sm1", "jq0q1*Sm0*Sp1", "jq1q3*Sp1*Sm3", "jq1q3*Sm1*Sp3", "jq3q4*Sp3*Sm4", "jq3q4*Sm3*Sp4", "jq1q2*Sp1*Sm2", "jq1q2*Sm1*Sp2", "omegad1*X0||U0", "omegad0*X1||U1", "omegad3*X1||U3", "omegad2*X1||U2", "omegad1*X2||U4", "omegad1*X3||U5", "omegad4*X3||U6", "omegad3*X4||U7"], "osc": {}, "qub": {"0": 3, "1": 3, "2": 3, "3": 3, "4": 3}, "vars": {"delta0": -2.109526390232452, "delta1": -2.0002465324219205, "delta2": -2.0960936199138844, "delta3": -2.0812544393432897, "delta4": -2.1015348325639516, "jq0q1": 0.011088625669671271, "jq1q2": 0.011792549393436344, "jq1q3": 0.011913891984976948, "jq3q4": 0.01165632975311803, "omegad0": 1.5262727915514445, "omegad1": 1.2641690419030664, "omegad2": 1.3397127967877365, "omegad3": 1.509152095855826, "omegad4": 1.497387831726462, "wq0": 31.602446347014453, "wq1": 32.222195539816184, "wq2": 32.9709602992653, "wq3": 33.321865847041835, "wq4": 31.992663680656207}}, "channels": {"acquire0": {"operates": {"qubits": [0]}, "purpose": "acquire", "type": "acquire"}, "acquire1": {"operates": {"qubits": [1]}, "purpose": "acquire", "type": "acquire"}, "acquire2": {"operates": {"qubits": [2]}, "purpose": "acquire", "type": "acquire"}, "acquire3": {"operates": {"qubits": [3]}, "purpose": "acquire", "type": "acquire"}, "acquire4": {"operates": {"qubits": [4]}, "purpose": "acquire", "type": "acquire"}, "d0": {"operates": {"qubits": [0]}, "purpose": "drive", "type": "drive"}, "d1": {"operates": {"qubits": [1]}, "purpose": "drive", "type": "drive"}, "d2": {"operates": {"qubits": [2]}, "purpose": "drive", "type": "drive"}, "d3": {"operates": {"qubits": [3]}, "purpose": "drive", "type": "drive"}, "d4": {"operates": {"qubits": [4]}, "purpose": "drive", "type": "drive"}, "m0": {"operates": {"qubits": [0]}, "purpose": "measure", "type": "measure"}, "m1": {"operates": {"qubits": [1]}, "purpose": "measure", "type": "measure"}, "m2": {"operates": {"qubits": [2]}, "purpose": "measure", "type": "measure"}, "m3": {"operates": {"qubits": [3]}, "purpose": "measure", "type": "measure"}, "m4": {"operates": {"qubits": [4]}, "purpose": "measure", "type": "measure"}, "u0": {"operates": {"qubits": [0, 1]}, "purpose": "cross-resonance", "type": "control"}, "u1": {"operates": {"qubits": [1, 0]}, "purpose": "cross-resonance", "type": "control"}, "u2": {"operates": {"qubits": [1, 2]}, "purpose": "cross-resonance", "type": "control"}, "u3": {"operates": {"qubits": [1, 3]}, "purpose": "cross-resonance", "type": "control"}, "u4": {"operates": {"qubits": [2, 1]}, "purpose": "cross-resonance", "type": "control"}, "u5": {"operates": {"qubits": [3, 1]}, "purpose": "cross-resonance", "type": "control"}, "u6": {"operates": {"qubits": [3, 4]}, "purpose": "cross-resonance", "type": "control"}, "u7": {"operates": {"qubits": [4, 3]}, "purpose": "cross-resonance", "type": "control"}}}
1+
{"backend_name": "fake_fractional", "backend_version": "1.0.5", "n_qubits": 5, "basis_gates": ["id", "rz", "sx", "x", "cx", "reset", "rx", "rzx", "rzz"], "gates": [{"name": "id", "parameters": [], "qasm_def": "gate id q { U(0, 0, 0) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "rz", "parameters": ["theta"], "qasm_def": "gate rz(theta) q { U(0, 0, theta) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "sx", "parameters": [], "qasm_def": "gate sx q { U(pi/2, 3*pi/2, pi/2) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "x", "parameters": [], "qasm_def": "gate x q { U(pi, 0, pi) q; }", "coupling_map": [[0], [1], [2], [3], [4]]}, {"name": "cx", "parameters": [], "qasm_def": "gate cx q0, q1 { CX q0, q1; }", "coupling_map": [[0, 1], [1, 0], [1, 2], [1, 3], [2, 1], [3, 1], [3, 4], [4, 3]]}, {"name": "reset", "parameters": null, "qasm_def": null}], "local": false, "simulator": false, "conditional": false, "open_pulse": true, "memory": true, "max_shots": 8192, "coupling_map": [[0, 1], [1, 0], [1, 2], [1, 3], [2, 1], [3, 1], [3, 4], [4, 3]], "dynamic_reprate_enabled": true, "supported_instructions": ["measure", "u3", "setf", "x", "delay", "id", "acquire", "sx", "u2", "u1", "cx", "shiftf", "play", "rz", "reset", "rx", "rzx", "if_else", "while_loop"], "rep_delay_range": [0.0, 500.0], "default_rep_delay": 250.0, "max_experiments": 900, "sample_name": "family: Falcon, revision: 4, segment: T", "n_registers": 1, "credits_required": true, "online_date": "2021-01-08T05:00:00+00:00", "description": "5 qubit device fractional tester", "dt": 0.2222222222222222, "dtm": 0.2222222222222222, "processor_type": {"family": "Falcon", "revision": 4, "segment": "T"}, "parametric_pulses": ["gaussian", "gaussian_square", "drag", "constant"], "allow_q_object": true, "multi_meas_enabled": true, "quantum_volume": 8, "qubit_channel_mapping": [["u0", "m0", "d0", "u1"], ["u4", "u3", "u0", "u2", "m1", "u1", "d1", "u5"], ["d2", "u4", "u2", "m2"], ["u3", "u7", "m3", "d3", "u6", "u5"], ["d4", "u6", "m4", "u7"]], "uchannels_enabled": true, "url": "None", "allow_object_storage": true, "n_uchannels": 8, "u_channel_lo": [[{"q": 1, "scale": [1.0, 0.0]}], [{"q": 0, "scale": [1.0, 0.0]}], [{"q": 2, "scale": [1.0, 0.0]}], [{"q": 3, "scale": [1.0, 0.0]}], [{"q": 1, "scale": [1.0, 0.0]}], [{"q": 1, "scale": [1.0, 0.0]}], [{"q": 4, "scale": [1.0, 0.0]}], [{"q": 3, "scale": [1.0, 0.0]}]], "meas_levels": [1, 2], "qubit_lo_range": [[4.52968554992376, 5.52968554992376], [4.628321697435369, 5.628321697435369], [4.74749131011471, 5.74749131011471], [4.803339662601714, 5.803339662601714], [4.591790567452984, 5.5917905674529855]], "meas_lo_range": [[6.925143125000002, 7.925143125000002], [6.721646720000002, 7.721646720000002], [6.971842939, 7.971842939], [6.8653172320000015, 7.8653172320000015], [6.919067567000002, 7.919067567000002]], "meas_kernels": ["hw_boxcar"], "discriminators": ["hw_centroid", "linear_discriminator", "quadratic_discriminator"], "rep_times": [1000.0], "meas_map": [[0, 1, 2, 3, 4]], "acquisition_latency": [], "conditional_latency": [], "hamiltonian": {"description": "Qubits are modeled as Duffing oscillators. In this case, the system includes higher energy states, i.e. not just |0> and |1>. The Pauli operators are generalized via the following set of transformations:\n\n$(\\mathbb{I}-\\sigma_{i}^z)/2 \\rightarrow O_i \\equiv b^\\dagger_{i} b_{i}$,\n\n$\\sigma_{+} \\rightarrow b^\\dagger$,\n\n$\\sigma_{-} \\rightarrow b$,\n\n$\\sigma_{i}^X \\rightarrow b^\\dagger_{i} + b_{i}$.\n\nQubits are coupled through resonator buses. The provided Hamiltonian has been projected into the zero excitation subspace of the resonator buses leading to an effective qubit-qubit flip-flop interaction. The qubit resonance frequencies in the Hamiltonian are the cavity dressed frequencies and not exactly what is returned by the backend defaults, which also includes the dressing due to the qubit-qubit interactions.\n\nQuantities are returned in angular frequencies, with units 2*pi*GHz.\n\nWARNING: Currently not all system Hamiltonian information is available to the public, missing values have been replaced with 0.\n", "h_latex": "\\begin{align} \\mathcal{H}/\\hbar = & \\sum_{i=0}^{4}\\left(\\frac{\\omega_{q,i}}{2}(\\mathbb{I}-\\sigma_i^{z})+\\frac{\\Delta_{i}}{2}(O_i^2-O_i)+\\Omega_{d,i}D_i(t)\\sigma_i^{X}\\right) \\\\ & + J_{0,1}(\\sigma_{0}^{+}\\sigma_{1}^{-}+\\sigma_{0}^{-}\\sigma_{1}^{+}) + J_{1,3}(\\sigma_{1}^{+}\\sigma_{3}^{-}+\\sigma_{1}^{-}\\sigma_{3}^{+}) + J_{3,4}(\\sigma_{3}^{+}\\sigma_{4}^{-}+\\sigma_{3}^{-}\\sigma_{4}^{+}) + J_{1,2}(\\sigma_{1}^{+}\\sigma_{2}^{-}+\\sigma_{1}^{-}\\sigma_{2}^{+}) \\\\ & + \\Omega_{d,0}(U_{0}^{(0,1)}(t))\\sigma_{0}^{X} + \\Omega_{d,1}(U_{1}^{(1,0)}(t)+U_{3}^{(1,3)}(t)+U_{2}^{(1,2)}(t))\\sigma_{1}^{X} \\\\ & + \\Omega_{d,2}(U_{4}^{(2,1)}(t))\\sigma_{2}^{X} + \\Omega_{d,3}(U_{5}^{(3,1)}(t)+U_{6}^{(3,4)}(t))\\sigma_{3}^{X} \\\\ & + \\Omega_{d,4}(U_{7}^{(4,3)}(t))\\sigma_{4}^{X} \\\\ \\end{align}", "h_str": ["_SUM[i,0,4,wq{i}/2*(I{i}-Z{i})]", "_SUM[i,0,4,delta{i}/2*O{i}*O{i}]", "_SUM[i,0,4,-delta{i}/2*O{i}]", "_SUM[i,0,4,omegad{i}*X{i}||D{i}]", "jq0q1*Sp0*Sm1", "jq0q1*Sm0*Sp1", "jq1q3*Sp1*Sm3", "jq1q3*Sm1*Sp3", "jq3q4*Sp3*Sm4", "jq3q4*Sm3*Sp4", "jq1q2*Sp1*Sm2", "jq1q2*Sm1*Sp2", "omegad1*X0||U0", "omegad0*X1||U1", "omegad3*X1||U3", "omegad2*X1||U2", "omegad1*X2||U4", "omegad1*X3||U5", "omegad4*X3||U6", "omegad3*X4||U7"], "osc": {}, "qub": {"0": 3, "1": 3, "2": 3, "3": 3, "4": 3}, "vars": {"delta0": -2.109526390232452, "delta1": -2.0002465324219205, "delta2": -2.0960936199138844, "delta3": -2.0812544393432897, "delta4": -2.1015348325639516, "jq0q1": 0.011088625669671271, "jq1q2": 0.011792549393436344, "jq1q3": 0.011913891984976948, "jq3q4": 0.01165632975311803, "omegad0": 1.5262727915514445, "omegad1": 1.2641690419030664, "omegad2": 1.3397127967877365, "omegad3": 1.509152095855826, "omegad4": 1.497387831726462, "wq0": 31.602446347014453, "wq1": 32.222195539816184, "wq2": 32.9709602992653, "wq3": 33.321865847041835, "wq4": 31.992663680656207}}, "channels": {"acquire0": {"operates": {"qubits": [0]}, "purpose": "acquire", "type": "acquire"}, "acquire1": {"operates": {"qubits": [1]}, "purpose": "acquire", "type": "acquire"}, "acquire2": {"operates": {"qubits": [2]}, "purpose": "acquire", "type": "acquire"}, "acquire3": {"operates": {"qubits": [3]}, "purpose": "acquire", "type": "acquire"}, "acquire4": {"operates": {"qubits": [4]}, "purpose": "acquire", "type": "acquire"}, "d0": {"operates": {"qubits": [0]}, "purpose": "drive", "type": "drive"}, "d1": {"operates": {"qubits": [1]}, "purpose": "drive", "type": "drive"}, "d2": {"operates": {"qubits": [2]}, "purpose": "drive", "type": "drive"}, "d3": {"operates": {"qubits": [3]}, "purpose": "drive", "type": "drive"}, "d4": {"operates": {"qubits": [4]}, "purpose": "drive", "type": "drive"}, "m0": {"operates": {"qubits": [0]}, "purpose": "measure", "type": "measure"}, "m1": {"operates": {"qubits": [1]}, "purpose": "measure", "type": "measure"}, "m2": {"operates": {"qubits": [2]}, "purpose": "measure", "type": "measure"}, "m3": {"operates": {"qubits": [3]}, "purpose": "measure", "type": "measure"}, "m4": {"operates": {"qubits": [4]}, "purpose": "measure", "type": "measure"}, "u0": {"operates": {"qubits": [0, 1]}, "purpose": "cross-resonance", "type": "control"}, "u1": {"operates": {"qubits": [1, 0]}, "purpose": "cross-resonance", "type": "control"}, "u2": {"operates": {"qubits": [1, 2]}, "purpose": "cross-resonance", "type": "control"}, "u3": {"operates": {"qubits": [1, 3]}, "purpose": "cross-resonance", "type": "control"}, "u4": {"operates": {"qubits": [2, 1]}, "purpose": "cross-resonance", "type": "control"}, "u5": {"operates": {"qubits": [3, 1]}, "purpose": "cross-resonance", "type": "control"}, "u6": {"operates": {"qubits": [3, 4]}, "purpose": "cross-resonance", "type": "control"}, "u7": {"operates": {"qubits": [4, 3]}, "purpose": "cross-resonance", "type": "control"}}}

qiskit_ibm_runtime/utils/utils.py

+11
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from threading import Condition
2323
from typing import List, Optional, Any, Dict, Union, Tuple
2424
from urllib.parse import urlparse
25+
import numpy as np
2526

2627
import requests
2728
from ibm_cloud_sdk_core.authenticators import ( # pylint: disable=import-error
@@ -67,6 +68,16 @@ def _is_isa_circuit_helper(circuit: QuantumCircuit, target: Target, qubit_map: D
6768
f"The instruction {name} on qubits {qargs} is not supported by the target system."
6869
)
6970

71+
# rzz gate is calibrated only for the range [0, pi/2].
72+
# We allow an angle value of a bit more than pi/2, to compensate floating point rounding
73+
# errors (beyond pi/2 does not trigger an error down the stack, only may become less
74+
# accurate).
75+
if name == "rzz" and (
76+
instruction.params[0] < 0.0 or instruction.params[0] > 1.001 * np.pi / 2
77+
):
78+
return f"The instruction {name} on qubits {qargs} is supported only for angles in the \
79+
range [0, pi/2], but an angle of {instruction.params[0]} has been provided."
80+
7081
if isinstance(operation, ControlFlowOp):
7182
for sub_circ in operation.blocks:
7283
sub_string = _is_isa_circuit_helper(sub_circ, target, qubit_map)

test/unit/test_sampler.py

+14
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,17 @@ def test_isa_inside_condition_block(self, backend):
260260
else:
261261
with self.assertRaises(IBMInputValueError):
262262
SamplerV2(backend).run(pubs=[(circ)])
263+
264+
@data(-1, 1, 2)
265+
def test_rzz_angle_validation(self, angle):
266+
"""Test exception when rzz gate is used with an angle outside the range [0, pi/2]"""
267+
backend = FakeFractionalBackend()
268+
269+
circ = QuantumCircuit(2)
270+
circ.rzz(angle, 0, 1)
271+
272+
if angle == 1:
273+
SamplerV2(backend).run(pubs=[(circ)])
274+
else:
275+
with self.assertRaises(IBMInputValueError):
276+
SamplerV2(backend).run(pubs=[(circ)])

0 commit comments

Comments
 (0)