量子コンピューター Advent CalendarとひとりAdvent Calendar 3日目の記事です。
別の記事を予定していたのですが、面白そうなネタを見つけたのでこちらに変えました。Q#で書いた量子アルゴリズムを、Q#側は変更せずにIBM Qで動かそうというものです。
Quantum/Samples/src/Qiskit at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
IBM QはIBMの提供する量子コンピューターの実機で、なんと無料でお試しすることができます。アカウントの作成から実行まではこの記事がわかりやすいと思います。
アカウントを作ったらこのページにアクセスしてAPIキーを取得しておきます。
quantumexperience.ng.bluemix.net
こんな画面です。この左上のibmqx4
という実機にアクセスするので、ここにmaintenanceなどの表示があるときは使えません。
実行する場合ですが、IBM QのためのPython製SDKIBMQuantumExperience
を使うため、Python3がインストールされていないといけません。また、このライブラリの既知の問題からWindowsのPythonでは動かないらしくWindowsの場合はWSL上のPythonを使うことをすすめられています。今回はFedoraを使っています。SDKのインストールはpipを使います。requirements.txt
がありますがフォーマットが違うっぽいので、フォーマット変更して使うか、下記コマンドで直接指定してインストールします。
$ pip3 install IBMQuantumExperience --user
取得したAPIキーはDriver.cs
の該当行に記入しておきます。
Quantum/Driver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
あとはこのディレクトリに移動して、dotnet run
を実行するとIBM Qに問い合わせて実行されます。
maintenance状態の場合はstatue code 403が帰ってきます。
実行されているQ#のコードはこのプロジェクトではなく、参照しているこちらのQ#コードを実行しています。
Quantum/Measurement.qs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
簡単に実行できたので、なぜこんなことができるのかを調べてみましょう。
Q#は量子プログラミングの為の言語ですが、実際にはC#のコードから実行します。C#のコードでは、Q#で書かれたアルゴリズムをターゲットとなる量子コンピューターに送信して実行してもらい結果を受け取ります。
画像は以下のドキュメントからリンク。 Software stack | Microsoft Docs
まだMicrosoftは実機を一般提供していないため、ローカルコンピューターで実行できるシミュレーターを提供しています。Q#の特徴として、Q#のコードが実行される場所が実機の場合でもシミュレーターの場合でもQ#側はそのままに、Driverと呼ばれるクラスを差し替えれば動くようにすることが挙げられます。
今回はそのDriverクラスをIBM Q向けに実装しているということになります。IBM QのSDKはQISKitですが、量子アルゴリズムの記述にOpenQASM (量子アセンブリ言語)をつかっています。IBM Qは量子アルゴリズムのためにグラフィカルなエディタを用意していますが、最終的にOpenQASMで記述されているようです。日本語ではこの記事がわかりやすかったです。
OpenQASMそのものについては論文が公開されています。
[1707.03429] Open Quantum Assembly Language
Driver.csを見ると、IbmQx4
が実行しているDriverクラスです。このクラスはQiskitDriver
を継承していて、実機のパラメーターのみを定義しています。次にQiskitDriverを見ると、抽象クラスOpenQasmDriver
を継承していて、ほとんどの処理はOpenQasmDriver側に書かれていることがわかります。
Quantum/IbmQx4.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
Quantum/QiskitDriver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
Quantum/OpenQasmDriver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
これを読むと、OpenQASMがテキストベースなので、Q#のoperationをひとつずつOpenQASMのコマンド文字列として出力しています。コマンドを実行する部分は抽象メソッドRunQasm
でQiskitDriverが実装しています。これによると入力コマンドをinput.txt
に出力して、QiskitInterface.py
というPythonのコードをpython3コマンドで実行しています。このPythonコードでIBM Qへの問い合わせを行い、output.txt
を読み取っています。
Quantum/QiskitInterface.py at release/v0.3.1811.203 · Microsoft/Quantum · GitHub
Quick and dirty Simulatorbase
とコメントに書いているのと、実装されていない部分もあるのでこのまま全部いけるかはまだわかりませんが、Q#のコンセプトとして、Microsoftの量子コンピューター以外でも動くことができるという一例になっているのではないでしょうか。