Skip to content

Commit

Permalink
Enhance the ISA check with validation of rzz angle (#1953)
Browse files Browse the repository at this point in the history
* Enhance the ISA check with validation of rzz angle

* lint

* lint
  • Loading branch information
yaelbh authored Sep 26, 2024
1 parent fd2d7c0 commit 8b38d1e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -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"}}}
{"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"}}}
11 changes: 11 additions & 0 deletions qiskit_ibm_runtime/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from threading import Condition
from typing import List, Optional, Any, Dict, Union, Tuple
from urllib.parse import urlparse
import numpy as np

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

# rzz gate is calibrated only for the range [0, pi/2].
# We allow an angle value of a bit more than pi/2, to compensate floating point rounding
# errors (beyond pi/2 does not trigger an error down the stack, only may become less
# accurate).
if name == "rzz" and (
instruction.params[0] < 0.0 or instruction.params[0] > 1.001 * np.pi / 2
):
return f"The instruction {name} on qubits {qargs} is supported only for angles in the \
range [0, pi/2], but an angle of {instruction.params[0]} has been provided."

if isinstance(operation, ControlFlowOp):
for sub_circ in operation.blocks:
sub_string = _is_isa_circuit_helper(sub_circ, target, qubit_map)
Expand Down
14 changes: 14 additions & 0 deletions test/unit/test_sampler.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,17 @@ def test_isa_inside_condition_block(self, backend):
else:
with self.assertRaises(IBMInputValueError):
SamplerV2(backend).run(pubs=[(circ)])

@data(-1, 1, 2)
def test_rzz_angle_validation(self, angle):
"""Test exception when rzz gate is used with an angle outside the range [0, pi/2]"""
backend = FakeFractionalBackend()

circ = QuantumCircuit(2)
circ.rzz(angle, 0, 1)

if angle == 1:
SamplerV2(backend).run(pubs=[(circ)])
else:
with self.assertRaises(IBMInputValueError):
SamplerV2(backend).run(pubs=[(circ)])

0 comments on commit 8b38d1e

Please sign in to comment.