Local Simulation

Local Simulation

Divi provides two local simulation backends:

Backend Description
MaestroSimulator Default local backend powered by Maestro — supports state vector, MPS, and auto-routing based on circuit size
QiskitSimulator Qiskit Aer-based simulation — supports noise models, fake backends, and exact expectation values

MaestroSimulator (Default)

MaestroSimulator is Divi’s default local simulation backend. It uses the Maestro engine and automatically selects the best simulation strategy (state vector for small circuits, MPS for larger ones).

from divi.backends import MaestroSimulator

backend = MaestroSimulator()

QiskitSimulator

QiskitSimulator wraps Qiskit Aer for local simulation. Use it when you need noise models or Qiskit fake backends.

from divi.backends import QiskitSimulator

backend = QiskitSimulator()

Configuration Options

backend = QiskitSimulator(
    simulation_seed=42,        # Deterministic results for reproducibility
    qiskit_backend="auto",     # Or specify: "aer_simulator", "aer_simulator_statevector"
)

Example: Local VQE

import numpy as np
from divi.backends import MaestroSimulator
from divi.qprog import VQE, HartreeFockAnsatz
from divi.qprog.optimizers import ScipyOptimizer, ScipyMethod
from pennylane import qchem

molecule = qchem.Molecule(
    symbols=["H", "H"],
    coordinates=np.array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.5)]),
)

vqe = VQE(
    molecule=molecule,
    ansatz=HartreeFockAnsatz(),
    optimizer=ScipyOptimizer(ScipyMethod.L_BFGS_B),
    max_iterations=10,
    backend=MaestroSimulator(),
)

vqe.run()
print(f"Energy: {min(vqe.losses[-1].values()):.4f}")

Features

Noisy Simulation

Enable noise models for realistic simulation (QiskitSimulator only):

from qiskit_aer.noise import NoiseModel, depolarizing_error

noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(depolarizing_error(0.01, 1), ['rx', 'ry', 'rz'])
noise_model.add_all_qubit_quantum_error(depolarizing_error(0.02, 2), ['cx'])

backend = QiskitSimulator(noise_model=noise_model)

Alternatively, use a Qiskit fake backend to inherit a realistic noise profile:

from qiskit_ibm_runtime.fake_provider import FakeAuckland

backend = QiskitSimulator(qiskit_backend=FakeAuckland())

This is useful for testing error mitigation techniques like ZNE.

Deterministic Mode

Set a simulation seed for reproducible results (QiskitSimulator):

backend = QiskitSimulator(simulation_seed=1997)

Circuit Depth Tracking

Track circuit depths during execution:

backend = MaestroSimulator()
# ... run algorithms ...
print(f"Circuit depths: {backend.circuit_depths}")

When to Use Each Backend

MaestroSimulator (default):

  • Development and testing with fast iteration
  • Auto-routing between state vector and MPS based on circuit size
  • Large circuits (MPS scales beyond state vector limits)

QiskitSimulator:

  • Noisy simulation with custom noise models or Qiskit fake backends
  • Reproducibility with deterministic seeds
  • Error mitigation testing (ZNE development)