QuantumClifford.jl
QuantumClifford.jl copied to clipboard
MixedDestabilizer constructor has too restrictive typeassert making it break on subarray input
julia> random_destabilizer(5,6) |> stabilizerview |> MixedDestabilizer
ERROR: TypeError: in typeassert, expected QuantumClifford.Tableau{SubArray{UInt8, 1, Vector{UInt8}, Tuple{UnitRange{Int64}}, true}, SubArray{UInt64, 2, Matrix{UInt64}, Tuple{Base.Slice{Base.OneTo{Int64}}, UnitRange{Int64}}, true}}, got a value of type QuantumClifford.Tableau{Vector{UInt8}, Matrix{UInt64}}
Stacktrace:
[1] MixedDestabilizer(stab::Stabilizer{QuantumClifford.Tableau{SubArray{UInt8, 1, Vector{UInt8}, Tuple{UnitRange{Int64}}, true}, SubArray{UInt64, 2, Matrix{UInt64}, Tuple{Base.Slice{Base.OneTo{Int64}}, UnitRange{Int64}}, true}}}; undoperm::Bool, reportperm::Bool)
@ QuantumClifford ~/Documents/ScratchSpace/quantumjulia/QuantumClifford.jl/src/QuantumClifford.jl:558
julia> random_destabilizer(5,6) |> stabilizerview |> copy |> MixedDestabilizer
# works fine
This is due to the following line: https://github.com/QuantumSavory/QuantumClifford.jl/blob/55fc8765a0ac0595768bcda47d3621b9edb28e20/src/QuantumClifford.jl#L558
where that t is not always of type T due to https://github.com/QuantumSavory/QuantumClifford.jl/blob/55fc8765a0ac0595768bcda47d3621b9edb28e20/src/QuantumClifford.jl#L525-L526
If T involves subarray views, then zero just makes a new tableau directly using arrays, not subarrays (as it should!):
julia> typeof(@view rand(5)[1:4])
SubArray{Float64, 1, Vector{Float64}, Tuple{UnitRange{Int64}}, true}
julia> typeof(zero(@view rand(5)[1:4]))
Vector{Float64} (alias for Array{Float64, 1})
The type assert is there to help JET, so any fix should be checked for whether it causes inference issues detected by JET (that happens automatically thanks to our CI running test/test_jet.jl).