Skip to main content

High-throughput CPU backend for repeated evaluation of parameterized quantum circuits

Project description

qitesse

PyPI Version License Python Versions

qitesse is a high-throughput CPU backend for repeated evaluation of parameterized quantum circuits.

qitesse is built upon qitesse-sim, the high-performance CPU-based state-vector execution engine for quantum circuits, fully built in Rust.

This PyPI module provides a Python interface designed for hybrid quantum algorithms, repeated circuit evaluation, backend integration, and low-overhead CPU execution from Python.

Features

  • Rust-based CPU statevector simulator with a Python API
  • One-off circuit execution through Gate and Circuit
  • Compiled parameterized circuits through CircuitSpec, Parameter, and CompiledCircuit
  • Reusable zero-copy parameter buffers through ParamBuffer and ParamBatchBuffer
  • Expectation-value workflows for Pauli observables and Hamiltonians
  • Batch expectation execution for parameter sweeps and optimizer loops
  • Gradient APIs for compiled circuits via parameter-shift evaluation
  • Reusable ExecutionContext buffers for repeated scalar execution
  • Full statevector output for both one-off and compiled execution paths
  • Mid-circuit measure, reset, and barrier operations
  • Custom unitary operations with Gate.unitary(...)
  • Controlled custom unitaries with Gate.controlled_unitary(...)
  • Common single-, two-, and multi-qubit gates
  • Read the Docs documentation with autogenerated API reference pages

Installation

qitesse requires Python 3.8+. Install it via pip:

pip install qitesse

Or install from source:

git clone https://github.com/OsamaMIT/qitesse.git

pip install maturin

maturin develop --release

To run examples:

python examples/h_example.py

python examples/qft._example.py

python examples/custom_unitary.py

Documentation

The documentation is now set up for Read the Docs with automatic API generation.

To add a new public class to the API docs, add it once in docs/api/index.rst. Sphinx will generate the class page and include its methods and attributes automatically.

Current Capabilities

qitesse currently has two main usage modes:

  1. General-purpose simulation with Gate and Circuit for one-off execution.
  2. Compiled execution with CircuitSpec and CompiledCircuit for repeated parameterized workloads.

The compiled path currently supports:

  • reusable zero-copy parameter buffers
  • scalar expectation evaluation
  • batched expectation evaluation
  • scalar gradients
  • batched gradients
  • reusable execution contexts
  • statevector inspection when needed

The simulator path currently supports:

  • standard single-qubit gates
  • controlled and multi-qubit gates
  • custom unitaries
  • measurement, reset, and barrier operations

Compiled Circuits

import numpy as np
import qitesse

spec = qitesse.CircuitSpec(2)
theta = spec.param("theta")

spec.ry(0, theta)
spec.cx(0, 1)

compiled = spec.compile()
observable = qitesse.Observable.pauli_z(1)

value = compiled.expectation(np.array([0.4], dtype=np.float32), observable)
gradient = compiled.gradient(np.array([0.4], dtype=np.float32), observable)
value_again, grad_again = compiled.value_and_gradient(
    np.array([0.4], dtype=np.float32),
    observable,
)
state = compiled.statevector(np.array([0.4], dtype=np.float32))

params_batch = np.array([[0.1], [0.2], [0.3]], dtype=np.float32)
values = compiled.batch_expectation(params_batch, observable)
grads = compiled.batch_gradient(params_batch, observable)

context = compiled.execution_context()
value_again = context.expectation(compiled, np.array([0.5], dtype=np.float32), observable)
grad_again = context.gradient(compiled, np.array([0.5], dtype=np.float32), observable)

This execution path is intended for repeated evaluation of the same circuit structure with different parameter values.

Backend Integration

The compiled execution path is the primary integration surface for higher-level libraries.

The intended backend pattern is:

  1. Translate a framework circuit into CircuitSpec
  2. Compile once per circuit structure
  3. Keep parameters in contiguous numpy.float32 arrays
  4. Call expectation, batch_expectation, gradient, or value_and_gradient

For sequential scalar calls, reuse compiled.execution_context() to keep internal buffers alive.

For sweeps, minibatches, or optimizer batches, prefer batch_expectation(...) and batch_gradient(...) instead of looping in Python.

Supported Gates

Single-qubit gates:

  • i
  • x
  • y
  • z
  • h
  • s
  • sdg
  • t
  • tdg
  • rx
  • ry
  • rz
  • p / phase
  • u

Two-qubit gates:

  • cnot / cx
  • cy
  • cz
  • ch
  • swap
  • iswap
  • crx
  • cry
  • crz
  • cp / cphase
  • cu

Three-qubit and larger:

  • ccx / toffoli
  • cswap / fredkin
  • mcx
  • mcz
  • mcp / mcphase
  • controlled_unitary

Circuit operations:

  • measure
  • reset
  • barrier

Custom unitaries:

import numpy as np
import qitesse

hadamard = np.array([[1, 1], [1, -1]], dtype=np.complex64) / np.sqrt(2)

circuit = qitesse.Circuit([
    qitesse.Gate.unitary([0], hadamard),
    qitesse.Gate.controlled_unitary([0], [1], hadamard),
])

state = circuit.run(2)

Use run_with_measurements(num_qubits) if the circuit contains measurement gates and you want the observed bit values back.

Planned Features

  • Additional simulation backends

Contributing

Contributions are welcome! To contribute:

  1. Fork the repository
  2. Create a new branch (feature-branch)
  3. Commit your changes and open a pull request

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qitesse-0.2.0.tar.gz (32.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qitesse-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (491.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

File details

Details for the file qitesse-0.2.0.tar.gz.

File metadata

  • Download URL: qitesse-0.2.0.tar.gz
  • Upload date:
  • Size: 32.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for qitesse-0.2.0.tar.gz
Algorithm Hash digest
SHA256 027073b282a9989bd71602f5643aa753e9f1282442a480e1a0b2204e5d9ee187
MD5 b99a3ce5990dba864224c30a5cf7919e
BLAKE2b-256 cc33c94af5b1fe270d2f0b2a4b9ac1386eee6e38a895b08cbfa960401f49dcd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for qitesse-0.2.0.tar.gz:

Publisher: pypi_publish.yml on OsamaMIT/qitesse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qitesse-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qitesse-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 03e8f1c65ceb3e746ef32d0949ed7d5742dc2e4fdc4b5e9a05b473ef9aef6993
MD5 d726d46e9492dac073102cdd317f6f7d
BLAKE2b-256 8b87b6febada9a8be18a39f12db83749233dd6957082c00ea5c150c90421c1d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for qitesse-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: pypi_publish.yml on OsamaMIT/qitesse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page