PythonからQ#を使ってみる

概要

Q#はMicrosoftが開発している量子プログラミングライブラリです. 通常のQ#は.NETを使用してC#のプログラムとしてコンパイルして使用しますが,PythonのライブラリとしてQ#を利用できるものも提供されています. 今回はそのライブラリを使用してPythonからQ#のコードを呼び出して実行してみます.

事前準備

PythonのQ#ライブラリを使用するには以下の要件を満たしている必要があります.

  • .NET Core SDK 2.1.3以上
  • Python 3.6
  • IQ# kernel

.NET Core SDKは以下からダウンロードできます.

dotnet.microsoft.com

Pythonの利用環境は自分自身が慣れている環境のものを利用して大丈夫です. 例としてAnacondaを利用してPython環境を用意する場合は以下を参考にして下さい.

www.anaconda.com

IQ# kernelをインストールするには,.NETをインストールした状態で以下のコマンドを実行します.

$ dotnet tool install -g Microsoft.Quantum.IQSharp
$ dotnet iqsharp install

PythonのQ#パッケージをインストール

pipを使用してインストール

pipを使用してインストールする場合は以下のコマンドでインストールできます.

$ pip install qsharp

ソースからインストール

GitHubで公開されているソースから直接インストールする場合は,以下のようにソースをGitHubからcloneしてきてインストールします.

$ git clone git@github.com:Microsoft/QuantumLibraries.git
$ cd QuantumLibraries/Interoperability/python/src/
$ python setup.py install

Q#のコードを用意

Pythonから呼び出すQ#のコードを記述します. どのようなQ#のコードでも良いのですが,今回は例として以下のようなBell状態を作成して測定するQ#のコードを実行してみます.

namespace QsharpPython.Sample
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

    operation MeasureBellState() : Result[]
    {
        mutable results = new Result[2];
        Message("Make Bell state.");
        using (q = Qubit[2]) {
            H(q[0]);
            CNOT(q[0], q[1]);
            Message("Measure qubits.");
            for (i in 0..1) {
                set results[i] = M(q[i]);
            }
            ResetAll(q);
        }

        return results;
    }
}

動作していることがわかりやすいようにBell状態を作成する時と測定を行う時にログを出力するようにしています. このコードは以下の回路と同等の操作を実行します. f:id:kadora:20190306220330p:plain

PythonからQ#を呼び出す

それでは用意したQ#のコードを実際にPythonから呼び出してみます. 今回は単純にPythonからQ#のコードを呼び出して実行するだけのものを書くのでPython側のコードはそれほど長くありません.

import qsharp
from QsharpPython.Sample import MeasureBellState

def main():
    results = MeasureBellState.simulate()
    print("Measurement results:")
    print(results)

if __name__ == "__main__":
    main()

まずPythonのQ#パッケージを利用するためにqsharpをimportします. するとqsharpパッケージは実行しているフォルダ内の.qsファイルを自動で読み込むのでQ#のコードが使用できるようになります.

その後,Q#のコード内で定義したOperationをPythonで使用するためにOperationをimportします. この時の名前空間やOperation名はQ#のコード内で記述しているものに対応させます.

Q#のoperationを実行するには,simulateメソッドを呼び出すことで実行できます. Q#内でのoperationの定義に返り値が定義されていれば返り値を受け取ってPythonのコード内で使用できます.

それでは実際に実行してみましょう.実行すると以下のようになります.

$ python QsharpPythonSample.py
Make Bell state.
Measure qubits.
Measurement results:
[0, 0]

何度か繰り返して実行すると,最後に出力している測定結果が[0, 0][1, 1]のいずれかがランダムで返ってきていて[0, 1][1, 0]は返ってこないので確かにBell状態を作成して測定した結果が返ってきていることがわかりPythonからQ#のコードが実行されていることがわかります.

PythonからQ#のコードが呼べる利点

ここまでPythonからQ#のコードを呼び出す方法を見てきましたがPythonからQ#のコードが呼べる利点はなんでしょうか. 1つの利点としてPythonの資産をそのまま利用して量子アルゴリズムのシミュレーションができるということがあります.

現在盛んに研究されている量子アルゴリズムに,古典量子ハイブリッドアルゴリズムがあります. このアルゴリズムでは,古典計算で十分計算できる部分は古典計算を行い,量子計算を行う部分では量子計算を行うといったように古典計算と量子計算を混ぜて実行されるアルゴリズムです. この古典計算を行う部分において,Pythonにはかなり色々なライブラリが用意されているのでそれをそのまま使えるというのは非常に大きな利点となります. 既に存在する古典計算のライブラリと量子計算用のQ#のライブラリを合わせて使用することで,より一層古典量子ハイブリッドアルゴリズムのシミュレーションが行いやすくなりこの分野の発展に役立つのではないでしょうか.

参考

今回実行したコードは以下のリポジトリに配置してあります.

github.com

また,Q#公式ドキュメントのPythonからの使用法は以下になります.

docs.microsoft.com

パッケージ自体のソースコードは以下です.

github.com