Home

Awesome

Stim

Logo

<a name="what-is-stim"></a>What is Stim?

Stim is a tool for high performance simulation and analysis of quantum stabilizer circuits, especially quantum error correction (QEC) circuits. Typically Stim is used as a python package (pip install stim), though stim can also be used as a command line tool or a C++ library.

Stim's key features:

  1. Really fast simulation of stabilizer circuits. Have a circuit with thousands of qubits and millions of operations? stim.Circuit.compile_sampler() will perform a few seconds of analysis and then produce an object that can sample shots at kilohertz rates.

  2. Semi-automatic decoder configuration. stim.Circuit.detector_error_model() converts a noisy circuit into a detector error model (a Tanner graph) which can be used to configure decoders. Adding the option decompose_operations=True will additionally suggest how hyper errors can be decomposed into graphlike errors, making it easier to configure matching-based decoders.

  3. Useful building blocks for working with stabilizers, such as stim.PauliString, stim.Tableau, and stim.TableauSimulator.

Stim's main limitations are:

  1. There is no support for non-Clifford operations, such as T gates and Toffoli gates. Only stabilizer operations are supported.
  2. stim.Circuit only supports Pauli noise channels (eg. no amplitude decay). For more complex noise you must manually drive a stim.TableauSimulator.
  3. stim.Circuit only supports single-control Pauli feedback. For multi-control feedback, or non-Pauli feedback, you must manually drive a stim.TableauSimulator.

Stim's design philosophy:

<a name="how-use-stim"></a>How do I use Stim?

See the Getting Started Notebook.

Stuck? Get help on the quantum computing stack exchange and use the stim tag.

See the reference documentation:

<a name="how-stim-work"></a>How does Stim work?

See the paper describing Stim. Stim makes three core improvements over previous stabilizer simulators:

  1. Vectorized code. Stim's hot loops are heavily vectorized, using 256 bit wide AVX instructions. This makes them very fast. For example, Stim can multiply Pauli strings with 100 billion terms in one second.
  2. Reference Frame Sampling. When bulk sampling, Stim only uses a general stabilizer simulator for an initial reference sample. After that, it cheaply derives as many samples as needed by propagating simulated errors diffed against the reference. This simple trick is ridiculously cheaper than the alternative: constant cost per gate, instead of linear cost or even quadratic cost.
  3. Inverted Stabilizer Tableau. When doing general stabilizer simulation, Stim tracks the inverse of the stabilizer tableau that was historically used. This has the unexpected benefit of making measurements that commute with the current stabilizers take linear time instead of quadratic time. This is beneficial in error correcting codes, because the measurements they perform are usually redundant and so commute with the current stabilizers.

<a name="how-cite-stim"></a>How do I cite Stim?

When using Stim for research, please cite:

@article{gidney2021stim,
  doi = {10.22331/q-2021-07-06-497},
  url = {https://doi.org/10.22331/q-2021-07-06-497},
  title = {Stim: a fast stabilizer circuit simulator},
  author = {Gidney, Craig},
  journal = {{Quantum}},
  issn = {2521-327X},
  publisher = {{Verein zur F{\"{o}}rderung des Open Access Publizierens in den Quantenwissenschaften}},
  volume = {5},
  pages = {497},
  month = jul,
  year = {2021}
}