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))
c3260dbfc72c4e5b94404981cffd2992 0 ed7927606fb74066a61728232d85aabe X c3260dbfc72c4e5b94404981cffd2992--ed7927606fb74066a61728232d85aabe 2ccbc122b43543f98e15c382fdf20944 1 2a1fecda65784a729d50092c622a7aa5 ed7927606fb74066a61728232d85aabe--2a1fecda65784a729d50092c622a7aa5 92ae586001cb45098e0e016c8655b960 a57053ad835540f4a295244a02ba63a3 Y 2ccbc122b43543f98e15c382fdf20944--a57053ad835540f4a295244a02ba63a3 a57053ad835540f4a295244a02ba63a3--92ae586001cb45098e0e016c8655b960
from qadence import X, Y, chain
from qadence.draw import display

b = chain(X(0), Y(0))
dbf2f40851a74e8b84c858c0ede6e4c5 0 5df61b8b4fe54a1c804ad8fb10b19fc7 X dbf2f40851a74e8b84c858c0ede6e4c5--5df61b8b4fe54a1c804ad8fb10b19fc7 0c6d599ed7d747f98883601897f84108 Y 5df61b8b4fe54a1c804ad8fb10b19fc7--0c6d599ed7d747f98883601897f84108 1217ac0fc312455cbb9a780621fe4c61 0c6d599ed7d747f98883601897f84108--1217ac0fc312455cbb9a780621fe4c61
from qadence import X, Y, chain
from qadence.draw import display

b = chain(X(0), Y(1))
093827f914564edf9d0f20dfc3c5df46 0 0d598f174aa74409984d29addd4f7b8d X 093827f914564edf9d0f20dfc3c5df46--0d598f174aa74409984d29addd4f7b8d 0198866665094872bd6cb0cc97dbe9c0 1 df101e1ab96644af912508c04515f5e8 0d598f174aa74409984d29addd4f7b8d--df101e1ab96644af912508c04515f5e8 3e0aafa1ed324cd1a99228028e6d68b9 df101e1ab96644af912508c04515f5e8--3e0aafa1ed324cd1a99228028e6d68b9 32eff0881fe14296bf9d35b63315c48f 033942169cf044e8ae110204145456a1 0198866665094872bd6cb0cc97dbe9c0--033942169cf044e8ae110204145456a1 11d5e23561ee4fb982be6004677d9e39 Y 033942169cf044e8ae110204145456a1--11d5e23561ee4fb982be6004677d9e39 11d5e23561ee4fb982be6004677d9e39--32eff0881fe14296bf9d35b63315c48f
from qadence import X, Y, add
from qadence.draw import display

b = add(X(0), Y(1), X(2))
cluster_7eb1d272a6df4fbfa5e7395c1b6c2f5d 04eb3f68665b4ff298f586feda76b65b 0 4e04f94d4dba4c0297f7760f6bbd27e1 04eb3f68665b4ff298f586feda76b65b--4e04f94d4dba4c0297f7760f6bbd27e1 c06b4cef2aca4d48b83ab9c720755d2f 1 df11c492c021426ca2768567f95934c2 4e04f94d4dba4c0297f7760f6bbd27e1--df11c492c021426ca2768567f95934c2 0724e5d2727b45ca8adc576bf8f22df5 4653a31f423a4153b55456d383939e25 AddBlock c06b4cef2aca4d48b83ab9c720755d2f--4653a31f423a4153b55456d383939e25 532f463f1d274af78a67e6808cc2a886 2 4653a31f423a4153b55456d383939e25--0724e5d2727b45ca8adc576bf8f22df5 7bacfede2efb4ee49e1051d132e84714 83ef579d63d7416ab4ea04c141cebcba 532f463f1d274af78a67e6808cc2a886--83ef579d63d7416ab4ea04c141cebcba 83ef579d63d7416ab4ea04c141cebcba--7bacfede2efb4ee49e1051d132e84714
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_629bda2cd142414fa76dbce16331c4fd cluster_ff2aa4327a9e4b3fb9a3be3076600976 rx a9ac02ab4c2d414ab2d2c37377aebe50 0 465f76b0a7614ed8a7928a6be11a254f X a9ac02ab4c2d414ab2d2c37377aebe50--465f76b0a7614ed8a7928a6be11a254f 769da6b1766c4e20b176214a929fa3d1 1 035b091682aa4838bfcb981971df2ac2 465f76b0a7614ed8a7928a6be11a254f--035b091682aa4838bfcb981971df2ac2 19c2ae6e602945bba7d61e4519d5ad1b 035b091682aa4838bfcb981971df2ac2--19c2ae6e602945bba7d61e4519d5ad1b 3d7c70fea3aa4186a8f3a7720ba20fba 19c2ae6e602945bba7d61e4519d5ad1b--3d7c70fea3aa4186a8f3a7720ba20fba d9c7f944bf8d433d85c6ca4e4bd279aa f3ca7a5013dc4865addf417b25ad6af5 Y 769da6b1766c4e20b176214a929fa3d1--f3ca7a5013dc4865addf417b25ad6af5 4b205a881acb476f8ce41efb1253f0c2 2 4806a1ebeae24bed8396344738cbfc41 f3ca7a5013dc4865addf417b25ad6af5--4806a1ebeae24bed8396344738cbfc41 4432843c5de0432e8829d812700e3607 HamEvo 4806a1ebeae24bed8396344738cbfc41--4432843c5de0432e8829d812700e3607 4432843c5de0432e8829d812700e3607--d9c7f944bf8d433d85c6ca4e4bd279aa 0d51a2e045864f6c8b1b0d5e1061fec8 a0eda5f4a223487da77c985d81f55312 RX(x) 4b205a881acb476f8ce41efb1253f0c2--a0eda5f4a223487da77c985d81f55312 6ca719774e8d40a1b0719fe5e4844df5 3 9ce67dfe797447d7bb99a1aeeb1e525c a0eda5f4a223487da77c985d81f55312--9ce67dfe797447d7bb99a1aeeb1e525c b8fb9b86aba44d53972a6eedd782c307 t = 10 9ce67dfe797447d7bb99a1aeeb1e525c--b8fb9b86aba44d53972a6eedd782c307 b8fb9b86aba44d53972a6eedd782c307--0d51a2e045864f6c8b1b0d5e1061fec8 d932d34a6744499d9d68a98f0a1713be 0b8adb5bd27444e798b8471e93391ffd RX(0.5) 6ca719774e8d40a1b0719fe5e4844df5--0b8adb5bd27444e798b8471e93391ffd 0c652339764742bc81ae578598ccc00f X 0b8adb5bd27444e798b8471e93391ffd--0c652339764742bc81ae578598ccc00f 0c652339764742bc81ae578598ccc00f--9ce67dfe797447d7bb99a1aeeb1e525c 344b9d83cb344199a9485a4412a675e7 0c652339764742bc81ae578598ccc00f--344b9d83cb344199a9485a4412a675e7 344b9d83cb344199a9485a4412a675e7--d932d34a6744499d9d68a98f0a1713be
from qadence import feature_map, hea, chain

block = chain(feature_map(4, fm_type="tower"), hea(4,2))
cluster_d5ce61cd8ca24a10a7fa2b41ddacc2a2 HEA cluster_42ada1d04e324f9a9de18ee2e99d9296 FM f37c7b3b2642467e9c452cb4c757f008 0 3fa53b44b5e3425aa0b7317fb596dcaf RX(2*acos(phi)) f37c7b3b2642467e9c452cb4c757f008--3fa53b44b5e3425aa0b7317fb596dcaf 06da9f80e09b41d3ae02e58b6a6e2b8f 1 0eac58505acc474fafd85116323723ff RX(theta₀) 3fa53b44b5e3425aa0b7317fb596dcaf--0eac58505acc474fafd85116323723ff c0b83fd78de14c72abf4745b9ffd7c2a RY(theta₄) 0eac58505acc474fafd85116323723ff--c0b83fd78de14c72abf4745b9ffd7c2a 8dacfb63026f412880ea8b02c192de02 RX(theta₈) c0b83fd78de14c72abf4745b9ffd7c2a--8dacfb63026f412880ea8b02c192de02 e94b64768ef8429fa73e295f0265e56e 8dacfb63026f412880ea8b02c192de02--e94b64768ef8429fa73e295f0265e56e 8353b80bfbf54e33b9f0cb786cd0242b e94b64768ef8429fa73e295f0265e56e--8353b80bfbf54e33b9f0cb786cd0242b 51f50348a43641bca41fe56f86203223 RX(theta₁₂) 8353b80bfbf54e33b9f0cb786cd0242b--51f50348a43641bca41fe56f86203223 261305dd9f4b44479cff6ed925dfcf7d RY(theta₁₆) 51f50348a43641bca41fe56f86203223--261305dd9f4b44479cff6ed925dfcf7d 4680ab84147548cab2930eb83292c9ff RX(theta₂₀) 261305dd9f4b44479cff6ed925dfcf7d--4680ab84147548cab2930eb83292c9ff 58b0da44514b4cd7828e79f691deb713 4680ab84147548cab2930eb83292c9ff--58b0da44514b4cd7828e79f691deb713 8674cd088a244324828f2c415cab8372 58b0da44514b4cd7828e79f691deb713--8674cd088a244324828f2c415cab8372 dd302c11c3b947ee826a7afa9d17fcf1 8674cd088a244324828f2c415cab8372--dd302c11c3b947ee826a7afa9d17fcf1 8df7ed5fecf34b7e9919da636c7d5a7e f72db530796b4034a3b2118ba278cafd RX(4*acos(phi)) 06da9f80e09b41d3ae02e58b6a6e2b8f--f72db530796b4034a3b2118ba278cafd 19340661048c4bfb8b28d9e88cb25142 2 afef6dd686d84c36a6de8b0b862ad123 RX(theta₁) f72db530796b4034a3b2118ba278cafd--afef6dd686d84c36a6de8b0b862ad123 b08df11410a94ab1b833e5f67fbed8d8 RY(theta₅) afef6dd686d84c36a6de8b0b862ad123--b08df11410a94ab1b833e5f67fbed8d8 5078846419544b0e95a242e47d856b11 RX(theta₉) b08df11410a94ab1b833e5f67fbed8d8--5078846419544b0e95a242e47d856b11 d67b9a5f1e1f4af8aabafb843a54df0e X 5078846419544b0e95a242e47d856b11--d67b9a5f1e1f4af8aabafb843a54df0e d67b9a5f1e1f4af8aabafb843a54df0e--e94b64768ef8429fa73e295f0265e56e d0df94698919480493a582e9158dc179 d67b9a5f1e1f4af8aabafb843a54df0e--d0df94698919480493a582e9158dc179 3f57fb90f0ef4b0286a087e674bfc961 RX(theta₁₃) d0df94698919480493a582e9158dc179--3f57fb90f0ef4b0286a087e674bfc961 d55c4c8d60ca4478b9337d67e051bcc8 RY(theta₁₇) 3f57fb90f0ef4b0286a087e674bfc961--d55c4c8d60ca4478b9337d67e051bcc8 3eac91f0abd347c69e7c7f33d24b69f2 RX(theta₂₁) d55c4c8d60ca4478b9337d67e051bcc8--3eac91f0abd347c69e7c7f33d24b69f2 e8adbab0147f4c168ca1000faf80df82 X 3eac91f0abd347c69e7c7f33d24b69f2--e8adbab0147f4c168ca1000faf80df82 e8adbab0147f4c168ca1000faf80df82--58b0da44514b4cd7828e79f691deb713 61f553eb77be43a386000fe7e62bc107 e8adbab0147f4c168ca1000faf80df82--61f553eb77be43a386000fe7e62bc107 61f553eb77be43a386000fe7e62bc107--8df7ed5fecf34b7e9919da636c7d5a7e 7cb71fcaf6eb4ff6821883abeb553061 e021b162edca40c4be907535f210189d RX(6*acos(phi)) 19340661048c4bfb8b28d9e88cb25142--e021b162edca40c4be907535f210189d 47871ed5bf1f4a3daf5ed174c5f89282 3 38e5ad8af7a544f7bf4ec65fd6c30501 RX(theta₂) e021b162edca40c4be907535f210189d--38e5ad8af7a544f7bf4ec65fd6c30501 665e18ca5b234d00986eb53932f5ab62 RY(theta₆) 38e5ad8af7a544f7bf4ec65fd6c30501--665e18ca5b234d00986eb53932f5ab62 2f2fac55ed5a4dd09230a380b3297e6d RX(theta₁₀) 665e18ca5b234d00986eb53932f5ab62--2f2fac55ed5a4dd09230a380b3297e6d f52b7412a00040998db1475a0b6717b1 2f2fac55ed5a4dd09230a380b3297e6d--f52b7412a00040998db1475a0b6717b1 100d2ed9a03d41038eecf0f808fb015e X f52b7412a00040998db1475a0b6717b1--100d2ed9a03d41038eecf0f808fb015e 100d2ed9a03d41038eecf0f808fb015e--d0df94698919480493a582e9158dc179 ace5f9c153d148e58cb91bf8bbda6616 RX(theta₁₄) 100d2ed9a03d41038eecf0f808fb015e--ace5f9c153d148e58cb91bf8bbda6616 15f6cdb8c08a4a679960895ae7844e68 RY(theta₁₈) ace5f9c153d148e58cb91bf8bbda6616--15f6cdb8c08a4a679960895ae7844e68 0f4611ebbf704239a289396fcd2f8adc RX(theta₂₂) 15f6cdb8c08a4a679960895ae7844e68--0f4611ebbf704239a289396fcd2f8adc f26e51d4bfc34d0cbb7e8b3525a6a99e 0f4611ebbf704239a289396fcd2f8adc--f26e51d4bfc34d0cbb7e8b3525a6a99e d979cae91b2842a2b9d67cdc52cda2b9 X f26e51d4bfc34d0cbb7e8b3525a6a99e--d979cae91b2842a2b9d67cdc52cda2b9 d979cae91b2842a2b9d67cdc52cda2b9--61f553eb77be43a386000fe7e62bc107 d979cae91b2842a2b9d67cdc52cda2b9--7cb71fcaf6eb4ff6821883abeb553061 b1cd70234a454b9a8ef6421941aeeca8 b10f92edc43946f29a67c6b5f406f020 RX(8*acos(phi)) 47871ed5bf1f4a3daf5ed174c5f89282--b10f92edc43946f29a67c6b5f406f020 644e52efdd644df2a60b44b49d8e433b RX(theta₃) b10f92edc43946f29a67c6b5f406f020--644e52efdd644df2a60b44b49d8e433b 71ea8f052f7643859585a9f413ef1006 RY(theta₇) 644e52efdd644df2a60b44b49d8e433b--71ea8f052f7643859585a9f413ef1006 4039ecd36d1d4216bb5ea833fd62ea2d RX(theta₁₁) 71ea8f052f7643859585a9f413ef1006--4039ecd36d1d4216bb5ea833fd62ea2d 673a67d95dce4363affdc80e80cb441b X 4039ecd36d1d4216bb5ea833fd62ea2d--673a67d95dce4363affdc80e80cb441b 673a67d95dce4363affdc80e80cb441b--f52b7412a00040998db1475a0b6717b1 113ea7096c064878a31217360ab70348 673a67d95dce4363affdc80e80cb441b--113ea7096c064878a31217360ab70348 910555a7260540d58df62c2904d61165 RX(theta₁₅) 113ea7096c064878a31217360ab70348--910555a7260540d58df62c2904d61165 97fbf1aaec814cc18fb04da0d03627ea RY(theta₁₉) 910555a7260540d58df62c2904d61165--97fbf1aaec814cc18fb04da0d03627ea f8919cfbd88e4e6da0a368190759acfe RX(theta₂₃) 97fbf1aaec814cc18fb04da0d03627ea--f8919cfbd88e4e6da0a368190759acfe d50fed72d16c4cdbbad1d8bdaaedc0a1 X f8919cfbd88e4e6da0a368190759acfe--d50fed72d16c4cdbbad1d8bdaaedc0a1 d50fed72d16c4cdbbad1d8bdaaedc0a1--f26e51d4bfc34d0cbb7e8b3525a6a99e 4365cedaf45d483ca6dfb195cf0e8eae d50fed72d16c4cdbbad1d8bdaaedc0a1--4365cedaf45d483ca6dfb195cf0e8eae 4365cedaf45d483ca6dfb195cf0e8eae--b1cd70234a454b9a8ef6421941aeeca8

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