Skip to main content

Quantum Noisy Gates Simulation with Python

Project description

Noisy Quantum Gates Made at QMTS! Made at CERN! Made at CERN! Made at CERN!

Implementation of the Noisy Quantum Gates model, published in Di Bartolomeo, 2023. It is a novel method to simulate the noisy behaviour of quantum devices by incorporating the noise directly in the gates, which become stochastic matrices.

Documentations

The documentation for Noisy Quantum Gates can be accessed on the website Read the Docs.

How to install

Requirements

The Python version should be 3.9 or later. Find your Python version by typing python or python3 in the CLI. We recommend using the repo together with an IBM Quantum Lab account, as it necessary for circuit compilation with Qiskit in many cases.

Installation as a user

The library is available on the Python Package Index (PyPI) with pip install quantum-gates.

Installation as a contributor

For users who want to have control over the source code, we recommend the following installation. Clone the repository from Github, create a new virtual environment, and activate the environment. Then you can build the wheel and install it with the package manager of your choice as described in the section How to contribute. This will install all dependencies in your virtual environment, and install a working version of the library.

Quickstart

Execute the following code in a script or notebook. Add your IBM token to by defining it as the variable IBM_TOKEN = "your_token". Optimally, you save your token in a separate file that is not in your version control system, so you are not at risk of accidentally revealing your access token.

# Standard libraries
import numpy as np
import json

# Qiskit
from qiskit import QuantumCircuit, transpile
from qiskit.visualization import plot_histogram

# Own library
from quantum_gates.simulators import MrAndersonSimulator
from quantum_gates.gates import standard_gates
from quantum_gates.circuits import EfficientCircuit
from quantum_gates.utilities import DeviceParameters
from quantum_gates.utilities import setup_backend
IBM_TOKEN = "<your_token>"

We create a quantum circuit with Qiskit.

circ = QuantumCircuit(2,2)
circ.h(0)
circ.cx(0,1)
circ.barrier(range(2))
circ.measure(range(2),range(2))
circ.draw('mpl')

We load the configuration from a json file or from code with

config = {
    "backend": {
        "hub": "ibm-q",
        "group": "open",
        "project": "main",
        "device_name": "ibmq_manila"
    },
    "run": {
        "shots": 1000,
        "qubits_layout": [0, 1],
        "psi0": [1, 0, 0, 0]
    }
}

... and setup the Qiskit backend used for the circuit transpilation.

backend_config = config["backend"]
backend = setup_backend(Token=IBM_TOKEN, **backend_config)
run_config = config["run"]

This allows us to load the device parameters, which represent the noise of the quantum hardware.

qubits_layout = run_config["qubits_layout"]
device_param = DeviceParameters(qubits_layout)
device_param.load_from_backend(backend)
device_param_lookup = device_param.__dict__()

Last, we perform the simulation ...

sim = MrAndersonSimulator(gates=standard_gates, CircuitClass=EfficientCircuit)

t_circ = transpile(
    circ,
    backend,
    scheduling_method='asap',
    initial_layout=qubits_layout,
    seed_transpiler=42
)

probs = sim.run(
    t_qiskit_circ=t_circ, 
    qubits_layout=qubits_layout, 
    psi0=np.array(run_config["psi0"]), 
    shots=run_config["shots"], 
    device_param=device_param_lookup,
    nqubit=2)

counts_ng = {format(i, 'b').zfill(2): probs[i] for i in range(0, 4)}

... and analyse the result.

plot_histogram(counts_ng, bar_labels=False, legend=['Noisy Gates simulation'])

Usage

We recommend to read the overview of the documentation as a 2-minute preparation.

Imports

There are two ways of importing the package. 1) If you installed the code with pip, then the imports are simply of the form seen in the Quickstart.

from quantum_gates.simulators import MrAndersonSimulator
from quantum_gates.gates import standard_gates
from quantum_gates.circuits import EfficientCircuit
from quantum_gates.utilities import DeviceParameters, setup_backend
  1. If you use the source code directly and develop within the repository, then the imports become
from src.quantum_gates._simulation.simulator import MrAndersonSimulator
from src.quantum_gates._gates.gates import standard_gates
from src.quantum_gates._simulation.circuit import EfficientCircuit
from src.quantum_gates._utility.device_parameters import (
    DeviceParameters, 
    setup_backend
)

Functionality

The main components are the gates, and the simulator. One can configure the gates with different pulse shapes, and the simulator with different circuit classes and backends. The circuit classes use a specific backend for the statevector simulation. The EfficientBackend has the same functionality as the StandardBackend, but is much more performant thanks to optimized tensor contraction algorithms. We also provide various quantum algorithms as circuits, and scripts to run the circuits with the simulator, the IBM simulator, and a real IBM backend. Last, all functionality is unit tested and one can get sample code from the unit tests.

Unit Tests

We recommend running the unit tests once you are finished with the setup of your environment. As some tests need access to IBM devices, you have to follow the steps outlined in token.py. Make sure that your token is active and you have accepted all license agreement with IBM in your IBM account. Before you run the tests, make sure that the device you are testing with (the on set in tests/simulation/test_anderson_simulator.py) is available in your account and the device parameters are prepared in the tests/utility/device_parameters folder. In the future we might upgrade the tests and mock these dependencies.

How to contribute

Contributions are welcomed and should apply the usual git-flow: fork this repo, create a local branch named 'feature-...'. Commit often to ensure that each commit is easy to understand. Name your commits '[feature-...] Commit message.', such that it possible to differentiate the commits of different features in the main line. Request a merge to the mainline often. Contribute to the test suite and verify the functionality with the unit tests when using a different Python version or dependency versions. Please remember to follow the PEP 8 style guide, and add comments whenever it helps. The corresponding authors are happy to support you.

Build

You may also want to create your own distribution and test it. Navigate to the repository in your CLI of choice. Build the wheel with the command python3 -m build --sdist --wheel . and navigate to the distribution with cd dist. Use ls to display the name of the wheel, and run pip install <filename>.whl with the correct filename. Now you can use your version of the library.

Credits

Please cite the work using the following BibTex entry:

@article{PhysRevResearch.5.043210,
  title = {Noisy gates for simulating quantum computers},
  author = {Di Bartolomeo, Giovanni and Vischi, Michele and Cesa, Francesco and Wixinger, Roman and Grossi, Michele and Donadi, Sandro and Bassi, Angelo},
  journal = {Phys. Rev. Res.},
  volume = {5},
  issue = {4},
  pages = {043210},
  numpages = {19},
  year = {2023},
  month = {Dec},
  publisher = {American Physical Society},
  doi = {10.1103/PhysRevResearch.5.043210},
  url = {https://link.aps.org/doi/10.1103/PhysRevResearch.5.043210}
}

Authors

This project has been developed thanks to the effort of the following people:

Project details


Download files

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

Source Distribution

quantum_gates-2.0.0.tar.gz (132.0 kB view details)

Uploaded Source

Built Distribution

quantum_gates-2.0.0-py3-none-any.whl (51.8 kB view details)

Uploaded Python 3

File details

Details for the file quantum_gates-2.0.0.tar.gz.

File metadata

  • Download URL: quantum_gates-2.0.0.tar.gz
  • Upload date:
  • Size: 132.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.10

File hashes

Hashes for quantum_gates-2.0.0.tar.gz
Algorithm Hash digest
SHA256 c26d388c46eb3954ff3ad3d8e6397e0c2b3a4d05432437db8ec8aa6be3cddcc4
MD5 1afc64367c69b3d734faeb505c679328
BLAKE2b-256 8d0349e4187ed57bbe2d6727e060dcf230a768d1e8ec041c2eb0eec093163b40

See more details on using hashes here.

File details

Details for the file quantum_gates-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for quantum_gates-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 89448c7bc037a40639055615e5c28cca94e44571ac56489b84b2df1e482451cd
MD5 04479f8c437e4f01d09407a36e53b754
BLAKE2b-256 83c3ab1a101b6588bb5a94d4e2e28b87a12c6a38e0298adc9b64b863fd846220

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page