Working with Engines¶
MPSTAB supports multiple computational backends (engines) for different simulation scenarios.
Once an HSMPO is defined, the engines can be customized using the hsmpo.set_engines method. By default we set Stim and Quimb respectively for stabilizers and tensor network simulations:
from mpstab import HSMPO
from qibo import Circuit, gates
circuit = Circuit(3)
circuit.add(gates.H(0))
circuit.add(gates.CNOT(0, 1))
simulator = HSMPO(ansatz=circuit)
# Here we can pass the desired engines
simulator.set_engines()
Available Engines¶
Stabilizer Engines¶
Engines that handle the Clifford (stabilizer) part of the circuit:
- Stim Engine
Speed: State-of-art Clifford simulator
Coverage: Pure Clifford circuits
Best for: High-performance stabilizer simulation
External library: Stim
from mpstab import HSMPO
from qibo import Circuit, gates
circuit = Circuit(5)
circuit.add(gates.H(0))
circuit.add(gates.CNOT(0, 1))
simulator = HSMPO(ansatz=circuit)
# By default we use Stim
- Native Stabilizer Engine
Speed: Lightweight, fast on single thread CPU
Coverage: Pure Clifford circuits only
Best for: Large Clifford circuits (thousands of qubits)
Implementation: In-house Clifford simulator
from mpstab import HSMPO
from mpstab.engines import NativeStabilizersEngine
from qibo import Circuit, gates
circuit = Circuit(5)
circuit.add(gates.H(0))
simulator = HSMPO(ansatz=circuit)
simulator.set_engines(stab_engine=NativeStabilizersEngine())
Tensor Network Engines¶
Engines that handle the non-Clifford effects via MPO:
- Quimb Engine
Speed: Fast (optimized contractions)
Memory: Efficient for large bond dimensions
Best for: Large systems with moderate bond dimensions
Features: Automatic contraction path optimization
External library: Quimb
from mpstab import HSMPO
from qibo import Circuit, gates
circuit = Circuit(5)
circuit.add(gates.H(0))
circuit.add(gates.RY(0, theta=0.5))
simulator = HSMPO(ansatz=circuit, max_bond_dimension=32)
# Uses Quimb tensor network engine by default
- Native Tensor Network Engine
Speed: Moderate
Memory: Scales with bond dimension
Best for: Small systems with fine controlled network structure
Engine Configuration¶
from mpstab import HSMPO
from mpstab.models.ansatze import HardwareEfficient
# Define an ansatz or a Qibo circuit
ansatz = HardwareEfficient(nqubits=10, nlayers=3)
# Basic HSMPO with automatic engine selection
simulator = HSMPO(
ansatz=ansatz,
max_bond_dimension=32
)
# Access engine information
simulator.set_engines() # Configure engines
print(f"Stabilizer engine: {simulator.stab_engine}")
print(f"TN engine: {simulator.tn_engine}")
Tips for Efficient Simulation¶
Use Clifford circuits when possible - they’re orders of magnitude faster
Start with low bond dimensions - increase only if accuracy is insufficient
Profile your circuits - understand what gates are expensive
Example: Adaptive Bond Dimension¶
from mpstab import HSMPO
from mpstab.models.ansatze import HardwareEfficient
from qibo import gates
# Define an ansatz or a Qibo circuit
ansatz = HardwareEfficient(nqubits=10, nlayers=3)
# Start with low bond dimension
for max_bd in [2, 4, 8, 16, 32]:
simulator = HSMPO(ansatz=ansatz, max_bond_dimension=max_bd)
result, fidelity = simulator.expectation("Z" * 10, return_fidelity=True)
print(f"χ_max={max_bd}: result={result:.4f}, fidelity={fidelity:.4f}")
# Stop if accuracy is sufficient
if fidelity > 0.99:
break