Selene
Selene is a quantum computer emulation platform written primarily in Rust with a python frontend.
Selene is built with flexibility in mind. This includes:
- A plugin system for the addition of additional components including simulators, error models, quantum runtimes to be provided within Selene or as third party plugins
- Support for custom input formats and device APIs through the selene-core build system.
What's included
Out of the box, Selene provides first-class support for the HUGR ecosystem, including execution of Guppy programs in an emulation environment, making use of our open-source compiler. You can find many examples of guppy usage in our unit tests.
Selene provides a range of simulators, including:
- Statevector simulation using QuEST and the quest-sys crate.
- Stabilizer simulation using Stim
- Coinflip simulation with customisable bias
- Classical Replay, for running pre-recorded measurements without direct simulation
- Quantum Replay, for running pre-recorded measurements with postselection-based simulation
Error models that are currently provided include:
- An 'ideal' error model which adds no noise to simulations
- A depolarizing error model which adds noise to qubit initialisation, measurement, and single- and two-qubit gates
And we offer two example quantum runtimes, including:
- Simple, which executes the program as-is, without any modifications
- SoftRZ, which elides Z rotations through RXY gates, providing the same observable behaviour with fewer quantum operations
Usage example
Although examples are provided in our tests folder, here is a quick walkthrough to get you started with Selene, HUGR and Guppy.
- First, we define the guppy program that we're interested in emulating:
from guppylang import guppy
from guppylang.std.quantum import *
from hugr.qsystem.result import QsysShot, QsysResult
@guppy
def main() -> None:
# allocate 10 qubits
qubits = array(qubit() for _ in range(10))
# prepare the 10-qubit GHZ state (|0000000000> + |1111111111>)/sqrt(2)
h(qubits[0])
for i in range(9):
cx(qubits[i], qubits[i+1])
# measure all qubits
ms = measure_array(qubits)
# report measurements to the results stream
result("measurements", ms)
compiled_hugr = main.compile()
- Then we compile the resulting HUGR Envelope to LLVM IR or bitcode using the HUGR-QIS compiler
from selene_sim import build
runner = build(compiled_hugr)
- Then we can utilise
runorrun_shotson the resulting selene instance, choosing a simulator (in this case Quest or Stim) and an error model (in this case DepolarizingErrorModel) to run the program.
from selene_sim import Quest, Stim
# run a single shot with Quest, the statevector simulator
shot = QsysShot(runner.run(simulator=Quest(), n_qubits=10))
print(shot)
# run a single shot with Stim, the stabilizer simulator
shot = QsysShot(runner.run(simulator=Stim(), n_qubits=10))
print(shot)
# run_shots runs efficient multi-shot simulations
# n_processes provides multi-processing across shots
# deterministic results can be achieved by providing a random seed
shots = QsysShot(runner.run(
simulator=Stim(random_seed=5),
n_qubits=10,
n_shots=100,
n_processes=8
))
print(shots)
- As well as simulators, we can customise the emulation by providing an error model, such as the depolarizing error model:
from selene_sim import DepolarizingErrorModel
error_model = DepolarizingErrorModel(
random_seed=12478918,
p_init=1e-3,
p_meas=1e-2,
p_1q=1e-5,
p_2q=1e-6,
)
shots = QsysResult(runner.run_shots(
simulator=Stim(
random_seed=10
),
error_model=error_model,
n_qubits=10,
n_shots=20,
n_processes=4,
))
print(shots)
- And/or a runtime, such as the SoftRZRuntime, which elides physical RZ gates through subsequent RXY gates:
from selene_sim import SoftRZRuntime
shots = QsysResult(runner.run_shots(
simulator=Stim(),
runtime=SoftRZRuntime(),
error_model=error_model,
n_qubits=10,
n_shots=20
))
print(shots)
Metadata
Release files for selene-sim 0.3.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| selene_sim-0.3.4-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| selene_sim-0.3.4-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| selene_sim-0.3.4-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| selene_sim-0.3.4-py3-none-macosx_12_0_x86_64.whl | Python 3 | none | macOS 12.0+ x86-64 | Details |
| selene_sim-0.3.4-py3-none-macosx_12_0_arm64.whl | Python 3 | none | macOS 12.0+ ARM64 | Details |
Total release size: 74.2 MB
Release files / selene_sim-0.3.4-py3-none-win_amd64.whl
| Download URL | selene_sim-0.3.4-py3-none-win_amd64.whl |
|---|---|
| Size | 14.0 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4133689805242057b2f42b8a291c2a9cf705b7dffc02472eb643c714cd925eb8
|
|
BLAKE2b-256 checksum How to use checksums |
ee9ac37ba9c17ca1d017e02c038559521810c1fdc9a9b39417e4c08fc926b59b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / selene_sim-0.3.4-py3-none-manylinux_2_28_x86_64.whl
| Download URL | selene_sim-0.3.4-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 8.7 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
c5d5c84748f80e81c721b9fff4057826b0e8f2de00bdc6ae1eda2993f0e515b0
|
|
BLAKE2b-256 checksum How to use checksums |
5b3274dab918bc0c96681f78a9f983824d97b75f01c204a98f0cd01cfd135335
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / selene_sim-0.3.4-py3-none-manylinux_2_28_aarch64.whl
| Download URL | selene_sim-0.3.4-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 8.4 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
3b0b10c89ba1bd0cc196bef8700a210453c912f84c92de3e819fc5c590a33bdd
|
|
BLAKE2b-256 checksum How to use checksums |
b3b3d90b6afd9dfba1465cdff29c79425791b439540d92921b5a6138f69a68b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / selene_sim-0.3.4-py3-none-macosx_12_0_x86_64.whl
| Download URL | selene_sim-0.3.4-py3-none-macosx_12_0_x86_64.whl |
|---|---|
| Size | 21.9 MB |
| Tags | Python 3 macOS 12.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
a90b93a817100cc91b8b780e2c47140886b894c7c15b1f19d11c25d31112e3c2
|
|
BLAKE2b-256 checksum How to use checksums |
ecc0d9d1e40b029f372b67304d26eaec3d374ed78c0586f860c553c9420a4e06
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / selene_sim-0.3.4-py3-none-macosx_12_0_arm64.whl
| Download URL | selene_sim-0.3.4-py3-none-macosx_12_0_arm64.whl |
|---|---|
| Size | 21.3 MB |
| Tags | Python 3 macOS 12.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c9248ee2eab23c560beaf3f4926263a30959aca05ecb6aded8ea7670bcd3f5d8
|
|
BLAKE2b-256 checksum How to use checksums |
216ee3707a37db3dccb3f75e3222784bab429ebcda1ac59195874b8e0d2c4550
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|