CQC製 pytket を使ってIBM実機実行


こんにちは。Kumaです。
Qiitaでは初投稿です。
この記事では、Qiita(Markdown記法)の練習も兼ねて、
CQC(Cambridge quantum computing)の作っているオープンライブラリ pytketを使ってみたいと思います。

CQC公式
pytket公式

pytketはHW無依存な設計らしいので、他の量子コンピュータでもコマンドが変わらない(バックエンドだけを切り替えればいい)らしいです。

残念ながら、公式のチュートリアルは情報が一部古かったり、行間が存在して直接実行できなかったりするようでした。
しかも、日本語の資料が全然見つかりません。。
そこも補間していきます。1
この記事ではGoogle Colab. 上で動作を確認しています。

インストール

pip install pytket #pytketインストール
pip install qiskit #qiskitインストール
pip install pytket-qiskit #pytketとqiskitのconnectorをインストール

公式では、 qiskitのインストールが記載されていませんが、ここで入れておきます

量子回路

量子回路を書いていきます。一番簡単なBell状態の生成回路(2量子ビット)を作ります。
HゲートとCNOTを使います。

from pytket import Circuit
c = Circuit(2,2) # define a circuit with 2 qubits and 2 bits
c.H(0)           # add a Hadamard gate to qubit 0
c.CX(0,1)        # add a CX gate with control qubit 0 and target qubit 1
c.measure_all()  # measure qubits 0 and 1, recording the results in bits 0 and 1

測定すると、00か11しか出ないはずです。

QiskitでIBMQアカウントをロード

ここが重要なポイントです。公式のチュートリアルには書いてない(or見つかりづらい?)ですが、
qiskitを使ってIBMQのアカウント情報を取っておかないと、この先が実行できません。

from qiskit import IBMQ  #ここでqiskitのインストールが要求されます
IBMQ.save_account('Your token ID',overwrite = True) #Your token ID にはご自身のIBMQアカウントのtokenを。
provider = IBMQ.load_account() 

pytket上でバックエンドを定義

from pytket.backends.ibm import IBMQBackend
b = IBMQBackend("ibmqx2")

とすると、ibmqx2実機が使えます。
前述のIBMQアカウントをやっておかないと、ここで弾かれます。

なお、シミュレーターを使いたい場合は以下の通り。

from pytket.backends.ibm import AerBackend
b = AerBackend()

測定する

回路をコンパイルした後に、測定します。

b.compile_circuit(c)        # performs the minimal compilation to satisfy the device/simulator constraints
handle = b.process_circuit(c, 1024)   # run the circuit 1024 times

結果を取り出すには、たとえば以下の呪文で。2

from pytket.utils import probs_from_counts
print(probs_from_counts(b.get_result(handle).get_counts())) # retrieve and return the readouts

probs_from_counts以外にも、公式のAPIリファレンスをみると、色々書いてあります。
ありますが、現バージョンでは既に削除されているものもあります。。
例えば、pytket.utils.Graph は存在しなくなっています。(qiskitの .draw に相当する機能?)3

2020/12/21追記
pytket.utils.Graphはちゃんとありました。(私のimport忘れでした・・・)

from pytket.utils import Graph
G = Graph(c)
G.get_DAG()

としますと、出ます。

うーん、ちょっとごちゃごちゃして見えますね。
pytket(の更に下にあるtket)では、圏論的量子力学に基づくZX-calculusなるものが動いているらしいのです。
なのでこの図はZX-calculusで量子回路を表示したものなのかな?

ちなみにqiskitの可視化機能も使えますよ。
回路をpytket表現からqiskit表現に変えるだけです。変えた後に.draw で。

pip install pylatexenc #プログラムの序盤でinstallしておかないとうまくいきません! qiskitと同時に入れるといいです
from pytket.qiskit import tk_to_qiskit
tk_to_qiskit(c).draw('mpl')

結果

シミュレーターの場合は、
{(0, 0): 0.53125, (1, 1): 0.46875}
でした。
ibmqx2の場合は、
{(0, 0): 0.4169921875, (0, 1): 0.091796875, (1, 0): 0.4501953125, (1, 1): 0.041015625}
でした。雑音の影響で、出るはずのない01と10が出ていますね。

ともあれ、ちゃんと動いていそうです。

結論

確かにpytketから(ほぼqiskitを使わず)IBMの実機が動かせました。
pytketはHW無依存な設計らしいので、他の量子コンピュータでもコマンドが変わらない(バックエンドだけを切り替えればいい)らしいです。
でも、無料で使える実機がIBMQしかない現状では、趣味でやっているだけの私にはあまり恩恵がないような。
次はqulacsも操作してみたいと思います。


  1. やってみたレベルなので、レベルは期待しないでください。 

  2. ちなみに、qiskitと違って、回路に測定操作を入れるのを忘れる(measure_allを忘れる)と、「測定がない回路だよ!」という警告メッセージが出ます。ちょっと親切。 

  3. 最悪、pytketで書いた回路をqiskitへ変換する関数があるようなので、qiskitに持っていって.drawすることはできると思います