SymbolicML / DynamicQuantities.jl

Efficient and type-stable physical quantities in Julia
https://symbolicml.org/DynamicQuantities.jl/dev/
Apache License 2.0
132 stars 17 forks source link

`map` fails with `QuantityArray` #94

Closed jkrumbiegel closed 10 months ago

jkrumbiegel commented 10 months ago
julia> map(identity, [us"hr"])
1-element Vector{DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}}:
 1.0 hr

julia> map(identity, QuantityArray([us"hr"]))
ERROR: TypeError: in typeassert, expected AbstractVector{<:DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}}, got a value of type QuantityArray{DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}}}
Stacktrace:
 [1] _collect(c::QuantityArray{Float64, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{Float64}}, itr::Base.Generator{QuantityArray{Float64, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{Float64}}, typeof(identity)}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1})
   @ Base ./array.jl:812
 [2] collect_similar(cont::QuantityArray{Float64, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{Float64}}, itr::Base.Generator{QuantityArray{Float64, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{Float64}}, typeof(identity)})
   @ Base ./array.jl:711
 [3] map(f::Function, A::QuantityArray{Float64, 1, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}, DynamicQuantities.Quantity{Float64, SymbolicDimensions{DynamicQuantities.FixedRational{Int32, 25200}}}, Vector{Float64}})
   @ Base ./abstractarray.jl:3263
 [4] top-level scope
   @ REPL[92]:1

version is [06fc5a27] DynamicQuantities v0.10.0

MilesCranmer commented 10 months ago

Thanks for this! Very strange. I wonder what method we need to overload here?

gaurav-arya commented 10 months ago

QuantityArray's feel somewhat similar to StructArrays in the sense that both construct the struct on the fly in getindex, so I'm wondering (without much knowledge at all of the details) if templating off https://github.com/JuliaArrays/StructArrays.jl/blob/99f05561cab19fb23f478a12a8429764871ccff3/src/structarray.jl would make sense in terms of getting the logic correct?

MilesCranmer commented 10 months ago

Fixed with #95

Sorry just saw your comment @gaurav-arya. I think that's a good idea!