CQC製 pytket を使ってIBM実機実行
こんにちは。Kumaです。
Qiitaでは初投稿です。
この記事では、Qiita(Markdown記法)の練習も兼ねて、
CQC(Cambridge quantum computing)の作っているオープンライブラリ pytketを使ってみたいと思います。
pytketはHW無依存な設計らしいので、他の量子コンピュータでもコマンドが変わらない(バックエンドだけを切り替えればいい)らしいです。
残念ながら、公式のチュートリアルは情報が一部古かったり、行間が存在して直接実行できなかったりするようでした。
しかも、日本語の資料が全然見つかりません。。
そこも補間していきます。1
この記事ではGoogle Colab. 上で動作を確認しています。
インストール
pip install pytket #pytketインストール
pip install qiskit #qiskitインストール
pip install pytket-qiskit #pytketとqiskitのconnectorをインストール
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")
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
も操作してみたいと思います。
Author And Source
この問題について(CQC製 pytket を使ってIBM実機実行), 我々は、より多くの情報をここで見つけました https://qiita.com/notori48/items/62101d7545e71adcb8fb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .