Circuits

To compose a quantum algorithm, we need a structured manner for representing the gate calls, as defined in GateOps.md.

Circuit.jl

The Circuit.jl module allows us to structure the gate-calls into a quantum circuit representation. Circuits are appendable, pushable, and are represented under the hood as a doubly linked-list (see circuits/utils/DLList.jl), to allow ease of further optimisation and manipulation, if required.

The Circuit module also maintains a cached mapping from GateSymbols to numerical matrices, wherein new gates created are stored for later use by other circuits. This memoization improves the performance of constructing circuits involving calculating sub-matrices (see the algorithms modules for examples).

QXZoo.Circuit.CircType
Circ

Structure for ordered quantum circuit gate operations. Maintains mutable Doubly Linked List (DLList) of gate-calls and a set of the gates used.

source
QXZoo.Circuit.CircMethod
Circ()

Default constructor for empty circuit. Registers Pauli and Hadamard gates during initialisation.

source
QXZoo.Circuit.CircMethod
Circ(num_qubits::Int)

Circ constructor for given number of qubits circuit. Registers Pauli and Hadamard gates during initialisation.

source
QXZoo.Circuit.CircMethod
Circ(num_qubits::Int, gate_set::Set{<:GateOps.AGateSymbol})

Circ constructor for given number of qubits circuit. Registers Pauli and Hadamard gates during initialisation, and the included gate_set.

source
QXZoo.Circuit.add_gatecall!Method
add_gatecall!(circ::Circ, gc::GateOps.AGateCall)

Adds the given gate call gc to the circuit at the end position.

Example 1

julia> Circuit.add_gatecall!(circ, DefaultGates.x(4)) #Apply Paulix to qubit index 4

This functionality is also added by overloading << and used as:

Example 2

julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4
source
QXZoo.Circuit.add_gatecall!Method
add_gatecall!(circ::Circ, gc::GateOps.AGateCall)

Adds the given gate call gc to the circuit at the end position.

Example 1

julia> Circuit.add_gatecall!(circ, DefaultGates.x(4)) #Apply Paulix to qubit index 4

This functionality is also added by overloading << and used as:

Example 2

julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4
source
using QXZoo

qubits = 10

# Create empty circuit with qiven qubit count
cct = QXZoo.Circuit.Circ(qubits)

for i in 1:9
    QXZoo.Circuit.add_gatecall!(cct, QXZoo.DefaultGates.x(i) )
end

# Additional way to add a gate
cct << QXZoo.DefaultGates.z(10)

println(cct)

# Save circuit to disk
QXZoo.Circuit.export_circuit(cct)

#Reload circuit from disk
QXZoo.Circuit.load_circuit(cct)