Skip to content

qadence.draw example plots

Mostly for quick, manual checking of correct plotting output.

from qadence import X, Y, kron
from qadence.draw import display

b = kron(X(0), Y(1))
5f60846c36294c4d9639b1d0e367ca7f 0 35419c03df4b4668a36c3338ea80224a X 5f60846c36294c4d9639b1d0e367ca7f--35419c03df4b4668a36c3338ea80224a 9171f33608a345dfbf8dbee0e19f8800 1 b38b11a73b644258bfbe1c2947b4b1e1 35419c03df4b4668a36c3338ea80224a--b38b11a73b644258bfbe1c2947b4b1e1 9ea1adfcf5d84297906968af948722b0 43eeb57700994cf199610e35d9cd4c84 Y 9171f33608a345dfbf8dbee0e19f8800--43eeb57700994cf199610e35d9cd4c84 43eeb57700994cf199610e35d9cd4c84--9ea1adfcf5d84297906968af948722b0
from qadence import X, Y, chain
from qadence.draw import display

b = chain(X(0), Y(0))
8f3851ca88e442c2a46a4ebaa2f7b927 0 bed6f090262941878ba3f767f7a8325d X 8f3851ca88e442c2a46a4ebaa2f7b927--bed6f090262941878ba3f767f7a8325d 99a09de456aa44d39349e1595e58dca9 Y bed6f090262941878ba3f767f7a8325d--99a09de456aa44d39349e1595e58dca9 5664639013824a6d80294a259abe36f5 99a09de456aa44d39349e1595e58dca9--5664639013824a6d80294a259abe36f5
from qadence import X, Y, chain
from qadence.draw import display

b = chain(X(0), Y(1))
3d99dff7fd0941c3bde1c9ec8d70b592 0 daf19fb25a1b4e69b388915b5331280d X 3d99dff7fd0941c3bde1c9ec8d70b592--daf19fb25a1b4e69b388915b5331280d 76ecf2eaed20401e9bb3dfc280066d4c 1 4ce75897427f45f9b06f02d4245f1a30 daf19fb25a1b4e69b388915b5331280d--4ce75897427f45f9b06f02d4245f1a30 e633c38232184fa0926839e7c9a291c5 4ce75897427f45f9b06f02d4245f1a30--e633c38232184fa0926839e7c9a291c5 450cc21713ab471bbd96508dbcc9f12e 53b475f3fe584553be7174027e0839e8 76ecf2eaed20401e9bb3dfc280066d4c--53b475f3fe584553be7174027e0839e8 8a50a88bfb634083ad718ef2b0bd170c Y 53b475f3fe584553be7174027e0839e8--8a50a88bfb634083ad718ef2b0bd170c 8a50a88bfb634083ad718ef2b0bd170c--450cc21713ab471bbd96508dbcc9f12e
from qadence import X, Y, add
from qadence.draw import display

b = add(X(0), Y(1), X(2))
cluster_39dc629050d54899b0b2441ff350066a 004a95ee6694469690ff205774400169 0 1918881005834353818e0b8a444e70c7 004a95ee6694469690ff205774400169--1918881005834353818e0b8a444e70c7 b369008b195943a0a76e86ef69d94834 1 4731f981537d4bc58b8686414630684b 1918881005834353818e0b8a444e70c7--4731f981537d4bc58b8686414630684b 7065750408664bf6ad4cf9c505f56b61 1d7bf52a4c4c47ed8ad6701c5121b52e AddBlock b369008b195943a0a76e86ef69d94834--1d7bf52a4c4c47ed8ad6701c5121b52e 5a7698c72e29480fabdcfef84c1b6623 2 1d7bf52a4c4c47ed8ad6701c5121b52e--7065750408664bf6ad4cf9c505f56b61 e192e579c6064d109b78ff22b42330df d47f2c6b94eb4cefa61c9517284c49e8 5a7698c72e29480fabdcfef84c1b6623--d47f2c6b94eb4cefa61c9517284c49e8 d47f2c6b94eb4cefa61c9517284c49e8--e192e579c6064d109b78ff22b42330df
from qadence import CNOT, RX, HamEvo, X, Y, Z, chain, kron

rx = kron(RX(3,0.5), RX(2, "x"))
rx.tag = "rx"
gen = chain(Z(i) for i in range(4))

# `chain` puts things in sequence
block = chain(
    kron(X(0), Y(1), rx),
    CNOT(2,3),
    HamEvo(gen, 10)
)
cluster_d608002531384bca961187172ee5a53b cluster_47c517cc17394475ba0be81692b80d69 rx 19fd21ae23cb47738bd532c7e66f6684 0 44c5d37545114412ade50cb779fab064 X 19fd21ae23cb47738bd532c7e66f6684--44c5d37545114412ade50cb779fab064 aeacaf38aee04962b2166af58e2ea783 1 cfcb8a715edb4186b1d08f7586980fa1 44c5d37545114412ade50cb779fab064--cfcb8a715edb4186b1d08f7586980fa1 d8a298865d9c4b81bb515a2f2d7ec9a2 cfcb8a715edb4186b1d08f7586980fa1--d8a298865d9c4b81bb515a2f2d7ec9a2 e1cc402bc3904a64bb0b4aeef2c9d201 d8a298865d9c4b81bb515a2f2d7ec9a2--e1cc402bc3904a64bb0b4aeef2c9d201 f6adf401d7e74cbc9e44042b874382b8 b83608fbf84e477c84caaed8ad0fa900 Y aeacaf38aee04962b2166af58e2ea783--b83608fbf84e477c84caaed8ad0fa900 622fde9b791340d5a33a173c606f5965 2 3956e70a878a4fc4bf1010d6b8e763b7 b83608fbf84e477c84caaed8ad0fa900--3956e70a878a4fc4bf1010d6b8e763b7 8ed659fccceb4f9fa088d7fccce1013c HamEvo 3956e70a878a4fc4bf1010d6b8e763b7--8ed659fccceb4f9fa088d7fccce1013c 8ed659fccceb4f9fa088d7fccce1013c--f6adf401d7e74cbc9e44042b874382b8 dece4f7e601f4f069c66ffa18aa3d857 1fab4a8455704c179139bdb5949f81aa RX(x) 622fde9b791340d5a33a173c606f5965--1fab4a8455704c179139bdb5949f81aa 3bd3bf28405f42db9e8dc79c39ceebb8 3 c103b872bfed4c94bfe6347f6bccf666 1fab4a8455704c179139bdb5949f81aa--c103b872bfed4c94bfe6347f6bccf666 1b5f16149a15444185d9a3a925b9ec7e t = 10 c103b872bfed4c94bfe6347f6bccf666--1b5f16149a15444185d9a3a925b9ec7e 1b5f16149a15444185d9a3a925b9ec7e--dece4f7e601f4f069c66ffa18aa3d857 0af59870773f4db5a27968ff398bdbee f9957c971427425a9ad361f32c773355 RX(0.5) 3bd3bf28405f42db9e8dc79c39ceebb8--f9957c971427425a9ad361f32c773355 1e18c48eff9244e094076b7c2eec355c X f9957c971427425a9ad361f32c773355--1e18c48eff9244e094076b7c2eec355c 1e18c48eff9244e094076b7c2eec355c--c103b872bfed4c94bfe6347f6bccf666 39c3317dec9f4bd99648e4a9675f9467 1e18c48eff9244e094076b7c2eec355c--39c3317dec9f4bd99648e4a9675f9467 39c3317dec9f4bd99648e4a9675f9467--0af59870773f4db5a27968ff398bdbee
from qadence import feature_map, hea, chain

block = chain(feature_map(4, fm_type="tower"), hea(4,2))
cluster_1cb35159772b43fbbd6be94d23266fea HEA cluster_ad3811da735044f0a82115f7c6262066 FM 7dcc7c9203f1472fa767d74fa5245da7 0 e61d8d532eb74b8f92d8bbab3add79ab RX(2*acos(phi)) 7dcc7c9203f1472fa767d74fa5245da7--e61d8d532eb74b8f92d8bbab3add79ab 4afc15421ca34c6e9d44b634761464e4 1 a6e9e7546984411cba25017ec46a95e3 RX(theta₀) e61d8d532eb74b8f92d8bbab3add79ab--a6e9e7546984411cba25017ec46a95e3 a783667742064596ae9fff937ed72d49 RY(theta₄) a6e9e7546984411cba25017ec46a95e3--a783667742064596ae9fff937ed72d49 d328d0d3e31f4a6ebd3aa70e34c685bd RX(theta₈) a783667742064596ae9fff937ed72d49--d328d0d3e31f4a6ebd3aa70e34c685bd b7b19357878a463bb2396a9f589b1218 d328d0d3e31f4a6ebd3aa70e34c685bd--b7b19357878a463bb2396a9f589b1218 b015eab16cd6460bbd8cc53e7f95c0d4 b7b19357878a463bb2396a9f589b1218--b015eab16cd6460bbd8cc53e7f95c0d4 16ae21703e724272b208f6c888e5063b RX(theta₁₂) b015eab16cd6460bbd8cc53e7f95c0d4--16ae21703e724272b208f6c888e5063b 2a67841faed845b0965a3543e4b28b4d RY(theta₁₆) 16ae21703e724272b208f6c888e5063b--2a67841faed845b0965a3543e4b28b4d d8538bfd9b99465d934fff3ab6126fbd RX(theta₂₀) 2a67841faed845b0965a3543e4b28b4d--d8538bfd9b99465d934fff3ab6126fbd c4f50ad0591b42c290bf1608ff2aff65 d8538bfd9b99465d934fff3ab6126fbd--c4f50ad0591b42c290bf1608ff2aff65 0bb2417fa193401fb9ed26828cde79a0 c4f50ad0591b42c290bf1608ff2aff65--0bb2417fa193401fb9ed26828cde79a0 19d49300a0344a52a12b3f55a932af5e 0bb2417fa193401fb9ed26828cde79a0--19d49300a0344a52a12b3f55a932af5e 159d71bdfdc54b33add531616e9378fc 061273e041dc4999956ce53fe60f87f6 RX(4*acos(phi)) 4afc15421ca34c6e9d44b634761464e4--061273e041dc4999956ce53fe60f87f6 8304b965edbd4ca4b8c32766446697ae 2 d0017235959948fbac31aeed9b666840 RX(theta₁) 061273e041dc4999956ce53fe60f87f6--d0017235959948fbac31aeed9b666840 37cd581328274f9ab9d1fb77418c5ded RY(theta₅) d0017235959948fbac31aeed9b666840--37cd581328274f9ab9d1fb77418c5ded fea8a2fe3578414a9f9ad989dc07ae7a RX(theta₉) 37cd581328274f9ab9d1fb77418c5ded--fea8a2fe3578414a9f9ad989dc07ae7a b797b4cce942482b9a0165e4eb1d9868 X fea8a2fe3578414a9f9ad989dc07ae7a--b797b4cce942482b9a0165e4eb1d9868 b797b4cce942482b9a0165e4eb1d9868--b7b19357878a463bb2396a9f589b1218 254680fa93c24c4f9e01512b6fff0b6a b797b4cce942482b9a0165e4eb1d9868--254680fa93c24c4f9e01512b6fff0b6a c5affe58cbba438ea79bb3b14f5528c7 RX(theta₁₃) 254680fa93c24c4f9e01512b6fff0b6a--c5affe58cbba438ea79bb3b14f5528c7 e5152f162ae741edabb4184ec5882dd5 RY(theta₁₇) c5affe58cbba438ea79bb3b14f5528c7--e5152f162ae741edabb4184ec5882dd5 f5aa99c066ff4c83b110d3da4033cd6d RX(theta₂₁) e5152f162ae741edabb4184ec5882dd5--f5aa99c066ff4c83b110d3da4033cd6d 41cea74ad734475f956732707cbebf6f X f5aa99c066ff4c83b110d3da4033cd6d--41cea74ad734475f956732707cbebf6f 41cea74ad734475f956732707cbebf6f--c4f50ad0591b42c290bf1608ff2aff65 016bdc0a43e54c39b86c26d02a4a1029 41cea74ad734475f956732707cbebf6f--016bdc0a43e54c39b86c26d02a4a1029 016bdc0a43e54c39b86c26d02a4a1029--159d71bdfdc54b33add531616e9378fc 884c7cd982e348a8b8e3082636ea3b93 552dec837b13464b8956e6985c7d9789 RX(6*acos(phi)) 8304b965edbd4ca4b8c32766446697ae--552dec837b13464b8956e6985c7d9789 19365b8c20704edda9e3e8c4c0fe738a 3 11d05579793a4813b4293164114e63f6 RX(theta₂) 552dec837b13464b8956e6985c7d9789--11d05579793a4813b4293164114e63f6 7225b1cd38b6440aa08a054d72e89d72 RY(theta₆) 11d05579793a4813b4293164114e63f6--7225b1cd38b6440aa08a054d72e89d72 4d810aa90a8b471b9f70cd06db031112 RX(theta₁₀) 7225b1cd38b6440aa08a054d72e89d72--4d810aa90a8b471b9f70cd06db031112 2ed953d5eea74e92b166b404bfc370f8 4d810aa90a8b471b9f70cd06db031112--2ed953d5eea74e92b166b404bfc370f8 58d8f17451334a03bc677cb51c6765af X 2ed953d5eea74e92b166b404bfc370f8--58d8f17451334a03bc677cb51c6765af 58d8f17451334a03bc677cb51c6765af--254680fa93c24c4f9e01512b6fff0b6a ba0b398a712547349087bf0ef3f1c855 RX(theta₁₄) 58d8f17451334a03bc677cb51c6765af--ba0b398a712547349087bf0ef3f1c855 0a926b80dd454314bb71f3dcba1de025 RY(theta₁₈) ba0b398a712547349087bf0ef3f1c855--0a926b80dd454314bb71f3dcba1de025 2e4b97bcaeba4ca6bf2ec24964d7fd2a RX(theta₂₂) 0a926b80dd454314bb71f3dcba1de025--2e4b97bcaeba4ca6bf2ec24964d7fd2a e4f151c239074a938ea58994a2ec450e 2e4b97bcaeba4ca6bf2ec24964d7fd2a--e4f151c239074a938ea58994a2ec450e e7a517eda7a149f289c2e9326197fdb0 X e4f151c239074a938ea58994a2ec450e--e7a517eda7a149f289c2e9326197fdb0 e7a517eda7a149f289c2e9326197fdb0--016bdc0a43e54c39b86c26d02a4a1029 e7a517eda7a149f289c2e9326197fdb0--884c7cd982e348a8b8e3082636ea3b93 34e4144dbe944139b574fb949da4e789 27dc755c927848c28e0d79332818248f RX(8*acos(phi)) 19365b8c20704edda9e3e8c4c0fe738a--27dc755c927848c28e0d79332818248f 01fa4462f3f54091ac1b58a0fe64a5ff RX(theta₃) 27dc755c927848c28e0d79332818248f--01fa4462f3f54091ac1b58a0fe64a5ff 5d6a33291e8a46d9abf6fe41b7b4d360 RY(theta₇) 01fa4462f3f54091ac1b58a0fe64a5ff--5d6a33291e8a46d9abf6fe41b7b4d360 d9da686ae3e746d4a8ee302052282878 RX(theta₁₁) 5d6a33291e8a46d9abf6fe41b7b4d360--d9da686ae3e746d4a8ee302052282878 b7907e38878a4aa4b5f75a00251a30a5 X d9da686ae3e746d4a8ee302052282878--b7907e38878a4aa4b5f75a00251a30a5 b7907e38878a4aa4b5f75a00251a30a5--2ed953d5eea74e92b166b404bfc370f8 f0adf3bab5c34ada95557afc6f7699e1 b7907e38878a4aa4b5f75a00251a30a5--f0adf3bab5c34ada95557afc6f7699e1 c2ca57f6f4794272a6b74424091cd7da RX(theta₁₅) f0adf3bab5c34ada95557afc6f7699e1--c2ca57f6f4794272a6b74424091cd7da d152bfa4b8064fd08438cedf6aaedc7b RY(theta₁₉) c2ca57f6f4794272a6b74424091cd7da--d152bfa4b8064fd08438cedf6aaedc7b 72fb1a2887b5489c90445fa6f485686c RX(theta₂₃) d152bfa4b8064fd08438cedf6aaedc7b--72fb1a2887b5489c90445fa6f485686c 1d1b537c6c3b4fb3be35d88c1cafe05d X 72fb1a2887b5489c90445fa6f485686c--1d1b537c6c3b4fb3be35d88c1cafe05d 1d1b537c6c3b4fb3be35d88c1cafe05d--e4f151c239074a938ea58994a2ec450e 271f6c2635a54055a65b805914dae183 1d1b537c6c3b4fb3be35d88c1cafe05d--271f6c2635a54055a65b805914dae183 271f6c2635a54055a65b805914dae183--34e4144dbe944139b574fb949da4e789

Developer documentation

This section contains examples in pure graphviz that can be used to understand roughly what is done in the actual drawing backend.

import graphviz

font_name = "Sans-Serif"
font_size = "8"

graph_attr = {
    "rankdir": "LR",  # LR = left to right, TB = top to bottom
    "nodesep": "0.1",  # In inches, tells distance between nodes without edges
    "compound": "true",  # Needed to draw properly edges in hamevo when content is hidden
    "splines": "false",  # Needed to draw control gates vertical lines one over the other
}  # These are the default values for graphs

node_attr = {
    "shape": "box",  # 'box' for normal nodes, 'point' for control gates or 'plaintext' for starting nodes (the qubit label).
    "style": "rounded",  # Unfortunately we can't specify the radius of the rounded, at least for this version
    "fontname": font_name,
    "fontsize": font_size,
    "width": "0.1",  # In inches, it doesn't get tinier than the label font.
    "height": "0.1"  # In inches, it doesn't get tinier than the label font.
}  # These are the defaults values that can be overridden at node declaration.

default_cluster_attr = {
    "fontname": font_name,
    "fontsize": font_size,
    "labelloc": "b",  # location of cluster label. b as bottom, t as top
    "style": "rounded"
} # These are the defaults values that can be overridden at sub graph declaration

hamevo_cluster_attr = {
    "label": "HamEvo(t=10)"
}
hamevo_cluster_attr.update(default_cluster_attr)

h = graphviz.Graph(graph_attr=graph_attr, node_attr=node_attr)
h.node("Hello World!")
h

# Define graph
h = graphviz.Graph(node_attr=node_attr, graph_attr=graph_attr)

# Add start and end nodes
for i in range(4):
    h.node(f's{i}', shape="plaintext", label=f'{i}', group=f"{i}")
    h.node(f'e{i}', style='invis', group=f"{i}")

# Add nodes
h.node('X', group="0")
h.node('Y', group="1")

# Add hamevo and its nodes
hamevo = graphviz.Graph(name='cluster_hamevo', graph_attr=hamevo_cluster_attr)
for i in range(4):
    hamevo.node(f'z{i}', shape="box", style="invis", label=f'{i}', group=f"{i}")
h.subgraph(hamevo)

# Add rx gates cluster and its nodes
cluster_attr = {"label": "RX gates"}
cluster_attr.update(default_cluster_attr)
cluster = graphviz.Graph(name="cluster_0", graph_attr=cluster_attr)
cluster.node('RX(x)', group="2")
cluster.node('RX(0.5)', group="3")
h.subgraph(cluster)

h.node('cnot0', label='', shape='point', width='0.1', group='0')
h.node('cnot1', label='X', group='1')
h.node('cnot2', label='', shape='point', width='0.1', group='2')
h.node('cnot3', label='', shape='point', width='0.1', group='3')

# Add edges
h.edge('s0', 'X')
h.edge('X', 'cnot0')
h.edge('cnot0', 'z0', lhead='cluster_hamevo')
h.edge('z0', 'e0', ltail='cluster_hamevo')
h.edge('s1', 'Y')
h.edge('Y', 'cnot1')
h.edge('cnot1', 'z1', lhead='cluster_hamevo')
h.edge('z1', 'e1', ltail='cluster_hamevo')
h.edge('s2', 'RX(x)')
h.edge('RX(x)', 'cnot2')
h.edge('cnot2', 'z2', lhead='cluster_hamevo')
h.edge('z2', 'e2', ltail='cluster_hamevo')
h.edge('s3', 'RX(0.5)')
h.edge('RX(0.5)', 'cnot3')
h.edge('cnot3', 'z3', lhead='cluster_hamevo')
h.edge('z3', 'e3', ltail='cluster_hamevo')
h.edge('cnot1', 'cnot0', constraint='false')  # constraint: false is needed to draw vertical edges
h.edge('cnot1', 'cnot2', constraint='false')  # constraint: false is needed to draw vertical edges
h.edge('cnot1', 'cnot3', constraint='false')  # constraint: false is needed to draw vertical edges
h

Example of cluster of clusters

# Define graph
h = graphviz.Graph(node_attr=node_attr, graph_attr=graph_attr)

# Define start and end nodes
for i in range(4):
    h.node(f's{i}', shape="plaintext", label=f'{i}', group=f"{i}")
    h.node(f'e{i}', style='invis', group=f"{i}")

# Define outer cluster
cluster_attr = {"label": "Outer cluster"}
cluster_attr.update(default_cluster_attr)
outer_cluster = graphviz.Graph(name="cluster_outer", graph_attr=cluster_attr)

# Define inner cluster 1 and its nodes
cluster_attr = {"label": "Inner cluster 1"}
cluster_attr.update(default_cluster_attr)
inner1_cluster = graphviz.Graph(name="cluster_inner1", graph_attr=cluster_attr)
inner1_cluster.node("a0", group="0")
inner1_cluster.node("a1", group="1")
outer_cluster.subgraph(inner1_cluster)

# Define inner cluster 2 and its nodes
cluster_attr = {"label": "Inner cluster 2"}
cluster_attr.update(default_cluster_attr)
inner2_cluster = graphviz.Graph(name="cluster_inner2", graph_attr=cluster_attr)
inner2_cluster.node("a2", group="2")
inner2_cluster.node("a3", group="3")
outer_cluster.subgraph(inner2_cluster)

# This has to be done here, after inner clusters definitions
h.subgraph(outer_cluster)

# Define more nodes
for i in range(4):
    h.node(f"b{i}", group=f"{i}")

for i in range(4):
    h.edge(f's{i}', f'a{i}')
    h.edge(f'a{i}', f'b{i}')
    h.edge(f'b{i}', f'e{i}')

h