General functions
MimiqCircuitsBase.isopalias
— Functionisopalias(typ)
Checks if a given operation type is an alias or not.
MimiqCircuitsBase.isunitary
— Functionisunitary(instruction)
isunitary(operation)
Checks if a given operation is unititary or not.
See also
MimiqCircuitsBase.getoperation
— Functiongetoperation(operation)
getoperation(instruction)
Returns the quantum operation associated to the given instruction.
See also iswrapper
.
Examples
julia> getoperation(Instruction(GateX(), 1))
X
julia> getoperation(GateSX())
X
julia> getoperation(GateCX())
X
MimiqCircuitsBase.numbits
— Functionnumbits(instruction)
numbits(circuit)
Number of classical bits on which the given operation or instruction is defined.
See also numqubits
.
Examples
julia> numbits(GateCX())
0
julia> numbits(Measure())
1
julia> c = Circuit(); push!(c, Measure(), 1, 1); push!(c, Measure(),1,3)
1-qubit circuit with 2 instructions:
├── M @ q[1], c[1]
└── M @ q[1], c[3]
julia> numbits(c)
3
MimiqCircuitsBase.numqubits
— Functionnumqubits(operation)
numqubits(instruction)
numqubits(circuit)
Number of qubits on which the given operation or instruction is defined.
See also numbits
.
Examples
julia> numqubits(GateCX())
2
julia> numqubits(Measure())
1
julia> c = Circuit(); push!(c, GateX(), 1); push!(c, GateCX(),3,6)
6-qubit circuit with 2 instructions:
├── X @ q[1]
└── CX @ q[3], q[6]
julia> numqubits(c)
6
MimiqCircuitsBase.opname
— Functionopname(instruction)
opname(operation)
Name of the underlying quantum operation in a human readable format.
Examples
julia> opname(GateX())
"X"
julia> opname(GateRX(π/2))
"RX"
julia> opname(Instruction(GateCX(),1,2))
"CX"
julia> opname(QFT(4))
"QFT"
MimiqCircuitsBase.power
— Functionpower(operation, exponent)
Elevate an operation to a given exponent.
It performs simplifications when possible otherwise wraps the operation in a Power
object.
See also Power
, inverse
, Inverse
.
Examples
julia> power(GateX(), 1//2)
SX
julia> power(GateX(), 0.5)
X^0.5
julia> GateX()^2
ID
julia> GateCSX()^2
CX
Symbolics.inverse
— Functioninverse(circuit)
inverse(instruction)
inverse(operation)
Inverse of the given circuit, instruction or operation.
When the inverse is not a known operation, it will return an Inverse
object that wraps the original operation.
Details
See also matrix
, isunitary
, power
.
Examples
julia> inverse(GateRX(λ))
RX(-λ)
julia> inverse(GateCSX())
C(SX†)
MimiqCircuitsBase.evaluate
— Functionevaluate(object, dictionary)
Evaluate all the parametric expression in object
using the values specified in the given in the variable, value dictionary, returning a new object constructed on the evaluated parameters.
Examples
Evaluate a single parametric gate
julia> @variables θ
1-element Vector{Symbolics.Num}:
θ
julia> g = GateRX(θ)
RX(θ)
julia> evaluate(g, Dict(θ => 3π))
RX(3π)
MimiqCircuitsBase.issymbolic
— Functionissymbolic(obj)
Checks whether the circuit contains any symbolic (unevaluated) parameters.
This method examines each instruction in the circuit to determine if any parameter remains symbolic (i.e., unevaluated). It recursively checks through each instruction and its nested operations, if any. Returns True if any parameter is symbolic (unevaluated), False if all parameters are fully evaluated.
Examples
julia> c = Circuit()
empty circuit
julia> push!(c, GateH(), 1)
1-qubit circuit with 1 instructions:
└── H @ q[1]
julia> issymbolic(c)
false
julia> @variables x y
2-element Vector{Symbolics.Num}:
x
y
julia> push!(c,Control(3,GateP(x+y)),1,2,3,4)
4-qubit circuit with 2 instructions:
├── H @ q[1]
└── C₃P(x + y) @ q[1:3], q[4]
julia> issymbolic(c)
true
MimiqCircuitsBase.Measure
— TypeMeasure()
Single qubit measurement operation in the computational basis
The operation projects the quantum state and stores the result of such measurement in a classical register.
Measure
is non-reversible.
Examples
julia> Measure()
M
julia> c = push!(Circuit(), Measure, 1, 1)
1-qubit circuit with 1 instructions:
└── M @ q[1], c[1]
julia> push!(c, Measure(), 3, 4)
3-qubit circuit with 2 instructions:
├── M @ q[1], c[1]
└── M @ q[3], c[4]
MimiqCircuitsBase.MeasureX
— TypeMeasureX()
Single qubit measurement operation in the X basis.
The operation projects the quantum state and stores the result of such measurement in a classical register.
This operation is equivalent to the sequence GateH
, Measure
, GateH
.
Measure
is non-reversible.
See also Measure
, Operation
, Reset
.
Examples
julia> Measure()
M
julia> decompose(MeasureX())
1-qubit circuit with 3 instructions:
├── H @ q[1]
├── M @ q[1], c[1]
└── H @ q[1]
julia> c = push!(Circuit(), Measure, 1, 1)
1-qubit circuit with 1 instructions:
└── M @ q[1], c[1]
julia> push!(c, Measure(), 3, 4)
3-qubit circuit with 2 instructions:
├── M @ q[1], c[1]
└── M @ q[3], c[4]
MimiqCircuitsBase.MeasureY
— TypeMeasureY()
Single qubit measurement operation in the Y basis.
The operation projects the quantum state and stores the result of such measurement in a classical register.
This operation is equivalent to the sequence GateSDG
, GateH
, Measure
, GateH
, GateS
.
Measure
is non-reversible.
See also Measure
, Operation
, Reset
.
Examples
julia> MeasureY()
MeasureY
julia> decompose(MeasureY())
1-qubit circuit with 3 instructions:
├── HYZ @ q[1]
├── M @ q[1], c[1]
└── HYZ @ q[1]
julia> c = push!(Circuit(), MeasureY, 1, 1)
1-qubit circuit with 1 instructions:
└── MeasureY @ q[1], c[1]
julia> push!(c, MeasureY(), 3, 4)
3-qubit circuit with 2 instructions:
├── MeasureY @ q[1], c[1]
└── MeasureY @ q[3], c[4]
MimiqCircuitsBase.MeasureZ
— TypeMeasureZ()
See Measure
.
Serialization
MimiqCircuitsBase.loadproto
— Functionloadproto(fname, Circuit)
loadproto(fname, QCSResults)
Deserialize a Circuit
or a QCSResults
object from a ProtoBuf file.
MimiqCircuitsBase.saveproto
— Functionsaveproto(fname, c::Circuit)
saveproto(fname, c::QCSResults)
Serialize a Circuit
or a QCSResults
object to a ProtoBuf file.