Qulacs向け量子回路描画ライブラリを作成したので紹介します

この記事は[量子コンピューター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/quantum) 6日目の記事です。5日目は@forest1040さんの[Qulacs新機能の紹介](https://qiita.com/forest1040/items/5736662de999b5e2e844)でした。

# はじめに

こんにちは。:qiitan:[Hiroya_W](https://qiita.com/Hiroya_W)です。大阪大学 藤井研究室でプログラミングバイトをしながら、[Qulacs](https://github.com/qulacs/qulacs)のメンテナーなどをしています。よろしくお願いします。

Qulacsは、量子計算研究のための量子回路の高速シミュレーターとして開発されています。

https://github.com/qulacs/qulacs

Qulacsが提供する`QuantumCircuit`の機能を使って量子回路を構成し、量子状態に作用させるシミュレーションを行う事ができます。
この時構成した量子回路を、視覚的に描画するためのライブラリとして、[qulacs-visualizer](https://github.com/Qulacs-Osaka/qulacs-visualizer)を作成し、OSSとして公開:cracker:しているので紹介します。

https://github.com/Qulacs-Osaka/qulacs-visualizer

例えば、Jupyter Notebook上で描画した量子回路を実行結果として残すことが出来ます。

![Screenshot_2022-11-26-03_939x1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4d44557b-ebb1-ff3f-4c54-09f478653c94.png)

# 使い方

:::note warn
QulacsはC++、Python向けにライブラリが提供されていますが、qulacs-visualizerはPython向けにのみ提供されています。
:::

## インストール

パッケージは[PyPIにアップロードしている](https://pypi.org/project/qulacsvis/)ため、`pip`を使ってインストールすることが出来ます。

```bash
pip install qulacsvis
```

## プログラム例

qulacs-visualizerは、以下の3つの描画方法に対応しています。

- テキストベース（アスキーアート）での描画方法
- Matplotlibを利用した描画方法
- LaTeXを利用した描画方法

状況に合わせて、好きなものを利用してください。

### テキストベースでの描画方法

まずはテキストベースでの描画方法を試してみます。プログラムの例はこのようになります。

```py
from qulacs import QuantumCircuit
from qulacsvis import circuit_drawer

# 量子回路を構成する
circuit = QuantumCircuit(3)
circuit.add_X_gate(0)
circuit.add_Y_gate(1)
circuit.add_Z_gate(2)
circuit.add_dense_matrix_gate(
    [0, 1], [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]]
)
circuit.add_CNOT_gate(2, 0)
circuit.add_X_gate(2)

# qulacs-visualizerを使って量子回路を描画する
circuit_drawer(circuit)
```

qulacs-visualizerの機能を使っているのは、最終行の`circuit_drawer`関数の部分です。第1引数に量子回路を渡すことで、その量子回路を描画することができます。
このプログラムの実行結果は、このようになります。

```
   ___     ___     ___
  | X |   |DeM|   |CX |
--|   |---|   |---|   |----------
  |___|   |   |   |___|
   ___    |   |     |
  | Y |   |   |     |
--|   |---|   |-----|------------
  |___|   |___|     |
   ___              |      ___
  | Z |             |     | X |
--|   |-------------●-----|   |--
  |___|                   |___|
```

このように、アスキーアートとして量子回路が描画されます。ターミナル上で実行結果を表示したい場合など、GUI環境が利用できない場合に適した描画方法になっています。

:::note warn
この方法で描画する場合、描画が崩れてしまうのを避けるために、等幅フォントを使用する必要があることに注意してください。
:::

### Matplotlibを利用した描画方法

Matplotlibを利用して描画する場合は、以下のように`circuit_drawer`関数の第2引数に`"mpl"`を指定します。

```py
circuit_drawer(circuit, "mpl")
# circuit_drawer(circuit, output_method="mpl")と同等
```

テキストベースの描画例で利用した量子回路をMatplotlibを利用して描画すると、このようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/58d14b28-8127-9fad-4beb-2e30ae455bce.png)

ターミナルなどからPythonスクリプトを実行した場合は、新たに表示されたMatplotlibのウィンドウ上に描画されます。また、Jupyter Notebook上で実行した場合は実行結果として、Notebook上に量子回路を描画することができます。

### LaTeXを利用した描画方法

LaTeXで量子回路を描画するためのパッケージとして[qcircuit](https://ctan.org/pkg/qcircuit)があります。TeX Liveにはデフォルトで含まれているため、TeX Liveをインストールしているユーザであればこのパッケージを使って量子回路を描画することができます。

https://ctan.org/pkg/qcircuit

qulacs-visualizerのLaTeXを利用した量子回路の描画では、このqcircuitを用いて描画を行います。具体的には以下のようなことを行っています。

1. Qulacsの量子回路から、qcircuitの記法に変換する。
1. 1. をLaTeX文章としてコンパイルしPDFを出力する(`pdflatex`を利用します)。
1. PDFを画像に変換(`pdftocairo`)し、Matplotlibで画像を表示する。

:::note warn
そのため、LaTeXを利用した描画方法では、利用するPC環境にLaTeX, [Poppler](https://texwiki.texjp.org/?Poppler)をインストールしておく必要があることに注意してください。
:::

量子回路を描画してみると、このようになります。Matplotlibを利用した描画方法と同様、Jupyter Notebookの実行結果として描画することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4a6582fc-9053-703e-fa9f-729f74777bf2.png)

#### LaTeX文章のみ生成

- LaTeX環境は無いため、LaTeX文章のみ生成したい
- 作成しているLaTeX文章に、量子回路を載せたい

といった場合には、LaTeX文章のみ生成することもできます。

```py
print(circuit_drawer(circuit, "latex_source"))
```

`circuit_drawer`関数からは文字列が返されるので、それを`print`してみるとこのような結果になります。

```latex
\documentclass[border={-2pt 5pt 5pt -7pt}]{standalone}
\usepackage[braket, qm]{qcircuit}
\usepackage{graphicx}

\begin{document}
    \Qcircuit @C=1.0em @R=0.7em @!R{ \\
        \nghost{ q_{0} : } & \lstick{ q_{0} : } & \gate{X} & \multigate{1}{DeM} & \targ & \qw & \qw\\
        \nghost{ q_{1} : } & \lstick{ q_{1} : } & \gate{Y} & \ghost{DeM} & \qw & \qw & \qw\\
        \nghost{ q_{2} : } & \lstick{ q_{2} : } & \gate{Z} & \qw & \ctrl{-2} & \gate{X} & \qw\\
    }
\end{document}
```

qulacs-visualizerのLaTeXを利用した描画方法では、これをコンパイルして出力されたものとなっています。

# 実用例

Qulacsをバックエンドとして利用した量子機械学習アルゴリズムのシミュレータとして[scikit-qulacs](https://github.com/Qulacs-Osaka/scikit-qulacs)が開発されています。scikit-qulacsに実装されている量子回路をqulacs-visualizerで描画した例をここから見ることが出来ます。

https://qulacs-osaka.github.io/scikit-qulacs/notebooks/circuit_visualize.html

# その他のオプション

それぞれの描画方法で利用できるオプションについて紹介していきます。これらのオプションについては、[ドキュメント](https://qulacs-osaka.github.io/qulacs-visualizer/options.html)でも説明しています。

https://qulacs-osaka.github.io/qulacs-visualizer/options.html

## テキストベースでの描画方法

テキストベースでの描画では、CNOTゲートの制御ビットを示す`●`によって、描画が崩れる場合があります。この場合は代わりのテキストとして`.`を利用することができます。
これは、キーワード引数`dot="small"`を渡します。デフォルトは`dot="large"`が指定されています。

```py
circuit_drawer(circuit, output_method='text', dot="small")
```

## Matplotlibを利用した描画方法

生成された量子回路の画像サイズを調整することができます。これは、キーワード引数`dpi`と`scale`を利用します。
ほとんどの場合`scale`を使って調整すれば問題ありませんが、今の見た目のまま画像の解像度を調整したい場合は`dpi`を調整してください。
デフォルトは`dpi=72`、`scale=0.6`が指定されています。

```py
circuit_drawer(circuit, output_method='mpl', dpi=72, scale=0.6)
```

## LaTeXを利用した描画方法

Matplotlibを利用した描画方法と同様に、LaTeXを利用した場合にも画像サイズを調整することが出来ます。これは、キーワード引数`ppi`を利用します[^1]。
デフォルトは`ppi=150`が指定されています。

```py
circuit_drawer(circuit, output_method='latex', ppi=150)
```

# LaTeX + Python環境が利用できるDev Container環境

ローカル環境にLaTeXが無い場合に利用できるDev Container環境がリポジトリ内に含まれています。ライブラリの開発環境、動作確認環境としても利用されているものです。
qulacs-visualizerのLaTeXを利用した描画方法を利用したい場合などに、活用してください。

https://github.com/Qulacs-Osaka/qulacs-visualizer/tree/main/.devcontainer

:::note warn
Dev Container環境内はnon-GUI環境として扱われます。Matplotlib、LaTeXを利用した描画方法を利用する場合はJupyter Notebookを利用してください。
:::

以下の手順で使います。

1. リポジトリをクローンします。
    ```bash
    git clone https://github.com/Qulacs-Osaka/qulacs-visualizer.git
    ```
1. VSCodeからDev Container環境としてプロジェクトを開きます。
1. Pythonの依存パッケージをインストールします。VSCode上でJupyter Notebookのファイルを編集したり実行したりするために、追加で`ipykernel`パッケージをインストールする必要があります。
    ```bash
    poetry install
    poetry add ipykernel
    ```
1. Notebookファイル(例えば`notebook.ipynb`)を作成し、Pythonカーネルとして`.venv/bin/python`を指定します。
1. Notebook上で量子回路を描画するプログラムを作成し、実行します。

# さいごに

Qulacsを利用して構成した量子回路を、視覚的に描画するためのライブラリであるqulacs-visualizerを紹介しました。Qulacsを利用した量子計算研究などで役立てていただければ嬉しいです。
また、ライブラリを利用する中で、バグや改善してほしいところなどあればお気軽に:edit-request:Issueで報告していただければ嬉しいです。

https://github.com/Qulacs-Osaka/qulacs-visualizer

明日は、@SatoshiTerasakiさんの「アヤメデータセットの分類を skqulacs で行う (in Julia)」です。お楽しみに〜！

[^1]: PDFから画像を生成するために利用している`pdftocairo`で画像サイズを変更しています。この`pdftocairo`の指定の仕方がppiであるため、Matplotlibとは異なるオプションになっています。