QuantumClifford.jl icon indicating copy to clipboard operation
QuantumClifford.jl copied to clipboard

MixedDestabilizer constructor has too restrictive typeassert making it break on subarray input

Open Krastanov opened this issue 2 years ago • 0 comments

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).

Krastanov avatar Sep 27 '23 14:09 Krastanov