JuliaAttic / QuBase.jl

A foundational library for quantum mechanics in Julia
Other
43 stars 6 forks source link

Problem with QuArray type promotion #41

Open acroy opened 9 years ago

acroy commented 9 years ago

There is a problem with our type promotion for QuArrays:

julia> sigmax
2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
 1.0 0.0]

julia> sigmay
2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},2}
Complex{Float64}[0.0 + 0.0im -0.0 - 1.0im
                 0.0 + 1.0im 0.0 + 0.0im]

julia> promote(sigmax,sigmay)
(2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
 1.0 0.0],2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},2}
Complex{Float64}[0.0 + 0.0im -0.0 - 1.0im
                 0.0 + 1.0im 0.0 + 0.0im])

The issue seems to be that (with Julia 0.3)

julia> promote_type(Array{Float64,2},Array{Complex128,2})
Array{T,N} (constructor with 9 methods)

So maybe this is actually an issue of Julia Base (0.3)? Any ideas?

jrevels commented 9 years ago

Yeah, it's just poorly defined in Base (I commented on this a while ago). Note that it is well-defined in v0.4:

julia> promote_type(Array{Float64,2},Array{Complex128,2})
Array{Complex{Float64},2}

We could always patch this ourselves by defining the below internally:

Base.promote_rule{A,B,N}(::Type{Array{A,N}}, ::Type{Array{B,N}}) = Array{promote_type(A,B),N}

Or just give up on v0.3 and switch to v0.4, which is actually starting to sound like a reasonable decision...at this point, it doesn't appear that QuBase.jl will be released by the time that v0.4 releases, so we might as well switch over so that we don't release on an old version.

acroy commented 9 years ago

Thanks @jrevels. Good to know that it is fixed in 0.4.

I don't know the schedule for releasing 0.4 since I didn't (couldn't) follow the developments over summer. Since it is not very complex, we could also just add your patch conditional on the version of Julia. Then we don't have to give up 0.3 immediately ...