5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-17

こんにちは。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()

としますと、出ます。
image.png
うーん、ちょっとごちゃごちゃして見えますね。
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')

image.png

結果

シミュレーターの場合は、
{(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することはできると思います

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?