Skip to content

Commit bfc8efb

Browse files
authored
Merge pull request #61 from SymbolicML/uconvert-array
Add `uconvert` method for `QuantityArray`
2 parents 0c665e2 + 3333cd9 commit bfc8efb

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/symbolic_dimensions.jl

+10
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ function expand_units(q::Q) where {T,R,D<:SymbolicDimensions{R},Q<:AbstractQuant
106106
return convert(constructor_of(Q){T,Dimensions{R}}, q)
107107
end
108108
expand_units(q::QuantityArray) = expand_units.(q)
109+
# TODO: Make the array-based one more efficient
109110

110111
"""
111112
uconvert(qout::AbstractQuantity{<:Any, <:SymbolicDimensions}, q::AbstractQuantity{<:Any, <:Dimensions})
@@ -121,6 +122,15 @@ function uconvert(qout::AbstractQuantity{<:Any, <:SymbolicDimensions}, q::Abstra
121122
new_dim = dimension(qout)
122123
return new_quantity(typeof(q), new_val, new_dim)
123124
end
125+
function uconvert(qout::AbstractQuantity{<:Any,<:SymbolicDimensions}, q::QuantityArray{<:Any,<:Any,<:Dimensions})
126+
@assert isone(ustrip(qout)) "You passed a quantity with a non-unit value to uconvert."
127+
qout_expanded = expand_units(qout)
128+
dimension(q) == dimension(qout_expanded) || throw(DimensionError(q, qout_expanded))
129+
new_array = ustrip(q) ./ ustrip(qout_expanded)
130+
new_dim = dimension(qout)
131+
return QuantityArray(new_array, new_dim, quantity_type(q))
132+
end
133+
# TODO: Method for converting SymbolicDimensions -> SymbolicDimensions
124134

125135
"""
126136
uconvert(qout::AbstractQuantity{<:Any, <:SymbolicDimensions})

test/unittests.jl

+16
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,22 @@ end
613613
qs = uconvert(convert(Quantity{Float16}, us"g"), 5 * q)
614614
@test typeof(qs) <: Quantity{Float16,<:SymbolicDimensions{<:Any}}
615615
@test qs 7.5us"g"
616+
617+
# Arrays
618+
x = [1.0, 2.0, 3.0] .* u"kg"
619+
xs = x .|> uconvert(us"g")
620+
@test typeof(xs) <: Vector{<:Quantity{Float64,<:SymbolicDimensions{<:Any}}}
621+
@test xs[2] 2000us"g"
622+
623+
x_qa = QuantityArray(x)
624+
xs_qa = x_qa .|> uconvert(us"g")
625+
@test typeof(xs_qa) <: QuantityArray{Float64,1,<:SymbolicDimensions{<:Any}}
626+
@test xs_qa[2] 2000us"g"
627+
628+
# Without vectorized call:
629+
xs_qa2 = x_qa |> uconvert(us"g")
630+
@test typeof(xs_qa2) <: QuantityArray{Float64,1,<:SymbolicDimensions{<:Any}}
631+
@test xs_qa2[2] 2000us"g"
616632
end
617633

618634
@testset "Test ambiguities" begin

0 commit comments

Comments
 (0)