pennylane-maestro
A PennyLane plugin for the Maestro quantum simulator by Qoro Quantum.
Drop-in replacement for default.qubit — one line change, same code, faster results.
# Before
dev = qp.device("default.qubit", wires=20)
# After
dev = qp.device("maestro.qubit", wires=20)
Why Maestro?
- Iterate Faster — Up to 20× faster statevector simulations for VQE/QAOA loops.
- Scale Up — Simulate 1000+ qubits using Maestro's optimized MPS backend.
- Sample from MPS — The only PennyLane MPS backend that supports shot-based sampling.
- GPU Ready — Fast GPU simulation on MPS workloads via cuQuantum.
Installation
pip install pennylane-maestro
That's it. This installs pennylane (≥0.38) and qoro-maestro (≥0.3.7) automatically.
Quick Start
import pennylane as qp
import numpy as np
dev = qp.device("maestro.qubit", wires=2)
@qp.qnode(dev)
def circuit(theta):
qp.RX(theta, wires=0)
qp.CNOT(wires=[0, 1])
return qp.expval(qp.PauliZ(1))
print(circuit(np.pi / 4))
Performance
Benchmarked on PennyLane 0.44.1. Run
examples/benchmark_lightning_vs_maestro.pyto reproduce.
Statevector
| Qubits | default.qubit |
lightning.qubit |
maestro.qubit |
vs dq | vs lq |
|---|---|---|---|---|---|
| 20 | 977 ms | 115 ms | 45 ms | 22× | 2.6× |
| 22 | 4.31 s | 543 ms | 184 ms | 23× | 3.0× |
| 24 | 10.5 s | 2.36 s | 820 ms | 13× | 2.9× |
| 26 | DNF | 10.1 s | 3.56 s | ∞ | 2.8× |
MPS — Scaling to 1000+ Qubits
| Qubits | default.qubit |
default.tensor (quimb) |
maestro.qubit (MPS) |
vs quimb |
|---|---|---|---|---|
| 100 | OOM | 90 ms | 11 ms | 8× |
| 500 | OOM | 689 ms | 90 ms | 7.7× |
| 1000 | OOM | 1.96 s | 207 ms | 9.5× |
MPS Shot Sampling
🔥 Only Maestro supports this. Neither
default.tensornor Qiskit Aer MPS offer shot-based sampling through PennyLane.
| Qubits | maestro.qubit (MPS) |
Unique Samples |
|---|---|---|
| 100 | 259 ms | 10,000 |
| 500 | 1.22 s | 10,000 |
| 1000 | 2.43 s | 10,000 |
Backends
All backends are selected via keyword arguments — no code changes needed:
# CPU Statevector (default)
dev = qp.device("maestro.qubit", wires=20)
# MPS for 100+ qubits
dev = qp.device("maestro.qubit", wires=100,
simulation_type="MatrixProductState",
max_bond_dimension=256)
# Stabilizer for Clifford circuits
dev = qp.device("maestro.qubit", wires=1000,
simulation_type="Stabilizer")
# Finite shots
dev = qp.device("maestro.qubit", wires=10, shots=10_000)
# GPU (requires separate license — see below)
dev = qp.device("maestro.qubit", wires=28, simulator_type="Gpu")
All available options
simulator_type |
Description |
|---|---|
"QCSim" |
Qoro's optimized CPU simulator (default) |
"Gpu" |
CUDA-accelerated GPU simulator |
"CompositeQCSim" |
p-block simulation |
simulation_type |
Description |
|---|---|
"Statevector" |
Full statevector (default) |
"MatrixProductState" |
MPS / tensor-train for large qubit counts |
"Stabilizer" |
Clifford-only stabilizer |
"TensorNetwork" |
General tensor network |
"PauliPropagator" |
Pauli propagation |
"ExtendedStabilizer" |
Extended stabilizer |
Device options
Further keyword arguments map onto Maestro's SimulatorConfig:
# Double precision on GPU / Qiskit Aer
dev = qp.device("maestro.qubit", wires=28, simulator_type="Gpu",
precision="double")
# Pauli propagation with truncation
dev = qp.device("maestro.qubit", wires=200,
simulation_type="PauliPropagator",
pp_max_pauli_weight=8, pp_gates_between_trims=10)
# Force gate fusion on; turn off pre-execution reductions
dev = qp.device("maestro.qubit", wires=20, gate_fusion=True,
enable_causal_cone_reduction=False, auto_reduce=False)
| Option | Default | Description |
|---|---|---|
precision |
None |
"single" or "double" for GPU and Qiskit Aer backends. None keeps each backend's default; QCSim always uses double. |
max_bond_dimension |
None |
MPS bond-dimension cap. |
singular_value_threshold |
None |
MPS SVD truncation cutoff. |
disable_optimized_swapping |
False |
Disable MPS swap optimisation. |
pp_coefficient_threshold |
None |
PauliPropagator: drop Pauli strings with smaller coefficients. |
pp_max_pauli_weight |
None |
PauliPropagator: drop Pauli strings acting on more qubits than this. |
pp_gates_between_trims |
None |
PauliPropagator: gates between truncation passes. |
pp_gates_between_deduplications |
None |
PauliPropagator: gates between merges of duplicate strings. |
enable_causal_cone_reduction |
True |
Simulate only the causal cone of the measured observables. |
auto_reduce |
True |
Detect invariant subspaces and simulate the reduced register. |
enable_observable_clustering |
True |
Split multi-observable estimates into groups with disjoint lightcones. Requires a Maestro release newer than 0.3.7; ignored otherwise. |
max_cluster_qubits |
None |
Cap each observable cluster at this many lightcone qubits. Requires a Maestro release newer than 0.3.7; ignored otherwise. |
gate_fusion |
None |
Fuse compatible gates. None uses each backend's default. |
seed |
None |
Seed for reproducible sampling and noise. |
use_double_precision=True/False is still accepted as shorthand for precision="double"/"single". The legacy names pp_pauli_weight_threshold (→ pp_max_pauli_weight) and pp_steps_between_trims (→ pp_gates_between_trims) still work but emit a DeprecationWarning.
Examples
Hamiltonian VQE
Hamiltonians are evaluated natively via Maestro's batched estimate() — all Pauli terms in a single C++ call:
import pennylane as qp
import numpy as np
n_qubits = 20
H = qp.Hamiltonian(
[0.5] * (n_qubits - 1) + [0.3] * n_qubits,
[qp.PauliZ(i) @ qp.PauliZ(i+1) for i in range(n_qubits - 1)] +
[qp.PauliX(i) for i in range(n_qubits)]
)
dev = qp.device("maestro.qubit", wires=n_qubits)
@qp.qnode(dev, diff_method="parameter-shift")
def vqe_circuit(params):
for i in range(n_qubits):
qp.RY(params[i], wires=i)
for i in range(n_qubits - 1):
qp.CNOT(wires=[i, i + 1])
return qp.expval(H)
params = np.random.random(n_qubits)
energy = vqe_circuit(params)
gradient = qp.grad(vqe_circuit)(params)
100-Qubit Ising Quench with MPS Shot Sampling
See examples/ising_phase_transition.py for a full demo that simulates a 100-qubit transverse-field Ising model and uses Maestro's exclusive MPS shot sampling to extract magnetization distributions and spatial correlations. Runs in ~30 seconds.
Supported Operations
PennyLane automatically decomposes any unsupported gate (e.g. Rot) into Maestro's native gate set. No manual intervention needed.
🚀 GPU Acceleration
For large-scale workloads, Maestro supports CUDA-accelerated simulation (statevector, MPS, tensor network) via NVIDIA cuQuantum.
dev = qp.device("maestro.qubit", wires=28, simulator_type="Gpu")
GPU Benchmark — Fermi-Hubbard MPS (48 qubits, χ=256)
| Simulator | Relative Runtime |
|---|---|
| Maestro GPU | 1× |
| Maestro CPU | 5× |
| Qibo GPU | 7.5× |
| Qiskit CPU | 14× |
| PennyLane GPU | 64× |
Larger instances failed to run on some platforms, limiting comparison.
→ Request GPU access & free trial at maestro.qoroquantum.net
Citation
If you use pennylane-maestro in your research, please cite:
@misc{pennylane_maestro,
author = {{Qoro Quantum}},
title = {PennyLane-Maestro: High-Performance C++ Backend for PennyLane},
year = {2026},
publisher = {GitHub},
howpublished = {\url{https://github.com/QoroQuantum/pennylane-maestro}}
}
Authors & License
Maintained by Qoro Quantum (team@qoroquantum.de).
Licensed under GPL-3.0. See the LICENSE file for details.
Metadata
Release files for pennylane-maestro 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pennylane_maestro-0.5.0.tar.gz | 50.2 kB | With provenance | Details for pennylane_maestro-0.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pennylane_maestro-0.5.0-py3-none-any.whl | Python 3 | none | any | Details for pennylane_maestro-0.5.0-py3-none-any.whl |
Total release size: 85.1 kB
Release files / pennylane_maestro-0.5.0.tar.gz
| Download URL | pennylane_maestro-0.5.0.tar.gz |
|---|---|
| Size | 50.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d11418440295bfb16b217eb491e5180fc95324d079b49a34ca28b8e9bc9ab556
|
|
BLAKE2b-256 checksum How to use checksums |
7fbd5138476843d9c81f41e1d9f206b2f5bbdd8a1903b35911bc5911a16a5511
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / pennylane_maestro-0.5.0-py3-none-any.whl
| Download URL | pennylane_maestro-0.5.0-py3-none-any.whl |
|---|---|
| Size | 34.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bf0e383e3a96a3c9a4ad0d2f559df711cdc8439735b06236badf06c473ed3f6b
|
|
BLAKE2b-256 checksum How to use checksums |
b936218a0fb7f4604f143c0115e43151be1c09baae96c2a80db203cfd8aa6ede
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for pennylane-maestro 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pennylane_maestro-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.