Qiskit Runtime で高速な古典-量子ハイブリッドアルゴリズムを回す(QAOA編)

# Qiskit Runtime

Qiskit Runtime は、最近一般向けユーザーも利用可能になったQiskitの新機能です。
Qiskit Runtime は、古典-量子ハイブリッド型のアルゴリズムを高速に行うために開発されました。

https://quantum-computing.ibm.com/services/docs/services/runtime/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/5be37bd9-daa2-2fcc-1d0c-cf1adde28255.png)


古典-量子ハイブリッド型のアルゴリズムでは古典計算と量子計算を何度も反復しますが、
量子計算を実行するたびに「順番待ち」が入るため、非常に小さな問題でもまともな時間で
終えることはほとんど不可能でした。
例えば、イタレーションが100回必要なものに対して、一日に数回イタレーションができるかどうかといった具合です。

対してQiskit Runtime では、量子計算機も古典計算機も（IBMが）クラウド上に高速なバスでつないだセットとして提供されます。
ユーザーは、この環境（ローカル古典量子イタレーション）を叩くことで、一度のクエリで結果を得ることができます。
現状、このような機能を提供しているのはQiskitのみです。

# How to use (QAOA)

QAOAをやってみましょう。
以下を参考にしました。
https://qiskit.org/documentation/optimization/tutorials/12_qaoa_runtime.html
ただ、runtimeの使い方は何度か紆余曲折あったようで、古いものも多いです。
これから記載するものは最新（2022/05時点）で動作ができたものになります。

パッケージは以下のものが必要です。

```python
# !pip install qiskit
# !pip install qiskit-ibm-runtime
```

import します

```python
from qiskit import IBMQ
from qiskit_ibm_runtime import QiskitRuntimeService
```

IBMQアカウントをセーブします。
```python
QiskitRuntimeService.save_account(channel="ibm_quantum", token="YOUR TOKEN")
```

以下では、IBMQクラウド上のシミュレーター（量子計算機のシミュレーター）と、IBMQクラウド上の古典コンピュータの間でイタレーションを回しています。

```python
import numpy as np
import matplotlib.pyplot as plt
from qiskit.opflow import PauliSumOp, Z, I
from qiskit.algorithms.optimizers import SPSA

# Define the cost operator to run.
op = (
    +0.5* (Z ^ Z ^ I ^ I)
    +0.5* (Z ^ I ^ Z ^ I)
    +0.5* (Z ^ I ^ I ^ Z)
    +0.5* (I ^ Z ^ Z ^ I)
    +0.5* (I ^ Z ^ I ^ Z)
    +0.5* (I ^ I ^ Z ^ Z)
    -3.0* (I ^ I ^ I ^ I)
)

# SPSA helps deal with noisy environments.
optimizer = SPSA(maxiter=100)

# We will run a depth two QAOA.
reps = 2

# The initial point for the optimization, chosen at random.
initial_point = np.random.random(2 * reps)

# The backend that will run the programm.
options = {"backend_name": "ibmq_qasm_simulator"}

# The inputs of the program as described above.
runtime_inputs = {
    "operator": op,
    "reps": reps,
    "optimizer": optimizer,
    "initial_point": initial_point,
    "shots": 2**13,
    # Set to True when running on real backends to reduce circuit
    # depth by leveraging swap strategies. If False the
    # given optimization_level (default is 1) will be used.
    "use_swap_strategies": False,
    # Set to True when optimizing sparse problems.
    "use_initial_mapping": False,
    # Set to true when using echoed-cross-resonance hardware.
    "use_pulse_efficient": False,
}

job = service.run(
    program_id="qaoa",
    options=options,
    inputs=runtime_inputs,
)

result = job.result()

print(f"Job status: {job.status()}")
```

`Job status: JobStatus.DONE`
となれば実行終了です。
結果は辞書型で帰ってきます。

```python
plt.plot(result["optimizer_history"]["energy"])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/bf3d7ee0-5b6e-fc4b-4d4e-3dc540291c25.png)

期待される答えは -4 です。だいたいそこへ向かっていることはわかります。

```python
counts= result["eigenstate"]
plt.bar(counts.keys(), counts.values())
plt.xlabel('bitstrings');
plt.ylabel('counts');
plt.xticks(rotation=90);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/cc0a3034-d871-70a4-ade5-b60184dda3c4.png)

期待される答えは、4bit中2bitが1であることです。確かにそれらの確率が高くなっています。


実機に投げる場合は、

```python
options = {"backend_name": "ibmq_lima"}
```

とすれば良いです。
順番待ちが長くなりやすい実機ではすぐ結果が帰ってこないこともあるようです。
雑音の環境下でどれぐらい動くのか試してみたいですね。

# 実機実行

**2022/05/06 追記**

実機実行してみました。結果を回収するには、

```python
job = service.job("Your job id")
```

または

```python
jobs = service.jobs()
```

で最新のjobをいくつかとってこれます。

limaでの結果を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/e44f651e-cd7c-5178-7ba0-d728327e6b17.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/8dbfc910-ef95-82c8-a421-668181f585c1.png)

こ　れ　は　ひ　ど　い。
全然だめでした。
error mitigation をすればもう少しマシになる・・・のかな？

実行時間はわからないのですが、optimizer time というの1700秒となっていました。
おそらく順番待ちも含む時間だと思います。

# 結論
- Qiskit Runtime 無料化は衝撃！
- とはいえ順番待ちはやっぱり長いので、あまり期待しすぎず。。

## Acknowledgement
Qiskit Runtime 無料化 については、つかのさんに教えていただきました。
https://twitter.com/snuffkin