この記事は量子コンピューター Advent Calendar 2022 6日目の記事です。5日目は@forest1040さんのQulacs新機能の紹介でした。
はじめに
こんにちは。Hiroya_Wです。大阪大学 藤井研究室でプログラミングバイトをしながら、Qulacsのメンテナーなどをしています。よろしくお願いします。
Qulacsは、量子計算研究のための量子回路の高速シミュレーターとして開発されています。
Qulacsが提供するQuantumCircuit
の機能を使って量子回路を構成し、量子状態に作用させるシミュレーションを行う事ができます。
この時構成した量子回路を、視覚的に描画するためのライブラリとして、qulacs-visualizerを作成し、OSSとして公開しているので紹介します。
例えば、Jupyter Notebook上で描画した量子回路を実行結果として残すことが出来ます。
使い方
QulacsはC++、Python向けにライブラリが提供されていますが、qulacs-visualizerはPython向けにのみ提供されています。
インストール
パッケージはPyPIにアップロードしているため、pip
を使ってインストールすることが出来ます。
pip install qulacsvis
プログラム例
qulacs-visualizerは、以下の3つの描画方法に対応しています。
- テキストベース(アスキーアート)での描画方法
- Matplotlibを利用した描画方法
- LaTeXを利用した描画方法
状況に合わせて、好きなものを利用してください。
テキストベースでの描画方法
まずはテキストベースでの描画方法を試してみます。プログラムの例はこのようになります。
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環境が利用できない場合に適した描画方法になっています。
この方法で描画する場合、描画が崩れてしまうのを避けるために、等幅フォントを使用する必要があることに注意してください。
Matplotlibを利用した描画方法
Matplotlibを利用して描画する場合は、以下のようにcircuit_drawer
関数の第2引数に"mpl"
を指定します。
circuit_drawer(circuit, "mpl")
# circuit_drawer(circuit, output_method="mpl")と同等
テキストベースの描画例で利用した量子回路をMatplotlibを利用して描画すると、このようになります。
ターミナルなどからPythonスクリプトを実行した場合は、新たに表示されたMatplotlibのウィンドウ上に描画されます。また、Jupyter Notebook上で実行した場合は実行結果として、Notebook上に量子回路を描画することができます。
LaTeXを利用した描画方法
LaTeXで量子回路を描画するためのパッケージとしてqcircuitがあります。TeX Liveにはデフォルトで含まれているため、TeX Liveをインストールしているユーザであればこのパッケージを使って量子回路を描画することができます。
qulacs-visualizerのLaTeXを利用した量子回路の描画では、このqcircuitを用いて描画を行います。具体的には以下のようなことを行っています。
- Qulacsの量子回路から、qcircuitの記法に変換する。
-
- をLaTeX文章としてコンパイルしPDFを出力する(
pdflatex
を利用します)。
- をLaTeX文章としてコンパイルしPDFを出力する(
- PDFを画像に変換(
pdftocairo
)し、Matplotlibで画像を表示する。
そのため、LaTeXを利用した描画方法では、利用するPC環境にLaTeX, Popplerをインストールしておく必要があることに注意してください。
量子回路を描画してみると、このようになります。Matplotlibを利用した描画方法と同様、Jupyter Notebookの実行結果として描画することができます。
LaTeX文章のみ生成
- LaTeX環境は無いため、LaTeX文章のみ生成したい
- 作成しているLaTeX文章に、量子回路を載せたい
といった場合には、LaTeX文章のみ生成することもできます。
print(circuit_drawer(circuit, "latex_source"))
circuit_drawer
関数からは文字列が返されるので、それをprint
してみるとこのような結果になります。
\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が開発されています。scikit-qulacsに実装されている量子回路をqulacs-visualizerで描画した例をここから見ることが出来ます。
その他のオプション
それぞれの描画方法で利用できるオプションについて紹介していきます。これらのオプションについては、ドキュメントでも説明しています。
テキストベースでの描画方法
テキストベースでの描画では、CNOTゲートの制御ビットを示す●
によって、描画が崩れる場合があります。この場合は代わりのテキストとして.
を利用することができます。
これは、キーワード引数dot="small"
を渡します。デフォルトはdot="large"
が指定されています。
circuit_drawer(circuit, output_method='text', dot="small")
Matplotlibを利用した描画方法
生成された量子回路の画像サイズを調整することができます。これは、キーワード引数dpi
とscale
を利用します。
ほとんどの場合scale
を使って調整すれば問題ありませんが、今の見た目のまま画像の解像度を調整したい場合はdpi
を調整してください。
デフォルトはdpi=72
、scale=0.6
が指定されています。
circuit_drawer(circuit, output_method='mpl', dpi=72, scale=0.6)
LaTeXを利用した描画方法
Matplotlibを利用した描画方法と同様に、LaTeXを利用した場合にも画像サイズを調整することが出来ます。これは、キーワード引数ppi
を利用します1。
デフォルトはppi=150
が指定されています。
circuit_drawer(circuit, output_method='latex', ppi=150)
LaTeX + Python環境が利用できるDev Container環境
ローカル環境にLaTeXが無い場合に利用できるDev Container環境がリポジトリ内に含まれています。ライブラリの開発環境、動作確認環境としても利用されているものです。
qulacs-visualizerのLaTeXを利用した描画方法を利用したい場合などに、活用してください。
Dev Container環境内はnon-GUI環境として扱われます。Matplotlib、LaTeXを利用した描画方法を利用する場合はJupyter Notebookを利用してください。
以下の手順で使います。
- リポジトリをクローンします。
git clone https://github.com/Qulacs-Osaka/qulacs-visualizer.git
- VSCodeからDev Container環境としてプロジェクトを開きます。
- Pythonの依存パッケージをインストールします。VSCode上でJupyter Notebookのファイルを編集したり実行したりするために、追加で
ipykernel
パッケージをインストールする必要があります。poetry install poetry add ipykernel
- Notebookファイル(例えば
notebook.ipynb
)を作成し、Pythonカーネルとして.venv/bin/python
を指定します。 - Notebook上で量子回路を描画するプログラムを作成し、実行します。
さいごに
Qulacsを利用して構成した量子回路を、視覚的に描画するためのライブラリであるqulacs-visualizerを紹介しました。Qulacsを利用した量子計算研究などで役立てていただければ嬉しいです。
また、ライブラリを利用する中で、バグや改善してほしいところなどあればお気軽にIssueで報告していただければ嬉しいです。
明日は、@SatoshiTerasakiさんの「アヤメデータセットの分類を skqulacs で行う (in Julia)」です。お楽しみに〜!
-
PDFから画像を生成するために利用している
pdftocairo
で画像サイズを変更しています。このpdftocairo
の指定の仕方がppiであるため、Matplotlibとは異なるオプションになっています。 ↩