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.Circ — TypeCircStructure for ordered quantum circuit gate operations. Maintains mutable Doubly Linked List (DLList) of gate-calls and a set of the gates used.
QXZoo.Circuit.Circ — MethodCirc()Default constructor for empty circuit. Registers Pauli and Hadamard gates during initialisation.
QXZoo.Circuit.Circ — MethodCirc(num_qubits::Int)Circ constructor for given number of qubits circuit. Registers Pauli and Hadamard gates during initialisation.
QXZoo.Circuit.Circ — MethodCirc(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.
QXZoo.Circuit.num_qubits — Methodnum_qubits(circuit::Circ)::IntReturn the number of qubits for the given circuit.
QXZoo.Circuit.add_gatecall! — Methodadd_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 4This functionality is also added by overloading << and used as:
Example 2
julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4QXZoo.Circuit.add_gatecall! — Methodadd_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 4This functionality is also added by overloading << and used as:
Example 2
julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4QXZoo.Circuit.export_circuit — Functionexport_circuit(cct::Circ, file_name::String="circuit")Exports the circuit to disk as a JLD2 file.
QXZoo.Circuit.load_circuit — Functionload_circuit(file_name::String="circuit")Loads the circuit at file_name.jld2 from disk.
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)