Skip to content

Results are limited to the current section: Qadence

Product news

Quantum registers

In Qadence, quantum programs can be executed by specifying the layout of a register of resources as a lattice. Built-in Register types can be used or constructed for arbitrary topologies. Common register topologies are available and illustrated in the plot below.

2025-06-04T09:56:49.516742 image/svg+xml Matplotlib v3.10.3, https://matplotlib.org/

Built-in topologies are directly accessible in the Register methods:

from qadence import Register
reg = Register.all_to_all(n_qubits = 4)
reg_line = Register.line(n_qubits = 4)
reg_circle = Register.circle(n_qubits = 4)
reg_squre = Register.square(qubits_side = 2)
reg_rect = Register.rectangular_lattice(qubits_row = 2, qubits_col = 2)
reg_triang = Register.triangular_lattice(n_cells_row = 2, n_cells_col = 2)
reg_honey = Register.honeycomb_lattice(n_cells_row = 2, n_cells_col = 2)

The Register class builds on top of the NetworkX Graph, and the graphs can be visualized with the reg.draw() method

Qubit coordinates are saved as node properties in the underlying NetworkX graph, but can be accessed directly with the coords property.

reg = Register.square(2)
print(reg.coords)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="p">{</span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">-0.5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">0.5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">0.5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-0.5</span><span class="p">,</span><span class="w"> </span><span class="mf">-0.5</span><span class="err">)</span><span class="p">}</span>
</code>
spacingrescale_coords
scaled_reg_1 = Register.square(2, spacing = 4.0)
scaled_reg_2 = reg.rescale_coords(scaling = 4.0)
print(scaled_reg_1.coords)
print(scaled_reg_2.coords)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="p">{</span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-2.0</span><span class="err">)</span><span class="p">}</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="p">{</span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">2.0</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="err">(</span><span class="mf">-2.0</span><span class="p">,</span><span class="w"> </span><span class="mf">-2.0</span><span class="err">)</span><span class="p">}</span>
</code>

The distance between qubits can also be directly accessed with the distances and edge_distances properties.

print(reg.distances)
print(reg.edge_distances)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="err">Dis</span><span class="kc">tan</span><span class="err">ce</span><span class="w"> </span><span class="err">be</span><span class="kc">t</span><span class="err">wee</span><span class="kc">n</span><span class="w"> </span><span class="err">all</span><span class="w"> </span><span class="err">qubi</span><span class="kc">t</span><span class="w"> </span><span class="err">pairs</span><span class="p">:</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="p">{</span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.4142135623730951</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.4142135623730951</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">}</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="err">Dis</span><span class="kc">tan</span><span class="err">ce</span><span class="w"> </span><span class="err">be</span><span class="kc">t</span><span class="err">wee</span><span class="kc">n</span><span class="w"> </span><span class="err">qubi</span><span class="kc">ts</span><span class="w"> </span><span class="err">co</span><span class="kc">nne</span><span class="err">c</span><span class="kc">t</span><span class="w"> </span><span class="err">by</span><span class="w"> </span><span class="err">a</span><span class="kc">n</span><span class="w"> </span><span class="err">edge</span><span class="w"> </span><span class="err">i</span><span class="kc">n</span><span class="w"> </span><span class="kc">t</span><span class="err">he</span><span class="w"> </span><span class="err">graph</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="p">{</span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">}</span>
</code>

By calling the Register directly, either the number of nodes or a specific graph can be given as input. If passing a custom graph directly, the node positions will not be defined automatically, and should be previously saved in the "pos" node property. If not, reg.coords will return empty tuples and all distances will be 0.

import networkx as nx
# Same as Register.all_to_all(n_qubits = 2):
reg = Register(2)
# Register from a custom graph:
graph = nx.complete_graph(3)
# Set node positions, in this case a simple line:
for i, node in enumerate(graph.nodes):
graph.nodes[node]["pos"] = (1.0 * i, 0.0)
reg = Register(graph)
print(reg.distances)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="p">{</span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">2.0</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">:</span><span class="w"> </span><span class="mf">1.0</span><span class="p">}</span>
</code>

Alternatively, arbitrarily shaped registers can also be constructed by providing the node coordinates. In this case, there will be no edges automatically created in the connectivity graph.

import numpy as np
from qadence import Register, PI
reg = Register.from_coordinates(
[(x, np.sin(x)) for x in np.linspace(0, 2*PI, 10)]
)
reg.draw(show=False)
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2025-06-04T09:56:49.728696
image/svg+xml
Matplotlib v3.10.3, https://matplotlib.org/
*{stroke-linejoin: round; stroke-linecap: butt}

Register topology is often assumed in digital simulations to be an all-to-all qubit connectivity. When running on real devices that enable the digital-analog computing paradigm, qubit interactions must be specified either by specifying distances between qubits, or by defining edges in the register connectivity graph.

The abstract graph nodes and edges are accessible for direct usage.

from qadence import Register
reg = Register.rectangular_lattice(2,3)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="err">reg.</span><span class="kc">n</span><span class="err">odes</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="err">NodeView((</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">))</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="err">reg.edges</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="err">EdgeView(</span><span class="p">[</span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">]</span><span class="err">)</span>
</code>

There is also an all_node_pairs property for convenience:

print(reg.all_node_pairs)
<span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="p">[</span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">,</span><span class="w"> </span><span class="err">(</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="err">)</span><span class="p">]</span>
</code>

More details about the usage of Register types in the digital-analog paradigm can be found in the digital-analog basics section.