API Reference
Core Modules
QuantumCircuit
- class quantum_debugger.QuantumCircuit(num_qubits: int, num_classical: int = 0, noise_model: Any | None = None, noise_simulation_method: str = 'density_matrix', backend: str = 'auto')[source]
Bases:
objectQuantum circuit with gate operations
- count_gates(gate_name: str = None) int[source]
Count gates of specific type
- Parameters:
gate_name – Name of gate to count (None for all gates)
- draw(output: str = 'text') str[source]
Draw the circuit
- Parameters:
output – Output format (‘text’ for ASCII art)
- Returns:
String representation of circuit
- get_statevector(initial_state: QuantumState | None = None, use_gpu: bool = False, precision: str = 'double') QuantumState[source]
Get final state vector without measurements.
- Parameters:
initial_state – Optional initial state
use_gpu – Run the whole circuit on the GPU (CuPy). The state lives on the GPU for every gate and is transferred back to the CPU once at the end. Falls back to CPU if CuPy is unavailable.
precision – ‘double’ (complex128, default, exact) or ‘single’ (complex64 – much faster on consumer GPUs, at reduced precision).
- Returns:
Final quantum state (always CPU/NumPy-backed)
- measure(qubit: int, classical_bit: int = None)[source]
Measure a qubit
- Parameters:
qubit – Qubit index to measure
classical_bit – Classical bit to store result (defaults to same as qubit)
- measure_all()[source]
Measure all qubits
- run(shots: int = 1, initial_state: QuantumState | None = None, use_gpu: bool = False, precision: str = 'double') dict[source]
Execute the circuit.
The statevector is computed once and all shots are sampled from the resulting distribution. This is equivalent, for independent projective Z-measurements, to collapsing the state per shot, but costs O(gates + shots) instead of the previous O(shots x gates) (which re-simulated the whole circuit for every shot).
- Parameters:
shots – Number of measurement samples
initial_state – Optional initial state (defaults to
|0...0>)use_gpu – Simulate the circuit on the GPU (see get_statevector)
precision – ‘double’ (complex128) or ‘single’ (complex64) for the GPU path
- Returns:
Dictionary with measurement results and statistics
QuantumDebugger
- class quantum_debugger.QuantumDebugger(circuit: QuantumCircuit, initial_state: QuantumState | None = None)[source]
Bases:
objectInteractive debugger for quantum circuits
- clear_breakpoints()[source]
Remove all breakpoints
- compare_with_expected(expected_state: QuantumState) Dict[source]
Compare current state with expected state
- Parameters:
expected_state – Expected quantum state
- Returns:
Comparison metrics
- continue_execution()[source]
Continue execution until end (alias for run_to_end)
- get_current_state()[source]
Get current quantum state (alias for get_state)
- get_execution_trace() List[Dict][source]
Get full execution trace
- Returns:
List of execution states with information
- get_state() QuantumState[source]
Get current quantum state
- inspect_state() Dict[source]
Get detailed information about current state
- Returns:
Dictionary with state information
- print_status()[source]
Print current debugging status
- reset()[source]
Reset debugger to initial state
- run_to_end()[source]
Execute all remaining gates
- run_until_breakpoint()[source]
Execute until a breakpoint is hit or circuit ends
- set_breakpoint(gate: int | None = None, condition=None, description: str = '') Breakpoint[source]
Set a breakpoint
- Parameters:
gate – Gate index to break at
condition – Conditional function
description – Breakpoint description
- Returns:
Created breakpoint
- step(steps: int = 1) bool[source]
Execute one or more gates
- Parameters:
steps – Number of gates to execute
- Returns:
True if stepped successfully, False if at end
- step_back(steps: int = 1) bool[source]
Step backwards in execution history
- Parameters:
steps – Number of steps to go back
- Returns:
True if stepped back successfully
- visualize()[source]
Print visualization of current state
QuantumState
- class quantum_debugger.QuantumState(num_qubits: int, state_vector: ndarray | None = None, backend='auto')[source]
Bases:
objectRepresents a quantum state vector
- apply_gate(gate_matrix: ndarray, target_qubits: List[int])[source]
Apply a quantum gate to specific qubits.
Uses tensor contraction, applying the k-qubit gate directly to the relevant axes of the state tensor. This is O(2**n) per gate instead of the O(4**n) cost of materializing the full 2**n x 2**n operator, so it is dramatically faster and more memory efficient for multi-qubit circuits.
- Parameters:
gate_matrix – Unitary matrix of the gate (2**k x 2**k for k qubits)
target_qubits – List of qubit indices to apply gate to. Gate qubit j acts on
target_qubits[j](matches the previous convention).
- bloch_vector(qubit: int = 0) Tuple[float, float, float][source]
Get Bloch sphere coordinates for a single qubit
- Parameters:
qubit – Index of qubit (for multi-qubit systems, traces out other qubits)
- Returns:
(x, y, z) coordinates on Bloch sphere
- copy()[source]
Create a deep copy of this state
- fidelity(other: QuantumState) float[source]
Calculate fidelity with another quantum state
- Parameters:
other – Another quantum state
- Returns:
Fidelity value between 0 and 1
- get_measurement_probability(qubit: int, outcome: int) float[source]
Get probability of measuring a specific outcome for a qubit
- is_entangled() bool[source]
Check if state is entangled (simple check for 2-qubit systems)
For 2 qubits: state is entangled if it cannot be written as tensor product
Integrations
QiskitAdapter
- class quantum_debugger.integrations.QiskitAdapter[source]
Bases:
objectAdapter for converting between Qiskit and QuantumDebugger circuits
- GATE_MAP = {'ccx': 'toffoli', 'cp': 'cp', 'cx': 'cnot', 'cz': 'cz', 'h': 'h', 'p': 'phase', 'rx': 'rx', 'ry': 'ry', 'rz': 'rz', 's': 's', 'swap': 'swap', 't': 't', 'x': 'x', 'y': 'y', 'z': 'z'}
- static check_qiskit_available()[source]
Check if Qiskit is installed
- classmethod compare_circuits(qiskit_circuit: None, qd_circuit: QuantumCircuit) dict[source]
Compare a Qiskit circuit with a QuantumDebugger circuit
- Returns:
Dictionary with comparison results
- classmethod from_qiskit(qiskit_circuit: None) QuantumCircuit[source]
Convert a Qiskit QuantumCircuit to QuantumDebugger circuit
- Parameters:
qiskit_circuit – Qiskit QuantumCircuit to convert
- Returns:
QuantumDebugger QuantumCircuit
Example
>>> from qiskit import QuantumCircuit >>> qc_qiskit = QuantumCircuit(2) >>> qc_qiskit.h(0) >>> qc_qiskit.cx(0, 1) >>> qc_qd = QiskitAdapter.from_qiskit(qc_qiskit)
- classmethod to_qiskit(qd_circuit: QuantumCircuit) None[source]
Convert a QuantumDebugger circuit to Qiskit QuantumCircuit
- Parameters:
qd_circuit – QuantumDebugger circuit to convert
- Returns:
Qiskit QuantumCircuit
Example
>>> from quantum_debugger import QuantumCircuit >>> qc_qd = QuantumCircuit(2) >>> qc_qd.h(0) >>> qc_qd.cnot(0, 1) >>> qc_qiskit = QiskitAdapter.to_qiskit(qc_qd)
Profiling
CircuitProfiler
- class quantum_debugger.CircuitProfiler(circuit: QuantumCircuit)[source]
Bases:
objectProfiler for analyzing quantum circuit performance
- analyze() CircuitMetrics[source]
Analyze the circuit and return metrics
- Returns:
CircuitMetrics object with analysis results
- compare_with_ideal() Dict[source]
Compare circuit with theoretical ideal
- Returns:
Comparison metrics
- get_optimization_suggestions() List[str][source]
Get suggestions for circuit optimization
- Returns:
List of optimization suggestions
- print_report()[source]
Print comprehensive profiling report