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.2
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.2-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| selene_sim-0.3.2-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| selene_sim-0.3.2-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| selene_sim-0.3.2-py3-none-macosx_12_0_x86_64.whl | Python 3 | none | macOS 12.0+ x86-64 | Details |
| selene_sim-0.3.2-py3-none-macosx_12_0_arm64.whl | Python 3 | none | macOS 12.0+ ARM64 | Details |
Total release size: 73.1 MB
Release files / selene_sim-0.3.2-py3-none-win_amd64.whl
| Download URL | selene_sim-0.3.2-py3-none-win_amd64.whl |
|---|---|
| Size | 13.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a637db419f6aba2bb37f8cda5078071e85969b7e97b7d8ed67265665c2f0febb
|
|
BLAKE2b-256 checksum How to use checksums |
9d31cda87763f2add735c88e48cd4f16bb6c3b14ab8dd9ac49ce06b392492b3c
|
| 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.2-py3-none-manylinux_2_28_x86_64.whl
| Download URL | selene_sim-0.3.2-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 8.5 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
ae5032894c7ee945ada6b053071b572959e4e25480cb4b22b89a9367c339e866
|
|
BLAKE2b-256 checksum How to use checksums |
52ca5c945b9ecc0fcc6fa9b563d43bef78c1e0bd154d78ceebe8fd71a2b55b30
|
| 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.2-py3-none-manylinux_2_28_aarch64.whl
| Download URL | selene_sim-0.3.2-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 8.1 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
ef3694e33ff779a9a7e33e2b9667bf8368f204dfbe82be6fb6fbca6271e3a90e
|
|
BLAKE2b-256 checksum How to use checksums |
9fa1e12170ee08721ca545e3dac99a3ccb16d962d911ae94e2248b4181741879
|
| 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.2-py3-none-macosx_12_0_x86_64.whl
| Download URL | selene_sim-0.3.2-py3-none-macosx_12_0_x86_64.whl |
|---|---|
| Size | 21.7 MB |
| Tags | Python 3 macOS 12.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
198d8294045a23e39d366e44dd1bbdf4c33c5de84b4445b2052138451fe9603a
|
|
BLAKE2b-256 checksum How to use checksums |
70613b35bfb730d9e6e51df28dc9fca2f95201a1399531d8466d8ef43b31d3af
|
| 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.2-py3-none-macosx_12_0_arm64.whl
| Download URL | selene_sim-0.3.2-py3-none-macosx_12_0_arm64.whl |
|---|---|
| Size | 21.1 MB |
| Tags | Python 3 macOS 12.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
aa6786bf229149e78cf22264b418d310469c9b7cbb3aba56bd505fd3815747cb
|
|
BLAKE2b-256 checksum How to use checksums |
525331e795309d5d8ed9a09e54a613794b40092cec4a0b64ade1d02d9cedc8a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|