📓 Qdislib with IBM Quantum Cloud

In this notebook, we will demonstrate how to use Qdislib with IBM Quantum Cloud computers.
Qdislib allows circuit partitioning and gate-cutting strategies to run larger quantum circuits than hardware natively supports.
When 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 string

  • channel — 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 open

  • If 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)

../_images/notebooks_Qdislib_IBM_QPU_8_0.png
[ ]: