今後は大きな量子回路をJuliaで描画したいです!今回はネットワークグラフ形式で書いてみます。
Juliaでグラフ描画
こちらを使います。
https://github.com/JuliaGraphs/GraphPlot.jl
ツール読み込み
まずはこの辺りを読み込みます。
import Pkg; Pkg.add(["LightGraphs", "GraphPlot", "Colors"])
using LightGraphs, GraphPlot, Colors
手作業
今回はまだJulia製の量子コンピュータシミュレータがないので、手作業で実装していきます。今回は量子機械学習で利用されるQCBM回路を書いてみます。
g = Graph()
#5量子ビット、RX,RZをかけた後にループ状にCXをかける回路を想定する。全部でベクトル5つ、RX,RZのゲートを5つずつ合計10。CXを5つですが、コントロールビットとターゲットビットで合計10、あとは測定で5。全部で30ノード。
add_vertices!(g, 30)
次に、ラベルを設定します。手作業で申し訳ない。。。
q = "q"
rx = "RX"
rz = "RZ"
c = "C"
x = "X"
m = ""
ノードにラベルとグループを割り当て、同一グループには同じ色を割り当てます。
nodelabel = [q,q,q,q,q, rx,rx,rx,rx,rx, rz,rz,rz,rz,rz, c,c,c,c,c, x,x,x,x,x, m,m,m,m,m]
nodegroup = [1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3, 4,4,4,4,4, 4,4,4,4,4, 5,5,5,5,5]
nodecolor = [colorant"lightseagreen", colorant"orange", colorant"skyblue", colorant"yellow", colorant"purple"]
nodefillc = nodecolor[nodegroup]
本当は自動でやりたいのですが、量子回路の量子ビットやゲート同士をつなぎます。今回はエッジで手作業で繋ぎました。。。
add_edge!(g, 1, 6)
add_edge!(g, 2, 7)
add_edge!(g, 3, 8)
add_edge!(g, 4, 9)
add_edge!(g, 5, 10)
add_edge!(g, 6, 11)
add_edge!(g, 7, 12)
add_edge!(g, 8, 13)
add_edge!(g, 9, 14)
add_edge!(g, 10, 15)
add_edge!(g, 11, 16)
add_edge!(g, 12, 21)
add_edge!(g, 16, 21)
add_edge!(g, 21, 17)
add_edge!(g, 13, 22)
add_edge!(g, 17, 22)
add_edge!(g, 22, 18)
add_edge!(g, 14, 23)
add_edge!(g, 18, 23)
add_edge!(g, 23, 19)
add_edge!(g, 15, 24)
add_edge!(g, 19, 24)
add_edge!(g, 24, 20)
add_edge!(g, 16, 25)
add_edge!(g, 20, 25)
add_edge!(g, 25, 26)
add_edge!(g, 17, 27)
add_edge!(g, 18, 28)
add_edge!(g, 19, 29)
add_edge!(g, 20, 30)
そして、最後に書き出しです。これで完了です!
gplot(g, layout=spectral_layout, nodelabel=nodelabel, nodefillc=nodefillc)
できました!
量子ビットqからRX,RZと1量子ビットゲートがかかり、そこからループ状のCXに入って、紫の測定に行きますが、ちょっとわかりにくいかもしれませんね、、、ノード間の距離を一定にするとか工夫が必要そうです。今回はJuliaを使って量子回路の描画の目処が立ったので、今後ツール化して行きたいと思います。以上です!