blueqatで量子回路をjsonで取り出す
量子回路をjsonで取り出し、フロントのGUIと接続するためのjsonモジュールの使い方を見ます。関数が準備されています。
json_serializer.serialize()で量子回路を囲みます。
from blueqat import Circuit
from blueqat.circuit_funcs import json_serializer
json_serializer.serialize(Circuit().h[0].cx[0,1].cx[1,2].cx[2,3].h[4])
{'schema': {'name': 'blueqat-circuit', 'version': '1'},
'n_qubits': 5,
'ops': [{'name': 'h', 'params': [], 'targets': [0]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'cx', 'params': [], 'targets': [2, 3]},
{'name': 'h', 'params': [], 'targets': [4]}]}
上記の回路では、それぞれ量子ゲートごとの回路がjsonに分解されました。これで終わりなのですが、せっかくなのでQAOAの組合せ最適化の回路をjson化してみたいと思います。QAOAモジュールを使います。
まずは普通のQAOAをハミルトニアンから作ります。内容の説明は割愛します。
from blueqat.pauli import Z
from blueqat import vqe
hamiltonian = Z[0]*Z[1] + Z[1]*Z[2] + Z[2]*Z[0]
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, 1)).run()
print(result.most_common(12))
(((1, 0, 0), 0.1571013664707446), ((0, 1, 1), 0.1571013664707446), ((0, 1, 0), 0.15710136647074457), ((1, 1, 0), 0.15710136647074457), ((0, 0, 1), 0.15710136647074457), ((1, 0, 1), 0.15710136647074457), ((0, 0, 0), 0.028695900587766054), ((1, 1, 1), 0.028695900587766054))
そして、jsonへはこの回路を使ってみると、
json_serializer.serialize(result.circuit)
{'schema': {'name': 'blueqat-circuit', 'version': '1'},
'n_qubits': 3,
'ops': [{'name': 'h', 'params': [], 'targets': [0]},
{'name': 'h', 'params': [], 'targets': [1]},
{'name': 'h', 'params': [], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'rz', 'params': [-49.769282051402904], 'targets': [1]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'rz', 'params': [-49.769282051402904], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'rz', 'params': [-49.769282051402904], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'rx', 'params': [2.214185410129439], 'targets': [0]},
{'name': 'rx', 'params': [2.214185410129439], 'targets': [1]},
{'name': 'rx', 'params': [2.214185410129439], 'targets': [2]}]}
こうなりました。回路に今回はパラメータも入りわかりやすいですね。以上です。