量子コンピュータの量子回路をJSON化する
最近量子回路をウェブのUIで利用する機会が増えてきました。
blueqatの新バージョン0.4.6で量子回路のJSON化できる機能が追加されたみたいなので見てみたいと思います。
まずは、普通に回路を作ってみます。GHZという回路を作ってみます。
from blueqat import Circuit
a = Circuit().h[0].cx[0,1].cx[1,2]
a.m[:].run(shots=100)
Counter({'111': 56, '000': 44})
このように000と111と答えがでました。これをそのままJSONにしてみます。
from blueqat.circuit_funcs import json_serializer
json_serializer.serialize(a)
{'schema': {'name': 'blueqat-circuit', 'version': '1'},
'n_qubits': 3,
'ops': [{'name': 'h', 'params': [], 'targets': [0]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'measure', 'params': [], 'targets': [0]},
{'name': 'measure', 'params': [], 'targets': [1]},
{'name': 'measure', 'params': [], 'targets': [2]}]}
いい感じですね。続いてQAOAもやってみます。
QAOAの量子回路をJSON化する
続いて、QAOAの回路もJSONにしてみます。
from blueqat import vqe
from blueqat.pauli import qubo_bit as q
hamiltonian = -3*q(0)-3*q(1)-3*q(2)-3*q(3)-3*q(4)+2*q(0)*q(1)+2*q(0)*q(2)+2*q(0)*q(3)+2*q(0)*q(4)+2*q(1)*q(2)+2*q(1)*q(3)+2*q(1)*q(4)+2*q(2)*q(3)+2*q(2)*q(4)+2*q(3)*q(4)
step = 2
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
print(result.most_common(12))
(((0, 1, 0, 0, 1), 0.0731599141347431), ((1, 0, 0, 0, 1), 0.07315991413474307), ((0, 1, 1, 0, 0), 0.07315991413474306), ((0, 1, 0, 1, 0), 0.07315991413474306), ((0, 0, 1, 1, 0), 0.07315991413474306), ((0, 0, 1, 0, 1), 0.07315991413474306), ((0, 0, 0, 1, 1), 0.07315991413474306), ((1, 0, 1, 0, 0), 0.07315991413474303), ((1, 0, 0, 1, 0), 0.07315991413474303), ((1, 1, 0, 0, 0), 0.07315991413474299), ((1, 1, 0, 0, 1), 0.016525308363087545), ((0, 1, 1, 1, 0), 0.01652530836308754))
json_serializer.serialize(result.circuit)
{'schema': {'name': 'blueqat-circuit', 'version': '1'},
'n_qubits': 5,
'ops': [{'name': 'h', 'params': [], 'targets': [0]},
{'name': 'h', 'params': [], 'targets': [1]},
{'name': 'h', 'params': [], 'targets': [2]},
{'name': 'h', 'params': [], 'targets': [3]},
{'name': 'h', 'params': [], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [1]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'cx', 'params': [], 'targets': [0, 3]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [0, 3]},
{'name': 'cx', 'params': [], 'targets': [0, 4]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [0, 4]},
{'name': 'rz', 'params': [6.051465271712881], 'targets': [0]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'cx', 'params': [], 'targets': [1, 3]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [1, 3]},
{'name': 'cx', 'params': [], 'targets': [1, 4]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [1, 4]},
{'name': 'rz', 'params': [6.051465271712881], 'targets': [1]},
{'name': 'cx', 'params': [], 'targets': [2, 3]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [2, 3]},
{'name': 'cx', 'params': [], 'targets': [2, 4]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [2, 4]},
{'name': 'rz', 'params': [6.051465271712881], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [3, 4]},
{'name': 'rz', 'params': [-6.051465271712881], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [3, 4]},
{'name': 'rz', 'params': [6.051465271712881], 'targets': [3]},
{'name': 'rz', 'params': [6.051465271712881], 'targets': [4]},
{'name': 'rx', 'params': [5.043183193995812], 'targets': [0]},
{'name': 'rx', 'params': [5.043183193995812], 'targets': [1]},
{'name': 'rx', 'params': [5.043183193995812], 'targets': [2]},
{'name': 'rx', 'params': [5.043183193995812], 'targets': [3]},
{'name': 'rx', 'params': [5.043183193995812], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [1]},
{'name': 'cx', 'params': [], 'targets': [0, 1]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [0, 2]},
{'name': 'cx', 'params': [], 'targets': [0, 3]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [0, 3]},
{'name': 'cx', 'params': [], 'targets': [0, 4]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [0, 4]},
{'name': 'rz', 'params': [12.818051168284407], 'targets': [0]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [1, 2]},
{'name': 'cx', 'params': [], 'targets': [1, 3]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [1, 3]},
{'name': 'cx', 'params': [], 'targets': [1, 4]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [1, 4]},
{'name': 'rz', 'params': [12.818051168284407], 'targets': [1]},
{'name': 'cx', 'params': [], 'targets': [2, 3]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [3]},
{'name': 'cx', 'params': [], 'targets': [2, 3]},
{'name': 'cx', 'params': [], 'targets': [2, 4]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [2, 4]},
{'name': 'rz', 'params': [12.818051168284407], 'targets': [2]},
{'name': 'cx', 'params': [], 'targets': [3, 4]},
{'name': 'rz', 'params': [-12.818051168284407], 'targets': [4]},
{'name': 'cx', 'params': [], 'targets': [3, 4]},
{'name': 'rz', 'params': [12.818051168284407], 'targets': [3]},
{'name': 'rz', 'params': [12.818051168284407], 'targets': [4]},
{'name': 'rx', 'params': [0.4581402395326511], 'targets': [0]},
{'name': 'rx', 'params': [0.4581402395326511], 'targets': [1]},
{'name': 'rx', 'params': [0.4581402395326511], 'targets': [2]},
{'name': 'rx', 'params': [0.4581402395326511], 'targets': [3]},
{'name': 'rx', 'params': [0.4581402395326511], 'targets': [4]}]}
このようにパラメータ付きで変分量子回路がJSON化できました。