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
— TypeCirc
Structure 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)::Int
Return 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 4
This functionality is also added by overloading <<
and used as:
Example 2
julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4
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 4
This functionality is also added by overloading <<
and used as:
Example 2
julia> circ << GateOps.x(4) #Apply Paulix to qubit index 4
QXZoo.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)