About Dense Evolution
Dense Evolution is a quantum simulation toolkit for quantum computing researchers and developers, with statevector and MPS engines, VQE, noise handling, and quantum chemistry capabilities. It also includes a local circuit editor and an MCP server that lets agents drive the editor.
Key features
- 01JAX XLA-compiled statevector and MPS simulation
- 02Chunked execution with disk overflow
- 03Noise models and zero-noise extrapolation
- 04Differentiable VQE and molecular Hamiltonians
- 05OpenQASM 2.0/3.0 parsing and interoperability
- 06Circuit editor and local dashboard
Use cases
- 01Simulate quantum circuits under memory limits
- 02Run VQE and molecular quantum chemistry calculations
- 03Study noise and quantum error mitigation
- 04Let agents operate the circuit editor
MCP support
The project includes an MCP server with 22 tools for agents to control the locally running circuit editor.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
uvx dense-evolutionDENSE_EVOLUTION_KERNEL_URLURL of the running Dense-Evolution Composer kernel. Start it first with 'dense-evolution serve' (requires the [composer] extra). Defaults to http://127.0.0.1:8800.Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project README
A high-performance quantum simulation toolkit Statevector/MPS engines with compilation, noise, VQE, QEC, chemistry, and agent-native tooling.
Download the Dense Evolution Dashboard (Streamlit)
Windows (.bat) ·
macOS / Linux (.sh)
Table of Contents
▍ What It Is
Run up to 28 qubits in about 3 seconds, without crashing. Dense Evolution JIT-compiles statevector circuits through JAX XLA, automatically chunks and — past even that RAM ceiling — spills to disk when memory fills up, so a real simulation stays alive instead of OOM-ing.
📖 Full documentation, API reference, and worked examples →
A local Streamlit dashboard and web-based Composer editor are also included — see Composer & MCP Server below.
▍ Install
pip install dense-evolution # JAX is a core dependency, installed by default
# full stack: GPU · dashboard · Qiskit/PennyLane interop
pip install dense-evolution[full]
# just the interop bridge
pip install dense-evolution[qiskit]
pip install dense-evolution[pennylane]
# native Hartree-Fock (basis-set data)
pip install dense-evolution[hf]
# Composer's local kernel (see "Composer" below)
pip install dense-evolution[composer]
# MCP server for the Composer kernel (see "MCP Server" below)
pip install dense-evolution[mcp]
# development
git clone https://github.com/tatopenn-cell/Dense-Evolution.git
cd Dense-Evolution && pip install -e .[full]
⚠️ macOS + dense-evolution[qiskit] users
Qiskit's own QuantumCircuit.__init__ is known to segfault the whole process on macOS/arm64 (an upstream Qiskit bug, not something Dense-Evolution can fix from its side — see release v8.1.43 for the full reproduction). dense_evolution/interop.py now warns (RuntimeWarning, once per process) the first time you touch the Qiskit bridge on sys.platform == 'darwin', but it does not block — some Qiskit/macOS combinations may work fine. If you hit a crash, pip install dense-evolution[pennylane] gives the same circuit-interop functionality without constructing any Qiskit object.
Google Colab (3 lines):
!git clone https://github.com/tatopenn-cell/Dense-Evolution.git
%cd Dense-Evolution
!pip install -e .
▍ Quick Start
from dense_evolution import DenseSVSimulator, QASMParser
# parse any OpenQASM 2.0 / 3.0 string -- single-qubit rotations, a barrier
# (a real OpenQASM synchronization marker: parsed like hardware would, no
# effect on the simulated state), then an entangling layer
qasm = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
rx(pi/3) q[0];
ry(pi/4) q[1];
h q[2];
barrier q;
cx q[0], q[1];
cx q[1], q[2];
rz(pi/6) q[2];
"""
parser = QASMParser()
circuit = parser.parse(qasm)
sim = DenseSVSimulator(n_qubits=3)
sim.run_circuit_jit(circuit.to_tuples())
probs = sim.get_probabilities()
sv = sim.get_statevector()
# probs = [0.3201 0.3201 0.0549 0.0549 0.0183 0.0183 0.1067 0.1067]
Noise:
import numpy as np
from dense_evolution import DenseSVSimulator, QASMParser, NoiseModel
qasm = 'OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; h q[0]; cx q[0],q[1];'
circuit = QASMParser().parse(qasm)
sim = DenseSVSimulator(n_qubits=2)
sim.run_circuit_jit(circuit.to_tuples())
noisy_sv = NoiseModel.apply_to_sv(np.asarray(sim.sv), n=2, model='depolarizing', p=0.05, rng=np.random.default_rng(0))
np.abs(noisy_sv) ** 2
# [0. 0.5 0.5 0. ]
VQE:
import jax
import jax.numpy as jnp
from dense_evolution import QASMParser, circuit_to_energy_fn
qasm = 'OPENQASM 2.0; include "qelib1.inc"; qreg q[1]; ry(0.0) q[0];'
circuit = QASMParser().parse(qasm)
energy_fn, n_params = circuit_to_energy_fn(circuit, n_qubits=1)
h = jnp.array([[1.0, 0.0], [0.0, -1.0]], dtype=jnp.complex128) # Pauli Z
theta = jnp.array([0.1])
grad_fn = jax.value_and_grad(energy_fn, argnums=0, has_aux=True)
for _ in range(40):
(energy, sv), grad = grad_fn(theta, h)
theta = theta - 0.5 * grad
# energy = -1.0, theta = [3.14159265]
Mitigation (ZNE):
import dense_evolution as de
e1, e2, e3 = 1.234, 0.876, 0.611 # values at 1x, 2x, 3x noise
de.zero_noise_extrapolation([e1, e2, e3], [1.0, 2.0, 3.0])
# 1.622
Dashboard (local, Streamlit):
pip install "dense-evolution[dashboard]" # JAX already included by default
streamlit run tools/dashboard/app.py
Anti-OOM for large circuits:
from dense_evolution import Chunk, QASMParser
qasm = 'OPENQASM 2.0; include "qelib1.inc"; qreg q[27]; h q[0:27];'
circuit = QASMParser().parse(qasm)
sim = Chunk(27)
sim.run_chunk(circuit.to_tuples(), chunk_size_gates=500)
▍ Key Features
- JIT-fused statevector engine. No Kronecker-product overhead — stride-sliced linear kernel fusion compiled through JAX XLA, real GPU/TPU dispatch with no code change. Simulator · MPS backend for low-entanglement circuits at scale.
- Anti-OOM
Chunkengine. Circuits too large for one array, split dynamically and sized off the real compute device's own free memory — with disk-backed overflow past even that ceiling. Chunk guide. - Real noise, real mitigation. Stochastic Kraus channels, real-device noise imported from Qiskit backends, and Zero-Noise Extrapolation, with the shot budget split optimally across noise factors and a single-qubit Bloch-vector variant that always returns a valid state, to correct for it. Noise · Mitigation · what noise/mitigation/healing each mean.
- Differentiable VQE, from scratch.
circuit_to_energy_fnis the same JAX-differentiable engine real molecular VQE runs on — real Hartree-Fock Hamiltonians, UCCSD/hardware-efficient ansätze, Adam optimization. Autodiff. - libcint integrals on Windows, macOS and Linux.
pip install dense-evolutionships libcint compiled for each system: the full two-electron tensor of ethanol in 6-31G* in 0.32 s. Open-shell molecules with UHF and ROHF (run_uhf,run_cuhf). native_hf. - Reversible arithmetic. Register adders, subtraction, comparisons and modular arithmetic up to modular exponentiation, applied as exact basis permutations, and as OPENQASM 2.0 gate circuits (Cuccaro, Draper and Beauregard adders, controlled modular multiplication), up to Shor order finding with one control qubit. Arithmetic.
- Postselection. Keep the branch where a qubit is found in
|0>,|1>,|±>or|±i>, with its probability. Postselection. - OpenQASM 2.0/3.0, both directions. A real parser, plus Qiskit/PennyLane interop bridges. QASM Parser · Interop.
- Code-agnostic QEC decoding, Majorana/Jordan-Wigner fermion mapping, from-scratch Hartree-Fock for elements outside PennyLane's own basis set, a traversable-wormhole-inspired teleportation protocol, and real QM/MM region partitioning (ring-safe BFS, Diffuse2Seg-derived relevance propagation) — see the full API reference for all of it.
▍ Benchmarks
Measured on Windows, CPU only, 8 GB RAM — PennyLane's default.qubit allocates the full statevector; Dense Evolution's Chunk holds constant ~2 GB regardless of qubit count.
| Qubits | Hilbert Space | PennyLane | Dense Evolution | Chunk Geometry |
|---|---|---|---|---|
| 26 | 67,108,864 | ✅ 1,074 MB | ✅ 2,050 MB | 1× (2²⁷) |
| 28 | 268,435,456 | ❌ OOM | ✅ 2,050 MB | 2× (2²⁷) |
| 32 | 4,294,967,296 | ❌ OOM | ✅ 2,048 MB | 32× (2²⁷) |
On Google Colab (12 GB RAM), n=28 runs in ~3s end-to-end (JIT-compiled, num_chunks=2) — the multi-chunk path is fast, not just OOM-safe. Past the real RAM ceiling (Chunk alone raises MemoryPressureError cleanly rather than crashing the process), allow_disk_overflow=True falls back to a slower disk-backed path instead of failing — correctness-first, not benchmarked for speed yet. Full measured table: docs/api/chunk.md.
▍ Composer & MCP Server
A real circuit editor (graphical or OpenQASM) running on your own machine, plus an MCP server exposing 22 tools so an agent (Claude Code, Claude Desktop, ...) can drive it directly. Composer · MCP Server.
▍ Key Resources
▍ Changelog
📜 Full Changelog & Releases — every version, latest first.
▍ License
GNU Affero General Public License v3.0 or later. A commercial licence is available on request.
Releases up to 8.3.2 were published under the Business Source License 1.1: LICENSE-BUSL-1.1-until-8.3.2.md
Full text: LICENSE
▍ Cite This
If Dense-Evolution is useful in academic work, please cite it via the metadata in CITATION.cff (recognized by GitHub's own "Cite this repository" button, and by reference managers that support the Citation File Format).
Archived on Zenodo:
- Concept DOI (always resolves to the latest version): 10.5281/zenodo.21855643
- This release (v8.2.0): 10.5281/zenodo.22818319
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.