Skip to content

MarcSerraPeralta/surface-sim

Repository files navigation

Surface-sim

example workflow Code style: black Documentation Status PyPI

This package is a wrapper around Stim to simplify the construction of QEC circuits. Given a circuit, it can implement the logical equivalent under different types of noise, including circuit-level noise. It uses a code layout that helps with qubit labeling, indexing and connectivity. It also defines the detectors automatically for any sequence of logical gates.

For more information see the documentation.

Installation

This package is available in PyPI, thus it can be installed using

pip install surface-sim

or alternatively, it can be installed from source using

git clone git@github.com:MarcSerraPeralta/surface-sim.git
pip install surface-sim/

Example

Pre-built experiment: memory experiment

from surface_sim.layouts import rot_surface_code
from surface_sim.models import CircuitNoiseModel
from surface_sim import Detectors
from surface_sim.experiments.rot_surface_code_css import memory_experiment

# prepare the layout, model, and detectors objects
layout = rot_surface_code(distance=3)
model = CircuitNoiseModel(layout.qubit_inds)
detectors = Detectors.from_layouts(layout)

# create a memory experiment
NUM_ROUNDS = 10
DATA_INIT = {q: 0 for q in layout.data_qubits}
ROT_BASIS = True  # X basis
MEAS_RESET = True  # reset after ancilla measurements
PROB = 1e-5

model.setup.set_var_param("prob", PROB)
stim_circuit = memory_experiment(
    model,
    layout,
    detectors,
    num_rounds=NUM_ROUNDS,
    data_init=DATA_INIT,
    rot_basis=ROT_BASIS,
    anc_reset=MEAS_RESET,
)

Arbitrary logical circuit from a given circuit

import stim

from surface_sim.models import CircuitNoiseModel
from surface_sim import Detectors
from surface_sim.experiments import experiment_from_circuit
from surface_sim.circuit_blocks.unrot_surface_code_css import gate_to_iterator
from surface_sim.layouts import unrot_surface_codes

circuit = stim.Circuit(
    """
    R 0 1
    TICK
    CNOT 0 1
    TICK
    S 0
    I 1
    TICK
    S 0
    H 1
    TICK
    M 0
    MX 1
    OBSERVABLE_INCLUDE(0) rec[-1] rec[-2]
    """
)

layouts = unrot_surface_codes(circuit.num_qubits, distance=3)
model = CircuitNoiseModel.from_layouts(*layouts)
detectors = Detectors.from_layouts(*layouts, frame="pre-gate")

model.setup.set_var_param("prob", 1e-3)

experiment = experiment_from_circuit(
    circuit, layouts, model, detectors, gate_to_iterator, anc_reset=True
)

Tags can be used to specify noiseless/ideal operations. For example, in the circuit below, the logical reset and measurement are noiseless:

R[noiseless] 0
TICK
TICK
TICK
M[noiseless] 0

For more fine tunning in the presence of multiple code patches, see surface_sim.experiments.experiment_from_schedule.

Observables can be defined from Paulis, not just measurement records. For example:

RX 0
R 1
TICK
CNOT 0 1
TICK
TICK
TICK
TICK[noiseless]
OBSERVABLE_INCLUDE(0) Z0 Z1
OBSERVABLE_INCLUDE(1) X0 X1

Noise models with random physical error probabilities

import stim

from surface_sim.models import SI1000NoiseModel
from surface_sim import Detectors
from surface_sim.experiments import experiment_from_circuit
from surface_sim.circuit_blocks.unrot_surface_code_css import gate_to_iterator
from surface_sim.layouts import unrot_surface_codes
from surface_sim.setups.random import lognormal

circuit = stim.Circuit(
    """
    R 0
    TICK
    M 0
    OBSERVABLE_INCLUDE(0) rec[-1]
    """
)

layouts = unrot_surface_codes(circuit.num_qubits, distance=11)
model = SI1000NoiseModel.from_layouts(*layouts)
detectors = Detectors.from_layouts(*layouts, frame="pre-gate")

model.setup.convert_to_random(prob=lognormal(-3, 0.1, seed=123))

experiment = experiment_from_circuit(
    circuit, layouts, model, detectors, gate_to_iterator, anc_reset=True
)

For more information and examples about surface-sim, please read the documentation.

About

Stim wrapper for simulations of surface code experiments

Topics

Resources

License

Stars

11 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors

Languages