Qsurface¶
Qsurface is a simulation package for the surface code, and is designed to modularize 3 aspects of a surface code simulation.
The surface code
The error model
The used decoder
New types of surface codes, error modules and decoders can be added to Qsurface by using the included templates for each of the three core module categories.
The current included decoders are:
The Mininum-Weight Perfect Matching (
mwpm
) decoder.Delfosse’s and Nickerson’s Union-Find (
unionfind
) decoder, which has almost-linear worst-case time complexity.Our modification to the Union-Find decoder; the Union-Find Node-Suspension (
ufns
) decoder, which improves the threshold of the Union-Find decoder to near MWPM performance, while retaining quasi-linear worst-case time complexity.
The compatibility of these decoders with the included surface codes are listed below.
Decoders |
|
|
---|---|---|
|
✅ |
✅ |
|
✅ |
✅ |
|
✅ |
✅ |
Installation¶
All required packages can be installed through:
pip install qsurface
Requirements¶
Python 3.7+
Matplotlib 3.4+ for plotting on a 3D lattice (Refers to a future release of matplotlib, see pull request)
MWPM decoder¶
The MWPM decoder utilizes networkx
for finding the minimal weights in a fully connected graph. This implementation is however rather slow compared to Kolmogorov’s Blossom V algorithm. Blossom V has its own license and is thus not included with Qsurface. We do provided a single function to download and compile Blossom V, and to setup the integration with Qsurface automatically.
>>> from qsurface.decoders import mwpm
>>> mwpm.get_blossomv()
Usage¶
To simulate the toric code and simulate with bitflip error for 10 iterations and decode with the MWPM decoder:
>>> from qsurface.main import initialize, run
>>> code, decoder = initialize((6,6), "toric", "mwpm", enabled_errors=["pauli"])
>>> run(code, decoder, iterations=10, error_rates = {"p_bitflip": 0.1})
{'no_error': 8}
Benchmarking of decoders can be enabled by attaching a benchmarker object to the decoder. See the docs for the syntax and information to setup benchmarking.
>>> from qsurface.main import initialize, run
>>> benchmarker = BenchmarkDecoder({"decode":"duration"})
>>> run(code, decoder, iterations=10, error_rates = {"p_bitflip": 0.1}, benchmark=benchmarker)
{'no_error': 8,
'benchmark': {'success_rate': [10, 10],
'seed': 12447.413636559,
'durations': {'decode': {'mean': 0.00244155000000319,
'std': 0.002170364089572033}}}}
Plotting¶
The figures in Qsurface allows for step-by-step visualization of the surface code simulation (and if supported the decoding process). Each figure logs its history such that the user can move backwards in time to view past states of the surface (and decoder). Press h
when the figure is open for more information.
>>> from qsurface.main import initialize, run
>>> code, decoder = initialize((6,6), "toric", "mwpm", enabled_errors=["pauli"], plotting=True, initial_states=(0,0))
>>> run(code, decoder, error_rates = {"p_bitflip": 0.1, "p_phaseflip": 0.1}, decode_initial=False)
Plotting will be performed on a 3D axis if faulty measurements are enabled.
>>> code, decoder = initialize((3,3), "toric", "mwpm", enabled_errors=["pauli"], faulty_measurements=True, plotting=True, initial_states=(0,0))
>>> run(code, decoder, error_rates = {"p_bitflip": 0.05, "p_bitflip_plaq": 0.05}, decode_initial=False)
In IPython, inline images are created for each iteration of the plot, which can be tested in the example notebook.
Command line interface¶
Simulations can also be initiated from the command line
$ python -m qsurface -e pauli -D mwpm -C toric simulation --p_bitflip 0.1 -n 10
{'no_error': 8}
For more information on command line interface:
$ python -m qsurface -h
usage: qsurface
...
This project is proudly funded by the `Unitary Fund <https://unitary.fund/>`_.
Modules¶
License¶
BSD 3-Clause License
Copyright (c) 2020, Shui Hu All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.