From 94ae24537dfc207b3d82c149fc6982b5f0a21373 Mon Sep 17 00:00:00 2001 From: Simon Byrne Date: Tue, 16 Jan 2018 11:31:07 -0800 Subject: [PATCH 1/2] Update reduction machinery for 0.7 The promotion machinery for reduction in sum/prod was changed in https://github.com/JuliaLang/julia/pull/25051. This updates the use. --- src/FixedPointNumbers.jl | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/FixedPointNumbers.jl b/src/FixedPointNumbers.jl index ec51d5d7..d30f12aa 100644 --- a/src/FixedPointNumbers.jl +++ b/src/FixedPointNumbers.jl @@ -10,7 +10,7 @@ import Base: ==, <, <=, -, +, *, /, ~, isapprox, zero, oneunit, one, typemin, typemax, realmin, realmax, eps, sizeof, reinterpret, float, trunc, round, floor, ceil, bswap, div, fld, rem, mod, mod1, fld1, min, max, minmax, - start, next, done, reducedim_init, rand + start, next, done, rand if isdefined(Base, :rem1) import Base: rem1 end @@ -134,20 +134,27 @@ sizeof(::Type{T}) where {T <: FixedPoint} = sizeof(rawtype(T)) # Promotions for reductions const Treduce = Float64 if isdefined(Base, :r_promote) + # Julia v0.6 Base.r_promote(::typeof(+), x::FixedPoint{T}) where {T} = Treduce(x) Base.r_promote(::typeof(*), x::FixedPoint{T}) where {T} = Treduce(x) + Base.reducedim_init(f::typeof(identity), + op::typeof(+), + A::AbstractArray{T}, region) where {T <: FixedPoint} = + Base.reducedim_initarray(A, region, zero(Treduce)) + Base.reducedim_init(f::typeof(identity), + op::typeof(*), + A::AbstractArray{T}, region) where {T <: FixedPoint} = + Base.reducedim_initarray(A, region, oneunit(Treduce)) else - Base.promote_sys_size(::Type{<:FixedPoint}) = Treduce + # Julia v0.7 + Base.add_sum(x::FixedPoint, y::FixedPoint) = Treduce(x) + Treduce(y) + Base.reduce_empty(::typeof(Base.add_sum), ::Type{F}) where {F<:FixedPoint} = zero(Treduce) + Base.reduce_first(::typeof(Base.add_sum), x::FixedPoint) = Treduce(x) + Base.mul_prod(x::FixedPoint, y::FixedPoint) = Treduce(x) * Treduce(y) + Base.reduce_empty(::typeof(Base.mul_prod), ::Type{F}) where {F<:FixedPoint} = one(Treduce) + Base.reduce_first(::typeof(Base.mul_prod), x::FixedPoint) = Treduce(x) end -reducedim_init(f::typeof(identity), - op::typeof(+), - A::AbstractArray{T}, region) where {T <: FixedPoint} = - reducedim_initarray(A, region, zero(Treduce)) -reducedim_init(f::typeof(identity), - op::typeof(*), - A::AbstractArray{T}, region) where {T <: FixedPoint} = - reducedim_initarray(A, region, oneunit(Treduce)) for f in (:div, :fld, :fld1) @eval begin From f0c718b5746b2b971229c36a372e99d0236c0fa2 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Wed, 31 Jan 2018 20:54:13 +0100 Subject: [PATCH 2/2] Resolve some ambiguities --- src/fixed.jl | 1 + src/normed.jl | 1 + test/normed.jl | 8 ++++++-- test/runtests.jl | 4 +++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/fixed.jl b/src/fixed.jl index f1f6f713..29340540 100644 --- a/src/fixed.jl +++ b/src/fixed.jl @@ -6,6 +6,7 @@ struct Fixed{T <: Signed,f} <: FixedPoint{T, f} # selected by passing an extra dummy argument Fixed{T, f}(i::Integer, _) where {T,f} = new{T, f}(i % T) Fixed{T, f}(x) where {T,f} = convert(Fixed{T,f}, x) + Fixed{T, f}(x::Fixed{T,f}) where {T,f} = x end reinterpret(::Type{Fixed{T,f}}, x::T) where {T <: Signed,f} = Fixed{T,f}(x, 0) diff --git a/src/normed.jl b/src/normed.jl index ef670748..934f728e 100644 --- a/src/normed.jl +++ b/src/normed.jl @@ -6,6 +6,7 @@ struct Normed{T<:Unsigned,f} <: FixedPoint{T,f} Normed{T, f}(i::Integer,_) where {T,f} = new{T, f}(i%T) # for setting by raw representation Normed{T, f}(x) where {T,f} = convert(Normed{T,f}, x) + Normed{T, f}(x::Normed{T,f}) where {T,f} = x end typechar(::Type{X}) where {X <: Normed} = 'N' diff --git a/test/normed.jl b/test/normed.jl index 35642665..3bc892b1 100644 --- a/test/normed.jl +++ b/test/normed.jl @@ -146,7 +146,7 @@ end function testtrunc(inc::T) where {T} incf = convert(Float64, inc) tm = reinterpret(typemax(T))/reinterpret(one(T)) - x = zero(T) + local x = zero(T) for i = 0 : min(1e6, reinterpret(typemax(T))-1) xf = incf*i try @@ -305,7 +305,11 @@ end @test N0f16(Float16(1.0)) === N0f16(1.0) @test Float16(1.0) % N0f16 === N0f16(1.0) -if VERSION >= v"0.7.0-DEV.1790" +if VERSION >= v"0.7.0-DEV.2657" + a = N0f8[0.2, 0.4] + @test summary(a) == "2-element Array{N0f8,1} with eltype Normed{UInt8,8}" + @test summary(view(a, 1:2)) == "2-element view(::Array{N0f8,1}, 1:2) with eltype Normed{UInt8,8}" +elseif VERSION >= v"0.7.0-DEV.1790" a = N0f8[0.2, 0.4] @test summary(a) == "2-element Array{N0f8,1} with eltype FixedPointNumbers.Normed{UInt8,8}" @test summary(view(a, 1:2)) == "2-element view(::Array{N0f8,1}, 1:2) with eltype FixedPointNumbers.Normed{UInt8,8}" diff --git a/test/runtests.jl b/test/runtests.jl index 137b6e7c..ecc6566b 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,8 @@ using FixedPointNumbers, Base.Test -@test isempty(detect_ambiguities(FixedPointNumbers, Base, Core)) +if VERSION < v"0.7.0-" + @test isempty(detect_ambiguities(FixedPointNumbers, Base, Core)) +end for f in ["normed.jl", "fixed.jl"] println("Testing $f")