Skip to main content

Quantinuum's open source emulator for hybrid quantum computation

Project description

Selene Logo

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 run or run_shots on 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)

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

selene_sim-0.2.0rc6-py3-none-win_amd64.whl (2.8 MB view details)

Uploaded Python 3Windows x86-64

selene_sim-0.2.0rc6-py3-none-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

selene_sim-0.2.0rc6-py3-none-manylinux_2_28_aarch64.whl (4.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

selene_sim-0.2.0rc6-py3-none-macosx_11_0_x86_64.whl (4.0 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

selene_sim-0.2.0rc6-py3-none-macosx_11_0_arm64.whl (3.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file selene_sim-0.2.0rc6-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for selene_sim-0.2.0rc6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8db998b76cdd2bcf4eabef97d6ca3d63f417cc76ea1e60a9cd3101f72fe698b1
MD5 088ec4072494c1bf82f4f12c133f60f0
BLAKE2b-256 ed37db05d56d78ab17c017b393ca5ddabb9cfc2328f8836dcbd3cfd86d7e2ba4

See more details on using hashes here.

File details

Details for the file selene_sim-0.2.0rc6-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for selene_sim-0.2.0rc6-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2a3f5ca778cdf9fc65bbd5d373cca2b8e51357c08a5eb8800cf8603287dab9a6
MD5 14b18495db59d299d10f04b2fdad2746
BLAKE2b-256 9d0a608b1bda8197d8c608225d489c7764e4e76539ec59354a74476d9560f518

See more details on using hashes here.

File details

Details for the file selene_sim-0.2.0rc6-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for selene_sim-0.2.0rc6-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ece55fba0f42a9ec972ade1bf609adc321b45f5c5e7474290086ce2d6c3b160e
MD5 9a051511620fb9b562871f8dea39412e
BLAKE2b-256 10c116bf16e990b66fbaa0ca83b09366323884caeec90b714d769868ad1a83d5

See more details on using hashes here.

File details

Details for the file selene_sim-0.2.0rc6-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for selene_sim-0.2.0rc6-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 72ab51aa185401d911db2127bf20dce40e74604dce42a12d978bfaacfff11f61
MD5 f3a3c25e3535554d7ab3e844b6e5cf0f
BLAKE2b-256 e9f6a695efb6732b25e216a783724aec9f6ac80759232e0ddb9f470c67904da9

See more details on using hashes here.

File details

Details for the file selene_sim-0.2.0rc6-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for selene_sim-0.2.0rc6-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4e45e815d8ea6cfe8beced7ee346a4beb85b6327dec81e9603fb1fa86c6c2b6
MD5 e01b2177f30de31e928af63dae6193b8
BLAKE2b-256 3ee250026f85ac617ef281fe881055388a3b231b001bd4736409c988c6a73d75

See more details on using hashes here.

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