📓 Qdislib with IBM Quantum Cloud¶
qpu=True, Qdislib interfaces with IBM Quantum backends to execute quantum jobs on real quantum devices.🔧 1. Environment Setup with IBM Quantum¶
Before using IBM Quantum resources, you need an IBM Quantum account. You can create one and obtain your API token from the official IBM Quantum platform:
🔗 IBM Quantum Account Documentation
Once logged in, generate your API Token and retrieve:
token— Your API token,"<your-token>"instance— Optional: The instance provider stringchannel— Usually"ibm_quantum"quantum_chip— Optional: the backend name like"ibm_marrakesh"or"ibm_fez"
🧠 2. Set Environment Variables in Python¶
Set the required environment variables directly in the notebook:
[1]:
import os
# Replace with your actual IBM Quantum credentials
os.environ["IBM_QUANTUM_TOKEN"] = "<your_token>"
os.environ["IBM_QUANTUM_INSTANCE"] = "<your_instance>" #optional
os.environ["IBM_QUANTUM_CHANNEL"] = "ibm_cloud"
os.environ["IBM_QUANTUM_MAX_TIME"] = "60" #optional
os.environ["IBM_QUANTUM_QPU_NAME"] = "ibm_marrakesh" # optional
Note:
"IBM_QUANTUM_MAX_TIME"represents the maxium time in seconds the batch session will remain openIf no specific IBM_QUANTUM_QPU_NAME is given, Qdislib will automatically select the least busy backend from the available IBM Quantum devices.
backend = service.least_busy(operational=True, simulator=False)
⚙️ 3. Using Qdislib with IBM Quantum¶
Now you’re ready to use Qdislib. Here’s an example of how to run a gate-cutting reconstruction on IBM Quantum hardware.
[ ]:
import Qdislib as qd
from qiskit import QuantumCircuit
# Example circuit
circuit = QuantumCircuit(10)
circuit.cz(0,1)
circuit.cz(1,2)
circuit.cz(2,3)
circuit.cz(3,4)
circuit.cz(4,5)
circuit.cz(5,6)
circuit.cz(6,7)
circuit.cz(7,8)
circuit.cz(8,9)
circuit.measure_all()
# Define cut (as per Qdislib — adjust as needed)
cut = ["CZ_5"]
# QPU settings dictionary — only "IBM_Quantum" for, max number of qubits the chip has is 156
qpu_dict = {
"IBM_Quantum": 156 # This number refers to the maximum number of qubits the QPU has
}
# Run gate cutting with QPU enabled
reconstruction = qd.gate_cutting(
circuit,
cut,
qpu=True,
qpu_dict=qpu_dict
)
print("Reconstuction ", reconstruction)
ibm_sherbrooke
['for_loop', 'rz', 'ecr', 'switch_case', 'delay', 'x', 'sx', 'reset', 'measure', 'if_else', 'id']
<qiskit_ibm_runtime.batch.Batch object at 0x76e596794eb0>
job id: d0q39bo15afs73clt09g
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:16:11', stop='2025-05-26 10:16:21', size=4096>)])}, 'version': 2})
{'00001': 1246, '10001': 568, '11001': 160, '10101': 309, '01001': 145, '00111': 161, '00101': 732, '00011': 251, '01101': 92, '11111': 24, '10011': 130, '01110': 1, '11101': 94, '10111': 62, '01111': 21, '11011': 30, '01011': 33, '00000': 12, '10100': 2, '10000': 4, '11010': 1, '01000': 2, '00110': 1, '00100': 8, '10010': 1, '11000': 1, '01100': 2, '00010': 3}
job id: d0q3uto15afs73cltklg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:16:34', stop='2025-05-26 10:16:37', size=4096>)])}, 'version': 2})
{'10101': 280, '11001': 163, '01001': 146, '00001': 1285, '10001': 479, '10111': 62, '10011': 105, '11111': 26, '00101': 730, '11101': 98, '01101': 97, '00111': 168, '11011': 34, '10000': 12, '00011': 327, '10100': 5, '01011': 32, '10010': 1, '00100': 4, '01111': 25, '00000': 13, '00010': 4}
job id: d0q3v1ghmjts73cqu0l0
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:16:49', stop='2025-05-26 10:16:52', size=4096>)])}, 'version': 2})
{'10111': 60, '10101': 302, '10011': 126, '10001': 567, '01011': 37, '00001': 1259, '00111': 161, '00101': 733, '11001': 164, '11101': 97, '00011': 260, '01101': 74, '11111': 14, '00100': 9, '01001': 160, '11011': 35, '10000': 5, '00010': 4, '10100': 2, '10110': 1, '01111': 14, '11000': 1, '00000': 10, '11010': 1}
job id: d0q3v5ghmjts73cqu0og
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:17:04', stop='2025-05-26 10:17:08', size=4096>)])}, 'version': 2})
{'00001': 1332, '00111': 166, '01001': 165, '00011': 329, '11011': 43, '10001': 413, '10101': 285, '00101': 761, '10000': 8, '10111': 58, '10011': 92, '11101': 101, '01101': 93, '11001': 134, '01111': 20, '01011': 43, '00000': 10, '01100': 1, '00100': 9, '11111': 20, '01000': 2, '11110': 1, '11000': 1, '00010': 2, '10100': 5, '00110': 1, '10010': 1}
job id: d0q3v98hmjts73cqu0sg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:17:20', stop='2025-05-26 10:17:23', size=4096>)])}, 'version': 2})
{'10101': 312, '10001': 568, '00001': 1168, '10011': 139, '11101': 96, '00101': 702, '10100': 8, '11001': 146, '01001': 202, '10111': 70, '00111': 144, '01011': 43, '01101': 97, '00011': 266, '11011': 35, '00100': 10, '01111': 25, '11111': 22, '00010': 3, '00000': 12, '10000': 13, '01100': 3, '11010': 1, '11000': 2, '00110': 3, '01000': 1, '11100': 2, '10010': 2, '01010': 1}
job id: d0q3vdghmjts73cqu110
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:17:37', stop='2025-05-26 10:17:40', size=4096>)])}, 'version': 2})
{'11001': 147, '10101': 328, '11111': 31, '10001': 515, '00111': 160, '00101': 727, '00011': 283, '01101': 89, '11101': 87, '00001': 1241, '11011': 35, '01111': 23, '10011': 124, '10111': 63, '01011': 47, '01001': 160, '10100': 4, '11110': 1, '01100': 2, '00010': 1, '01000': 2, '00000': 12, '10000': 4, '00110': 1, '10110': 1, '00100': 7, '11000': 1}
job id: d0q3vhf75hms73dv5srg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:17:52', stop='2025-05-26 10:17:56', size=4096>)])}, 'version': 2})
{'10001': 614, '01111': 18, '00101': 685, '01001': 175, '00001': 1138, '11101': 113, '11001': 137, '01011': 39, '10101': 340, '00111': 149, '00011': 247, '01101': 113, '11011': 26, '10011': 149, '10111': 74, '10100': 9, '11111': 22, '00100': 7, '00000': 16, '00010': 8, '01110': 2, '10110': 2, '01000': 2, '10000': 4, '11000': 1, '11100': 1, '11110': 1, '00110': 3, '11010': 1}
job id: d0q3vmf75hms73dv5t0g
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:18:12', stop='2025-05-26 10:18:16', size=4096>)])}, 'version': 2})
{'00011': 280, '00101': 752, '00001': 1346, '01101': 95, '10001': 473, '01001': 145, '00111': 169, '10101': 282, '11001': 144, '11011': 34, '01111': 29, '10111': 58, '11101': 79, '11111': 15, '11110': 1, '11100': 1, '10011': 106, '10100': 2, '01011': 43, '01000': 1, '00010': 5, '10000': 9, '11010': 2, '00100': 7, '01110': 1, '11000': 3, '01100': 2, '00000': 10, '01010': 1, '00110': 1}
job id: d0q3vqiq9bic73ba1skg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:18:29', stop='2025-05-26 10:18:32', size=4096>)])}, 'version': 2})
{'00001': 1172, '11101': 82, '10001': 662, '10101': 363, '00111': 142, '00101': 674, '10111': 78, '00011': 245, '10011': 138, '11001': 165, '10100': 5, '01111': 26, '10000': 7, '11011': 31, '01101': 76, '00000': 14, '01001': 138, '01011': 30, '10110': 2, '00010': 4, '00100': 5, '11111': 25, '01000': 3, '10010': 2, '11000': 1, '11110': 2, '01100': 2, '00110': 2}
job id: d0q3vughmjts73cqu1hg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:18:44', stop='2025-05-26 10:18:48', size=4096>)])}, 'version': 2})
{'00001': 1349, '00101': 761, '10001': 446, '01001': 184, '10101': 234, '00111': 171, '11001': 171, '00011': 319, '11101': 110, '01101': 95, '11111': 22, '10011': 103, '10010': 2, '11011': 32, '10111': 40, '01011': 25, '10000': 4, '01111': 13, '11100': 1, '00100': 2, '00000': 6, '01100': 1, '00010': 2, '01010': 1, '01000': 1, '10100': 1}
job id: d0q402ghmjts73cqu1n0
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:19:01', stop='2025-05-26 10:19:04', size=4096>)])}, 'version': 2})
{'10001': 538, '00001': 1280, '10011': 115, '10101': 297, '00011': 300, '01001': 136, '10111': 86, '11101': 104, '01101': 90, '00101': 687, '00111': 146, '11001': 169, '11111': 30, '01111': 16, '01011': 35, '10000': 7, '11011': 25, '00000': 8, '00100': 6, '00010': 5, '00110': 4, '11000': 2, '10100': 4, '01010': 1, '11100': 1, '11110': 1, '01000': 2, '01100': 1}
job id: d0q406aq9bic73ba1svg
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=4096, num_bits=5>), meas=BitArray(<shape=(), num_shots=4096, num_bits=5>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-05-26 10:19:16', stop='2025-05-26 10:19:20', size=4096>)])}, 'version': 2})
{'01001': 160, '00111': 174, '00001': 1349, '11001': 176, '00101': 730, '01101': 94, '10001': 517, '10011': 107, '11111': 17, '00011': 274, '10101': 261, '00010': 1, '10111': 62, '11101': 70, '10110': 2, '10100': 2, '11011': 31, '01011': 26, '01111': 20, '00100': 2, '00000': 10, '10010': 2, '10000': 5, '11110': 1, '11100': 1, '11010': 1, '11000': 1}
Reconstuction 0.02848052978515625
⏹️ 4. Summary¶
By following these steps:
Set up an IBM Quantum account and API token
Configure your environment variables
Run your Qdislib gate-cutting circuits using real IBM Quantum hardware
You can now execute large quantum workloads on IBM’s cloud infrastructure via Qdislib’s automatic circuit cutting and reconstruction pipeline.
[10]:
from PIL import Image
from IPython.display import display
img = Image.open('../docs/ibm_quantum_logo.png')
display(img)
[ ]: