量子GUIシミュレータ (QPlat)

## この記事に関して
ここでは私が開発した量子GUIシミュレータ [QPlat](https://blueqat.com/) ( blueqat ver ) の使い方を解説します。

## QPlat
![Screen Shot 2020-09-10 at 13.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/d3afd58b-d7e0-0b87-6900-c12b81b2c3e4.png)

このプラットフォームでは、量子回路をドラッグ&ドロップで簡単にシミュレートできるようになっています。
またNISQアルゴリズムのVQE,QAOAもこれ一つで行うことができます。

## 使い方
上の図を大雑把に説明します。
左側には量子ゲートが並べてあります。
1量子ゲート、回転ゲート、2量子ゲート...と各項目ごとで分けています。

中央は量子回路を作成する部分です。
量子ビットの個数、観測する回数を設定したり、作成した回路のpythonコードを取得できたりします。

右側は観測結果です。
観測確率と観測回数がグラフで表示されます。

### 量子回路の作成・観測
試しに量子回路を作成して、観測してみます。

![Screen-Recording-2020-09-10-at-14.08.41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/2c216793-71f0-c4d4-ea91-bfdd538e5c6f.gif)

1. 上の図のように左からゲートを取ってきて中央の場所に持っていきます。
中央に持っていくと影ができるのでそこに置くことができます。

2. ゲートを配置できたら中央右上の EXECUTION をクリックします。
今回は X ゲートを1つ置いただけなので 10000 と観測されたのがわかります。

※ 観測するビットには必ず最後に M ゲート (measurement) を置いてください。
これを置かないときちんと観測されません。

### 量子ビット数・観測回数の変更
![Screen-Recording-2020-09-10-at-14.26.50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/59864d23-e338-adb4-6c3a-8a069cd46a02.gif)

- 中央上部の Qubits で量子ビットの数を変更します。
量子ビットの数で回路の線の数も変わります。
EXECUTION をクリックすると10000から100に変わったことがわかります。

- 中央上部の Shots で観測回数を変更します。
EXECUTION をクリックすると1000から500に変わったことがわかります。

### ゲートの配置変更
![Screen-Recording-2020-09-10-at-14.36.38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/88761cf9-a276-47fd-ced7-10b5a8a20926.gif)

- 配置したゲートをドラッグすると移動させることができます。  
観測すると100から010に変わったのがわかります。

### ゲートの削除
![Screen-Recording-2020-09-10-at-14.54.45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/9c1d1814-a3ad-c062-ff4d-9eef2719cc7d.gif)

- 配置されているゲートをクリックするとゲートの右上に×ボタンが出ます。  
これをクリックすると削除することができます。

### 回転ゲート・コントロールゲートの配置
回転ゲート
![Screen-Recording-2020-09-10-at-22.21.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/c7ca5311-c0c8-3bda-903f-99a5b60ac256.gif)

コントロールゲート
![9c6n0-yjerz.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/757a23ba-4d85-d5cd-090f-edec9236030a.gif)

- 右上のタブを Detail に切り替えて配置したゲートをダブルクリックするとゲートの詳細を設定することができます。  
回転ゲートの角度やコントロールビット・ターゲットゲートはここで設定します。

### その他 (一括削除・拡大・縮小)
![ehpc5-ep16k.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/0aac8120-1e75-3975-b9fc-7820a1360d31.gif)

- ゴミ箱マークをクリックするとゲートを一括削除できます。
- +、- で回路を拡大・縮小できます。またピンチイン・ピンチアウトでもできます。
- リセットボタンで回路の倍率を100%に戻すことができます。

※ 画面サイズでドラッグがずれることがあります。リセットボタンで解消してください。

## NISQ の使い方
![Screen Shot 2020-09-10 at 14.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/3f94079e-7e11-3191-cb7d-23c91e32dcec.png)

NISQ ボタンをクリックすると NISQ モードに切り替わります。
ここでは VQE と QAOA を実行することができます。

基本的にはハミルトニアンを入力すれば簡単に実行できます。

※ 9/10現在、良いUIが思いついておらずblueqatの記法でハミルトニアンをベタ書きすると実行できるようになっています。

### VQE
VQE はエルミート行列の最小・最大固有値を導出するアルゴリズムです。

![Screen-Recording-2020-09-10-at-15.29.11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/302ced06-2adf-7ff1-d313-42544398640a.gif)

VQE の詳細は[ここ](https://qiita.com/KeiichiroHiga/items/c900d430dc33d4342b24)に記述してます。

- Hamiltonian にエルミート行列となるように式を入力してください。
行列は $I, X, Y, Z$ を使うことができます。

- Step にはパラメータの更新回数を入力します。

#### ハミルトニアンの書き方
$Z(i)$ は $i$ 番目のビットに $Z$ ゲートを施すことを意味します。
積は通常の積と違いテンソル積を用います。

``` math
Z(0)*Z(1) = Z\otimes Z = ZZ \\
X(0)*Y(2) = X\otimes I\otimes Y = XIY
```
このように表せます。

#### 出力の解説
はじめに $\theta$ でパラメータ表示された状態 $\left|\psi(\theta)\right>$ を考えます。
これを用いて今回は $\left<\psi(\theta)\right|Z \otimes Z\left|\psi(\theta)\right>$ を最小化させます。

帰ってきた出力がおおよそ 1/2 の確率で $\left|10\right>, \left|01\right>$ となっていることから

``` math
\left|\psi(\theta)\right> \approx \frac{1}{\sqrt{2}}\left(\left|10\right>+\left|01\right>\right)
```
となることがわかります。
これを元の式に代入すると

``` math
\left<\psi(\theta)\right|Z \otimes Z\left|\psi(\theta)\right> \approx
\frac{1}{\sqrt{2}}\left<10\right|Z \otimes Z\left|10\right>+
\frac{1}{\sqrt{2}}\left<01\right|Z \otimes Z\left|01\right>\\
```

``` math
= -1-1 = -2
```
$Z\otimes Z$ の最小固有値は -2 よりきちんと出力されていることがわかります。
このあたりの計算も今後実装しようと思います。

### QAOA
QAOA は (二次) バイナリ多項式 ( QUBO ) の最小値を求めるアルゴリズムです。

![Screen Shot 2020-09-11 at 13.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/45386081-f821-0854-9f6d-0c4d8e6f58a9.png)

QAOA は[ここ](https://qiita.com/KeiichiroHiga/items/88bf1cb601e7422b4bea) QAOAnsatz は[ここ](https://arxiv.org/pdf/1709.03489.pdf)を参考にしています。

この多項式は一般の多項式と違い変数が $q_i \in \\{0,1\\}$ となります(バイナリ)

バイナリ多項式は組み合わせ最適化問題に対応ができます。
Qiitaには[交通流最適](https://qiita.com/YuichiroMinato/items/19dd89e381f14ad24134)や[ポートフォリオバランス](https://qiita.com/YuichiroMinato/items/46839cdaabbb452f2fa1)などが目につくとこでは掲載されていました。

#### ハミルトニアンの書き方
ここではVQEとは違い多項式を記述します。
変数は $q(i)$ で記述していきます。 $i$ の最大数が使用するビットの数となります。

``` math
q_0+q_0q_1 \ ,\ q_i \in \{0,1\}
```
今回は上の式の最小値を求めています。

#### Initializer と Mixer (上級)
通常のQAOAはハミルトニアンのみでできますが。
Ansatz を用いることで制度をあげることができます。

![Screen Shot 2020-09-11 at 12.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517405/edf19d12-c8c0-bf9c-f87d-8248ea1dc55d.png)

通常のQAOAでは全通り計算していますが、Ansatzを用いると探索領域を制限することができます。

##### Initializer
探索領域をここで決めます。
記法は blueqat の回路の書き方で記述します。
よくわからない場合は回路を作成してコードをコピペしてもいいかもしれません。

今回の例では

``` math
\frac{1}{\sqrt{2}}\left(\left|00\right>+\left|11\right>\right)
```
となるので 00, 11 のみの二通りに制限しています。

##### Mixer
Initializer を設定した場合は Mixer も設定しなければいけません。
ここでは制限領域上での動き方を記述します。
記法について、 $X[i]$ は $i$ 番目のビットに $X$ ゲートを施すことを意味します。
$I, X, Y, Z$ 行列を使うことができます。積はテンソル積になります。

今回の例では

``` math
\frac{1}{2}\left(XX-YY\right) =
\frac{1}{2}\left(\begin{array}{cc}
0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0
\end{array}\right)
```
が Mixer になります。

``` math
\left|00\right> \xrightarrow{\rm{Mixer}} \left|11\right> \\
\left|11\right> \xrightarrow{\rm{Mixer}} \left|00\right>
```
となることから制限領域でビットが反転されることがわかります。
詳しくは[ここ](https://qiita.com/gyu-don/items/c51a9e3d5d16a6d5baf6)を見ると良いかもしれません。

以上のことを踏まえてQAOAの二つの図を見比べて見ると
Ansatz を用いたほうが精度が上がっていることがわかります。

## まとめ
今回は QPlat について説明しました。
今後のアップグレードした際にはまた別の記事としてあげようと思います。

## 参考文献
QAOAで社会問題
https://qiita.com/YuichiroMinato/items/a557fd2290b4c2625556

Quantum Alternating Operator Ansatzを使用したポートフォリオリバランスのレビュー
https://qiita.com/YuichiroMinato/items/46839cdaabbb452f2fa1

[QAOA]SWAPの時間発展で|10>と|01>とを入れ替える
https://qiita.com/gyu-don/items/c51a9e3d5d16a6d5baf6