LoginSignup
15
4

More than 1 year has passed since last update.

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

Posted at

この記事は量子コンピューター Advent Calendar 2022 6日目の記事です。5日目は@forest1040さんのQulacs新機能の紹介でした。

はじめに

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

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

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

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

Screenshot_2022-11-26-03_939x1000.png

使い方

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を利用して描画すると、このようになります。

image.png

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

LaTeXを利用した描画方法

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

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

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

そのため、LaTeXを利用した描画方法では、利用するPC環境にLaTeX, Popplerをインストールしておく必要があることに注意してください。

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

image.png

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を利用した描画方法

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

以下の手順で使います。

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

さいごに

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

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

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

15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4