User guide ========== This guide covers the basics of using Qdislib, as well as details on the main algorithms included in the library for circuit partitioning, simulation, and distributed execution. Qdislib supports *gate cutting* and *wire cutting* techniques to decompose large quantum circuits and execute them on distributed and heterogeneous environments. All computations are parallelized transparently using `PyCOMPSs `_. Example ------- Below is a basic example demonstrating how to construct a quantum circuit and apply gate cutting using Qdislib: .. code-block:: python from qibo import models, gates import Qdislib as qd # qd is Qdislib # Build a 10-qubit circuit def entire_circuit(): c = models.Circuit(10) c.add(gates.H(0)) c.add(gates.RX(1, 0.3)) c.add(gates.RY(2, 0.4)) c.add(gates.RZ(3, 0.5)) c.add(gates.CZ(0, 1)) c.add(gates.CZ(1, 2)) c.add(gates.CZ(2, 3)) c.add(gates.CZ(3, 4)) c.add(gates.CZ(4, 5)) c.add(gates.CZ(5, 6)) return c circuit = entire_circuit() # Find a gate to cut cut = qd.find_cut(circuit) # Apply gate cutting result = qd.gate_cutting(circuit, cut) print("Reconstructed expectation value:", result) It is worth noting that, although the code above looks completely sequential, all Qdislib algorithms and operations are internally parallelized using PyCOMPSs. How to run Qdislib ------------------ Qdislib can be installed and used as a regular Python library. However, because it relies on PyCOMPSs to parallelize its tasks, you must execute Qdislib applications with the `runcompss` or `enqueue_compss` command-line tools provided by PyCOMPSs: .. code-block:: bash runcompss my_Qdislib_application.py Alternatively, inside Jupyter notebooks, you can use the `ipycompss` interface: .. code-block:: python import ipycompss ipycompss.start(project="project.xml", resources="resources.xml", monitor=True, graph=True) Refer to the :doc:`quickstart guide ` and :doc:`examples ` for details on PyCOMPSs setup and configuration. Algorithms ---------- Qdislib includes two core circuit cutting strategies: - **Gate Cutting**: Cuts selected two-qubit gates to divide a circuit into smaller, independently executable subcircuits. These are then simulated and post-processed to reconstruct the expectation value of the original circuit. - **Wire Cutting**: Cuts "wires" (qubit connections) between gates to disconnect logical qubits. This requires more advanced processing, often involving state preparation and postselection logic. **Find Cut Function** To simplify the cutting process, Qdislib provides the `find_cut` utility to automatically suggest suitable locations for gate or wire cutting: .. code-block:: python cut = qd.find_cut(circuit) # Gate cand wire utting suggestion wire_cut = qd.find_cut(circuit, gate_cut=False) # Wire cutting suggestion gate_cut = qd.find_cut(circuit, wire_cut=False) # Gate cutting suggestion The returned list contains candidate gate names or gate pairs that are suitable cut points. **Subcircuit Generation Only** In addition to executing the full gate or wire cutting workflow, Qdislib also allows users to **only extract the subcircuits** without performing expectation value reconstruction. This enables: - Custom execution of subcircuits (e.g., submitting to specific quantum devices). - Saving/loading subcircuits for delayed simulation. - Manual post-processing outside Qdislib. You can generate and retrieve subcircuits using: .. code-block:: python # For gate cutting subcircuits = qd.gate_cutting_subcircuits(circuit, gate_cut) # For wire cutting subcircuits = qd.wire_cutting_subcircuits(circuit, wire_cut) The returned `subcircuits` list contains all subcomponents resulting from the cutting process. These can be simulated independently using Qiskit, Qibo, or submitted to QPUs. This modular structure gives users fine-grained control over hybrid quantum-classical workflows. Resource Allocation ------------------- Qdislib is designed to run efficiently across CPUs, GPUs, and quantum devices depending on the user’s configuration and available resources. By default, simulation is performed on CPU backends. .. _gpu-support-label: Using GPUs ---------- Qdislib includes support for GPU-accelerated execution using `cuQuantum` (with Qiskit) and `Qibojit` (with Qibo). GPU support is available for the following algorithms: - `gate_cutting` - `wire_cutting` To enable GPU execution, set the following variable before running your application: .. code-block:: bash reconstruction = qd.gate_cutting(circuit, cut, gpu=True, gpu_min_qubits=18) When enabled, Qdislib offloads eligible subcircuit simulations to GPU, while still coordinating the overall computation through CPU. This GPU usage is transparent to the user: memory transfers are handled internally and automatically