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


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

[CQC公式](https://cambridgequantum.com/)
[pytket公式](https://cqcl.github.io/pytket/build/html/index.html)

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

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

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

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

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

```python
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のアカウント情報を取っておかないと、この先が実行できません。**

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

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

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

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

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

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

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

```python
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]

```python
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忘れでした・・・）

```python
from pytket.utils import Graph
G = Graph(c)
G.get_DAG()
```
としますと、出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/bad28819-370f-ab8d-b801-46cdc43e6319.png)
うーん、ちょっとごちゃごちゃして見えますね。
pytket(の更に下にあるtket)では、圏論的量子力学に基づくZX-calculusなるものが動いているらしいのです。
なのでこの図はZX-calculusで量子回路を表示したものなのかな？

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

```python
pip install pylatexenc #プログラムの序盤でinstallしておかないとうまくいきません！ qiskitと同時に入れるといいです
from pytket.qiskit import tk_to_qiskit
tk_to_qiskit(c).draw('mpl')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/b5b2b455-84db-8a87-de0e-227e7942d77b.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することはできると思います