Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/icekhan13/qiskitflow

QiskitFlow. Framework for reproducible quantum experiments
https://github.com/icekhan13/qiskitflow

ibm-qiskit qiskit quantum quantum-computing

Last synced: 3 months ago
JSON representation

QiskitFlow. Framework for reproducible quantum experiments

Awesome Lists containing this project

README

        

QiskitFlow. Reproducible quantum experiments.
=============================================

![logo](https://raw.githubusercontent.com/IceKhan13/QiskitFlow/master/docs/images/logo-updated.gif)

Platform for tracking, sharing and running quantum experiments in a clean and understandable for developers, researchers and students manner.

> Alpha release is in the works.
> Files from hackathon project are located in [hackathon folder](./hackathon)

### Hot to run
* [Overview / Flow](#flow)
* [Installation and server running](#installation)
* [Code annotation](#code-annotation)
* [CLI](#cli)
* [Experiment runs list](#list-of-experiment-runs)
* [Experiment run information](#experiment-run-information)
* [Share experiment](#share-experiment-run)
* [Examples](#examples)
* [UI](#ui)

### Flow

![flow](https://raw.githubusercontent.com/IceKhan13/QiskitFlow/master/docs/images/flow.png)

Flow of actions while using QiskitFlow is following:
- [Install](#installation) QiskitFlow if not installed yet
- [Annotate](#code-annotation) your code with `Experiment` abstraction QiskitFlow library provides
- Run your code as usual: QiskitFlow will write metadata of your experiment execution in local folder
- You can review experiments using [CLI interface](#cli)

> We are tracking metrics, parameters, state vectors and counts of experiments.
> Artifacts, circuits, sourcecode and other useful things are on their way.

> Note: qiskitflow creates `_experiments` folder in place of execution of code, where all serialized information is stored in json format, so it's easy to track it even in git

### Installation

In order to install qiskitflow locally you need to follow 2 step process:
- install python library for code annopatation and cli
- run docker containers for backend server, ui and database

To install qiskitflow library and CLI simply run
```shell script
pip install qiskitflow
```

In order to run containers with required services we suggest to use docker-compose. But by no means we restrict you to deploy qiskitflow to any container aware environment. At the end of the day all required services are just docker images.
1. Copy [docker-compose.yaml file ](./docker-compose.yaml) to your machine
2. Run `docker-compose up` in a folder where you saved compose file. In a few moments you should see logs from server, ui and database.

> NOTE: in order to share experiments you need to have backend server up and running.

> NOTE: username and password for local server is `admin`

### Code annotation

Library for quantum programs annotation

Sample example of annotation:
```python
from qiskitflow import Experiment

with Experiment("awesome_experiment") as experiment:

# your quantum program here!

experiment.write_metric("test metric", 0.1)
experiment.write_metric("test metric 2", 2)

experiment.write_parameter("test parameter", "test parameter value")
experiment.write_parameter("test parameter 2", "test paraeter value 2")

experiment.write_counts("measurement", {"00": 1024, "11": 0})
```

Full example with quantum teleportation

```python
import numpy as np
import time
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, BasicAer, IBMQ
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.extensions import Initialize
from qiskit_textbook.tools import random_state, array_to_latex

from qiskitflow import Experiment

with Experiment("quantum teleportation") as experiment:
start_time = time.time()

# conduct experiment as usual
psi = random_state(1)
init_gate = Initialize(psi)
init_gate.label = "init"
inverse_init_gate = init_gate.gates_to_uncompute()

qr = QuantumRegister(3, name="q")
crz = ClassicalRegister(1, name="crz")
crx = ClassicalRegister(1, name="crx")
qc = QuantumCircuit(qr, crz, crx)
qc.append(init_gate, [0])
qc.barrier()
create_bell_pair(qc, 1, 2)
qc.barrier()
alice_gates(qc, 0, 1)
measure_and_send(qc, 0, 1)
bob_gates(qc, 2, crz, crx)
qc.append(inverse_init_gate, [2])
cr_result = ClassicalRegister(1)
qc.add_register(cr_result)
qc.measure(2,2)
backend_name = "qasm_simulator"
backend = BasicAer.get_backend(backend_name)
counts = execute(qc, backend, shots=1024).result().get_counts()

end_time = time.time()

runtime = end_time - start_time

# qiskitflow =========

# log parameters used
experiment.write_parameter("backend name", backend_name)
# log metrics of experiment
experiment.write_metric("runtime", runtime)
# log counts of experiment
experiment.write_counts("experiment counts", counts)
```

------

### CLI

#### List of experiment runs
```shell
qiskitflow runs [--search=] [--experiment=] [--order_by=] [--order_type=]
```

experiments list screenshot

![list](https://github.com/IceKhan13/QiskitFlow/blob/master/lib/docs/images/runs.png?raw=true)

#### Experiment run information
```shell
qiskitflow run
```

experiment information screenshots

Experiment information
![info](https://github.com/IceKhan13/QiskitFlow/blob/master/lib/docs/images/run_detailed.png?raw=true)

#### Share experiment run
```shell script
qiskitflow share --user= --password= --host= --port=
```

Example for local backend server
```shell script
qiskitflow share 86b6e7ba32f04d34b842a91079482454 --user= --password= --host=http://localhost --port=8000
```

experiment share screenshots

Experiment information
![share](https://github.com/IceKhan13/QiskitFlow/blob/master/lib/docs/images/run_share.png?raw=true)

------

### Examples

[Jupyter notebook with quantum teleportation example](https://github.com/IceKhan13/QiskitFlow/blob/master/docs/examples/example.ipynb)

### UI

Screenshots

Experiment information
![ui](https://github.com/IceKhan13/QiskitFlow/blob/master/docs/images/ui-updated.png?raw=true)