Skip to content

Commit 0ddc9e8

Browse files
Fix issues reported by JET (#385)
--------- Co-authored-by: Stefan Krastanov <[email protected]> Co-authored-by: Stefan Krastanov <[email protected]>
1 parent be50f9c commit 0ddc9e8

18 files changed

+98
-99
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ LocalPreferences.toml
44
*/.*swp
55
scratch/
66
*.cov
7-
.vscode
7+
.vscode
8+
test/.CondaPkg/

src/QuantumClifford.jl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export
2626
nqubits,
2727
stabilizerview, destabilizerview, logicalxview, logicalzview, phases,
2828
fastcolumn, fastrow,
29-
bitview, quantumstate, tab,
29+
bitview, quantumstate, tab, rank,
3030
BadDataStructure,
3131
affectedqubits, #TODO move to QuantumInterface?
3232
# GF2
@@ -173,7 +173,7 @@ Tableau(xzs::AbstractMatrix{Bool}) = Tableau(zeros(UInt8, size(xzs,1)), xzs[:,1:
173173

174174
Tableau(t::Tableau) = t
175175

176-
function _T_str(a) # TODO this can be optimized by not creating intermediary PauliOperator objects
176+
function _T_str(a::Union{String,SubString{String}}) # TODO this can be optimized by not creating intermediary PauliOperator objects
177177
paulis = [_P_str(strip(s.match)) for s in eachmatch(r"[+-]?\h*[i]?\h*[XYZI_]+", a)]
178178
Tableau(paulis)
179179
end
@@ -229,18 +229,18 @@ end
229229

230230
Base.firstindex(tab::Tableau) = 1
231231

232-
Base.lastindex(tab::Tableau) = length(tab.phases)
232+
Base.lastindex(tab::Tableau) = length(tab.phases)::Int
233233
Base.lastindex(tab::Tableau, i) = size(tab)[i]
234234

235-
Base.eachindex(tab::Tableau) = Base.OneTo(lastindex(tab.phases))
235+
Base.eachindex(tab::Tableau) = Base.OneTo(lastindex(tab.phases)::Int)
236236

237237
Base.axes(tab::Tableau) = (Base.OneTo(lastindex(tab)), Base.OneTo(nqubits(tab)))
238238
Base.axes(tab::Tableau,i) = axes(tab)[i]
239239

240-
Base.size(tab::Tableau) = (length(tab.phases),nqubits(tab))
240+
Base.size(tab::Tableau) = (length(tab.phases)::Int, nqubits(tab))
241241
Base.size(tab::Tableau,i) = size(tab)[i]
242242

243-
Base.length(tab::Tableau) = length(tab.phases)
243+
Base.length(tab::Tableau) = length(tab.phases)::Int
244244

245245
Base.:(==)(l::Tableau, r::Tableau) = r.nqubits==l.nqubits && r.phases==l.phases && r.xzs==l.xzs
246246

@@ -378,7 +378,7 @@ macro S_str(a)
378378
quote Stabilizer(_T_str($a)) end
379379
end
380380
Base.getindex(stab::Stabilizer, i::Int) = tab(stab)[i]
381-
Base.getindex(stab::Stabilizer, i) = Stabilizer(tab(stab)[i])
381+
Base.getindex(stab::Stabilizer, i) = Stabilizer(tab(stab)[i]::Tableau)
382382
@inline Base.getindex(stab::Stabilizer, r::Int, c) = tab(stab)[r,c]
383383
Base.getindex(stab::Stabilizer, r, c) = Stabilizer(tab(stab)[r,c])
384384
Base.view(stab::Stabilizer, r) = Stabilizer(view(tab(stab),r))
@@ -497,11 +497,11 @@ function MixedStabilizer(s::Stabilizer{T}) where {T}
497497
MixedStabilizer(spadded,zr)
498498
end
499499

500-
MixedStabilizer(s::Stabilizer,rank::Int) = MixedStabilizer(tab(s),rank)
500+
MixedStabilizer(s::Stabilizer,rank::Int) = MixedStabilizer(tab(s), rank)
501501

502-
Base.length(d::MixedStabilizer) = length(d.tab)
502+
Base.length(d::MixedStabilizer) = length(tab(d))
503503

504-
Base.copy(ms::MixedStabilizer) = MixedStabilizer(copy(ms.tab),ms.rank)
504+
Base.copy(ms::MixedStabilizer) = MixedStabilizer(copy(tab(ms)), rank(ms))
505505

506506
##############################
507507
# Mixed Destabilizer states
@@ -580,15 +580,15 @@ function MixedDestabilizer(stab::Stabilizer{T}; undoperm=true, reportperm=false)
580580
end
581581

582582
function MixedDestabilizer(d::Destabilizer, r::Int)
583-
l,n = size(d.tab)
583+
l,n = size(tab(d))
584584
if l==2n
585585
MixedDestabilizer(tab(d), r)
586586
else
587587
throw(DomainError("Only full-rank `Destabilizer` can be converted to `MixedDestabilizer` with specific rank. Try not specifying `r`."))
588588
end
589589
end
590590
function MixedDestabilizer(d::Destabilizer)
591-
l,n = size(d.tab)
591+
l,n = size(tab(d))
592592
if l==2n
593593
MixedDestabilizer(d, nqubits(d))
594594
else
@@ -599,9 +599,9 @@ end
599599
MixedDestabilizer(d::MixedStabilizer) = MixedDestabilizer(stabilizerview(d))
600600
MixedDestabilizer(d::MixedDestabilizer) = d
601601

602-
Base.length(d::MixedDestabilizer) = length(d.tab)÷2
602+
Base.length(d::MixedDestabilizer) = length(tab(d))÷2
603603

604-
Base.copy(d::MixedDestabilizer) = MixedDestabilizer(copy(d.tab),d.rank)
604+
Base.copy(d::MixedDestabilizer) = MixedDestabilizer(copy(tab(d)),rank(d))
605605

606606
##############################
607607
# Subtableau views
@@ -610,17 +610,17 @@ Base.copy(d::MixedDestabilizer) = MixedDestabilizer(copy(d.tab),d.rank)
610610
"""A view of the subtableau corresponding to the stabilizer. See also [`tab`](@ref), [`destabilizerview`](@ref), [`logicalxview`](@ref), [`logicalzview`](@ref)"""
611611
@inline stabilizerview(s::Stabilizer) = s
612612
@inline stabilizerview(s::Destabilizer) = Stabilizer(@view tab(s)[end÷2+1:end])
613-
@inline stabilizerview(s::MixedStabilizer) = Stabilizer(@view tab(s)[1:s.rank])
614-
@inline stabilizerview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[end÷2+1:end÷2+s.rank])
613+
@inline stabilizerview(s::MixedStabilizer) = Stabilizer(@view tab(s)[1:rank(s)])
614+
@inline stabilizerview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[end÷2+1:end÷2+rank(s)])
615615

616616
"""A view of the subtableau corresponding to the destabilizer. See also [`tab`](@ref), [`stabilizerview`](@ref), [`logicalxview`](@ref), [`logicalzview`](@ref)"""
617617
@inline destabilizerview(s::Destabilizer) = Stabilizer(@view tab(s)[1:end÷2])
618-
@inline destabilizerview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[1:s.rank])
618+
@inline destabilizerview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[1:rank(s)])
619619

620620
"""A view of the subtableau corresponding to the logical X operators. See also [`tab`](@ref), [`stabilizerview`](@ref), [`destabilizerview`](@ref), [`logicalzview`](@ref)"""
621-
@inline logicalxview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[s.rank+1:end÷2])
621+
@inline logicalxview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[rank(s)+1:end÷2])
622622
"""A view of the subtableau corresponding to the logical Z operators. See also [`tab`](@ref), [`stabilizerview`](@ref), [`destabilizerview`](@ref), [`logicalxview`](@ref)"""
623-
@inline logicalzview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[end÷2+s.rank+1:end])
623+
@inline logicalzview(s::MixedDestabilizer) = Stabilizer(@view tab(s)[end÷2+rank(s)+1:end])
624624

625625
"""The number of qubits of a given state."""
626626
@inline nqubits(s::AbstractStabilizer) = nqubits(tab(s))

src/dense_cliffords.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ CliffordOperator(op::CliffordOperator) = op
6262
CliffordOperator(paulis::AbstractVector{<:PauliOperator}) = CliffordOperator(Tableau(paulis))
6363
CliffordOperator(destab::Destabilizer) = CliffordOperator(tab(destab))
6464

65-
Base.:(==)(l::CliffordOperator, r::CliffordOperator) = l.tab == r.tab
65+
Base.:(==)(l::CliffordOperator, r::CliffordOperator) = tab(l) == tab(r)
6666
Base.hash(c::T, h::UInt) where {T<:CliffordOperator} = hash(T, hash(tab(c), h))
6767

6868
Base.getindex(c::CliffordOperator, args...) = getindex(tab(c), args...)
@@ -85,16 +85,16 @@ digits_subchars = collect("₀₁₂₃₄₅₆₇₈₉")
8585
digits_substr(n::Int,nwidth::Int) = join(([digits_subchars[d+1] for d in reverse(digits(n, pad=nwidth))]))
8686

8787
function Base.copy(c::CliffordOperator)
88-
CliffordOperator(copy(c.tab))
88+
CliffordOperator(copy(tab(c)))
8989
end
9090

91-
@inline nqubits(c::CliffordOperator) = nqubits(c.tab)
91+
@inline nqubits(c::CliffordOperator) = nqubits(tab(c))
9292

93-
Base.zero(c::CliffordOperator) = CliffordOperator(zero(c.tab))
93+
Base.zero(c::CliffordOperator) = CliffordOperator(zero(tab(c)))
9494
Base.zero(::Type{<:CliffordOperator}, n) = CliffordOperator(zero(Tableau, 2n, n))
9595

9696
function Base.:(*)(l::AbstractCliffordOperator, r::CliffordOperator)
97-
tab = copy(r.tab)
97+
tab = copy(QuantumClifford.tab(r))
9898
apply!(Stabilizer(tab),l) # TODO maybe not the most elegant way to perform apply!(::Tableau, gate)
9999
CliffordOperator(tab)
100100
end
@@ -106,7 +106,7 @@ end
106106

107107
# TODO create Base.permute! and getindex(..., permutation_array)
108108
function permute(c::CliffordOperator,p) # TODO this is a slow stupid implementation
109-
CliffordOperator(Tableau([c.tab[i][p] for i in 1:2*nqubits(c)][vcat(p,p.+nqubits(c))]))
109+
CliffordOperator(Tableau([tab(c)[i][p] for i in 1:2*nqubits(c)][vcat(p,p.+nqubits(c))]))
110110
end
111111

112112
"""Nonvectorized version of `apply!` used for unit tests."""

src/ecc/circuits.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ function perm_to_transpositions(perm)
7474
for i in n:-1:1
7575
if perm[i]!=i
7676
j = findfirst(==(i), perm)
77+
@assert !isnothing(j)
7778
push!(transpositions, (i, j))
7879
perm[j] = perm[i]
7980
end

src/ecc/decoder_pipeline.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ function create_lookup_table(code::Stabilizer)
251251
for bit_to_be_flipped in 1:qubits
252252
for error_type in [single_x, single_y, single_z]
253253
# Generate e⃗
254-
error = error_type(qubits, bit_to_be_flipped)
254+
error = error_type(qubits, bit_to_be_flipped)::PauliOperator{Array{UInt8, 0}, Vector{UInt}}
255255
# Calculate s⃗
256256
# (check which stabilizer rows do not commute with the Pauli error)
257257
syndrome = comm(error, code)

src/fastmemlayout.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ fastrow(t::Tableau{Tₚᵥ,Tₘ}) where {Tₚᵥ, Tₘ<:Adjoint} = Tableau(t.pha
2020
fastcolumn(t::Tableau{Tₚᵥ,Tₘ}) where {Tₚᵥ, Tₘ} = Tableau(t.phases, t.nqubits, collect(t.xzs')')
2121
fastcolumn(t::Tableau{Tₚᵥ,Tₘ}) where {Tₚᵥ, Tₘ<:Adjoint} = t
2222

23-
fastrow(s::Stabilizer) = Stabilizer(fastrow(s.tab))
24-
fastcolumn(s::Stabilizer) = Stabilizer(fastcolumn(s.tab))
23+
fastrow(s::Stabilizer) = Stabilizer(fastrow(tab(s)))
24+
fastcolumn(s::Stabilizer) = Stabilizer(fastcolumn(tab(s)))
2525

26-
fastrow(s::Destabilizer) = Destabilizer(fastrow(s.tab))
27-
fastcolumn(s::Destabilizer) = Destabilizer(fastcolumn(s.tab))
26+
fastrow(s::Destabilizer) = Destabilizer(fastrow(tab(s)))
27+
fastcolumn(s::Destabilizer) = Destabilizer(fastcolumn(tab(s)))
2828

29-
fastrow(s::MixedStabilizer) = MixedStabilizer(fastrow(s.tab), s.rank)
30-
fastcolumn(s::MixedStabilizer) = MixedStabilizer(fastcolumn(s.tab), s.rank)
29+
fastrow(s::MixedStabilizer) = MixedStabilizer(fastrow(tab(s)), rank(s))
30+
fastcolumn(s::MixedStabilizer) = MixedStabilizer(fastcolumn(tab(s)), rank(s))
3131

32-
fastrow(s::MixedDestabilizer) = MixedDestabilizer(fastrow(s.tab), s.rank)
33-
fastcolumn(s::MixedDestabilizer) = MixedDestabilizer(fastcolumn(s.tab), s.rank)
32+
fastrow(s::MixedDestabilizer) = MixedDestabilizer(fastrow(tab(s)), rank(s))
33+
fastcolumn(s::MixedDestabilizer) = MixedDestabilizer(fastcolumn(tab(s)), rank(s))

src/linalg.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ function tensor(ops::CliffordOperator...) # TODO implement \otimes for Destabili
260260
last_zrow = ntot
261261
last_xrow = 0
262262
for op in ops
263-
t = op.tab
263+
t = QuantumClifford.tab(op)
264264
_, last_zrow, _ = puttableau!(tab, (@view t[end÷2+1:end]), last_zrow, last_xrow)
265265
_, last_xrow, _ = puttableau!(tab, (@view t[1:end÷2]), last_xrow, last_xrow)
266266
end

src/mul_leftright.jl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ function mul_ordered_lv!(r::AbstractVector{T}, l::AbstractVector{T}; phases::Val
5656
end
5757
=#
5858

59-
function mul_ordered!(r::SubArray{T,1,P,I1,L1}, l::SubArray{T,1,P,I2,L2}; phases::Val{B}=Val(true)) where {T<:Unsigned, B, I1, I2, L1, L2, P<:Adjoint}
60-
# This method exists because SIMD.jl does not play well with Adjoint
61-
# Delete it and try `QuantumClifford.mul_left!(fastcolumn(random_stabilizer(194)), 2, 1)` # works fine for 192
62-
_mul_ordered_nonvec!(r,l; phases=B)
63-
end
64-
6559
function mul_ordered!(r::SubArray{T,1,P,I2,L2}, l::AbstractVector{T}; phases::Val{B}=Val(true)) where {T<:Unsigned, B, I2, L2, P<:Adjoint}
6660
# This method exists because SIMD.jl does not play well with Adjoint
6761
_mul_ordered_nonvec!(r,l; phases=B)

src/pauli_operator.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function zbit(p::PauliOperator)
7777
[(word>>s)&one==one for word in zview(p) for s in 0:size-1][begin:p.nqubits]
7878
end
7979

80-
function _P_str(a)
80+
function _P_str(a::Union{String,SubString{String}})
8181
letters = filter(x->occursin(x,"_IZXY"),a)
8282
phase = phasedict[strip(filter(x->!occursin(x,"_IZXY"),a))]
8383
PauliOperator(phase, [l=='X'||l=='Y' for l in letters], [l=='Z'||l=='Y' for l in letters])
@@ -87,7 +87,7 @@ macro P_str(a)
8787
quote _P_str($a) end
8888
end
8989

90-
Base.getindex(p::PauliOperator{Tₚ,Tᵥ}, i::Int) where {Tₚ, Tᵥₑ<:Unsigned, Tᵥ<:AbstractVector{Tᵥₑ}} = (p.xz[_div(Tᵥₑ, i-1)+1] & Tᵥₑ(0x1)<<_mod(Tᵥₑ,i-1))!=0x0, (p.xz[end÷2+_div(Tᵥₑ,i-1)+1] & Tᵥₑ(0x1)<<_mod(Tᵥₑ,i-1))!=0x0
90+
Base.getindex(p::PauliOperator{Tₚ,Tᵥ}, i::Int) where {Tₚ, Tᵥₑ<:Unsigned, Tᵥ<:AbstractVector{Tᵥₑ}} = ((p.xz[_div(Tᵥₑ, i-1)+1] & Tᵥₑ(0x1)<<_mod(Tᵥₑ,i-1))!=0x0)::Bool, ((p.xz[end÷2+_div(Tᵥₑ,i-1)+1] & Tᵥₑ(0x1)<<_mod(Tᵥₑ,i-1))!=0x0)::Bool
9191
Base.getindex(p::PauliOperator{Tₚ,Tᵥ}, r) where {Tₚ, Tᵥₑ<:Unsigned, Tᵥ<:AbstractVector{Tᵥₑ}} = PauliOperator(p.phase[], xbit(p)[r], zbit(p)[r])
9292

9393
function Base.setindex!(p::PauliOperator{Tₚ,Tᵥ}, (x,z)::Tuple{Bool,Bool}, i) where {Tₚ, Tᵥₑ, Tᵥ<:AbstractVector{Tᵥₑ}}
@@ -176,7 +176,8 @@ end
176176
function embed(n::Int, indices, p::PauliOperator)
177177
if nqubits(p) == length(indices)
178178
pout = zero(typeof(p), n)
179-
@inbounds @simd for i in eachindex(indices)
179+
@inbounds @simd for i_ in eachindex(indices)
180+
i = i_::Int
180181
pout[indices[i]] = p[i]
181182
end
182183
pout.phase[] = p.phase[]

src/project_trace_reset.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ end
339339

340340
function _project!(d::Destabilizer,pauli::PauliOperator;keep_result::Val{Bkr}=Val(true),phases::Val{Bp}=Val(true)) where {Bkr, Bp} # repetition between Destabilizer and MixedDestabilizer, but the redundancy makes the two codes slightly simpler and easier to infer
341341
anticommutes = 0
342-
tab = d.tab
342+
tab = QuantumClifford.tab(d)
343343
stabilizer = stabilizerview(d)
344344
destabilizer = destabilizerview(d)
345345
r = trusted_rank(d)
@@ -377,7 +377,7 @@ end
377377

378378
function _project!(d::MixedDestabilizer,pauli::PauliOperator;keep_result::Val{Bkr}=Val(true),phases::Val{Bp}=Val(true)) where {Bkr, Bp} # repetition between Destabilizer and MixedDestabilizer, but the redundancy makes the two codes slightly simpler and easier to infer
379379
anticommutes = 0
380-
tab = d.tab
380+
tab = QuantumClifford.tab(d)
381381
stabilizer = stabilizerview(d)
382382
destabilizer = destabilizerview(d)
383383
r = trusted_rank(d)
@@ -497,7 +497,7 @@ end
497497
"""Internal method used to implement [`projectX!`](@ref), [`projectZ!`](@ref), and [`projectY!`](@ref)."""
498498
function project_cond!(d::MixedDestabilizer,qubit::Int,cond::Val{IS},reset::Val{RESET};keep_result::Bool=true,phases::Val{PHASES}=Val(true)) where {IS,RESET,PHASES}
499499
anticommutes = 0
500-
tab = d.tab
500+
tab = QuantumClifford.tab(d)
501501
stabilizer = stabilizerview(d)
502502
destabilizer = destabilizerview(d)
503503
r = d.rank
@@ -647,7 +647,7 @@ function traceout!(s::Union{MixedStabilizer, MixedDestabilizer}, qubits; phases=
647647
if rank return (s, i) else return s end
648648
end
649649

650-
function _expand_pauli(pauli,qubits,n) # TODO rename and make public
650+
function _expand_pauli(pauli::PauliOperator,qubits,n) # TODO rename and make public
651651
expanded = zero(PauliOperator,n)
652652
for (ii, i) in enumerate(qubits)
653653
expanded[i] = pauli[ii]
@@ -886,4 +886,4 @@ See also: [`traceout!`](@ref)
886886
"""
887887
function delete_columns(𝒮::Stabilizer, subset)
888888
return 𝒮[:, setdiff(1:nqubits(𝒮), subset)]
889-
end
889+
end

src/randoms.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ function nemo_inv(a, n)::Matrix{UInt8}
184184
end
185185

186186
"""Sample (h, S) from the distribution P_n(h, S) from Bravyi and Maslov Algorithm 1."""
187-
function quantum_mallows(rng, n) # each one is benchmakred in benchmarks/quantum_mallows.jl
187+
function quantum_mallows(rng::AbstractRNG, n::Int) # each one is benchmarked in benchmarks/quantum_mallows.jl
188188
arr = collect(1:n)
189189
hadamard = falses(n)
190190
perm = zeros(Int64, n)
@@ -202,7 +202,7 @@ end
202202

203203
""" This function samples a number from 1 to `n` where `n >= 1`
204204
probability of outputting `i` is proportional to `2^i`"""
205-
function sample_geometric_2(rng, n::Integer)
205+
function sample_geometric_2(rng::AbstractRNG, n::Integer)
206206
n < 1 && throw(DomainError(n))
207207
if n<30
208208
k = rand(rng, 2:UInt(2)^n)
@@ -217,7 +217,7 @@ function sample_geometric_2(rng, n::Integer)
217217
end
218218

219219
"""Assign (symmetric) random ints to off diagonals of matrix."""
220-
function fill_tril(rng, matrix, n; symmetric::Bool=false)
220+
function fill_tril(rng::AbstractRNG, matrix, n; symmetric::Bool=false)
221221
# Add (symmetric) random ints to off diagonals
222222
@inbounds for row in 1:n, col in 1:row-1
223223
b = rand(rng, Bool)

src/symbolic_cliffords.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false, tr
203203
SingleQubitOperator(o::SingleQubitOperator) = o
204204
function SingleQubitOperator(op::CliffordOperator, qubit)
205205
nqubits(op)==1 || throw(DimensionMismatch("You are trying to convert a multiqubit `CliffordOperator` into a symbolic `SingleQubitOperator`."))
206-
SingleQubitOperator(qubit,op.tab[1,1]...,op.tab[2,1]...,(~).(iszero.(op.tab.phases))...)
206+
SingleQubitOperator(qubit,tab(op)[1,1]...,tab(op)[2,1]...,(~).(iszero.(tab(op).phases))...)
207207
end
208208
SingleQubitOperator(op::CliffordOperator) = SingleQubitOperator(op, 1)
209209

0 commit comments

Comments
 (0)