Skip to content

Derive the rounding functions from the 2-/3-arg round - #228

Merged
kimikage merged 1 commit into
JuliaGraphics:masterfrom
kimikage:round_funcs
Oct 26, 2026
Merged

kimikage merged 1 commit into
JuliaGraphics:masterfrom
kimikage:round_funcs

Conversation

@kimikage

@kimikage kimikage commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

This is the same type of invalidation measure as JuliaMath/FixedPointNumbers.jl#336
(Specifying RoundingMode is supported in FPN v0.8.0 or later JuliaMath/FixedPointNumbers.jl@265d0af)

julia> round(Gray(0.5), RoundNearest)
ERROR: MethodError: no method matching round(::Gray{Float64}, ::RoundingMode{:Nearest}) # before
Gray{Float64}(0.0) # after

@codecov

codecov Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.63%. Comparing base (800fc71) to head (f502412).

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #228   +/-   ##
=======================================
  Coverage   99.62%   99.63%           
=======================================
  Files           3        3           
  Lines         268      272    +4     
=======================================
+ Hits          267      271    +4     
  Misses          1        1           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@kimikage kimikage changed the title Derive the rounding functions from the 2-/3-arg round [WIP] Derive the rounding functions from the 2-/3-arg round Oct 25, 2026
@kimikage
kimikage marked this pull request as draft October 25, 2026 16:53
@kimikage
kimikage marked this pull request as ready for review October 26, 2026 11:29
@kimikage kimikage changed the title [WIP] Derive the rounding functions from the 2-/3-arg round Derive the rounding functions from the 2-/3-arg round Oct 26, 2026
@kimikage

Copy link
Copy Markdown
Collaborator Author

#227 (comment)

After (with FPN 0.9.2) on Julia v1.13.2:

julia> trees = invalidation_trees(invs)
10-element Vector{SnoopCompile.MethodInvalidations}:
 inserting checked_mul(x::Real, ::Type{X}) where X<:FixedPoint @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:62 invalidated:
   mt_backedges: 1: signature Tuple{typeof(Base.Checked.checked_mul), Int64, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Int64, ::Any) (0 children)
                 2: signature Tuple{typeof(Base.Checked.checked_mul), Int64, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Int64, ::Any) (0 children)

 inserting reinterpret(::Type{X}, x::T) where {T<:Integer, X<:(FixedPoint{T})} @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:48 invalidated:
   backedges: 1: superseding reinterpret(::Type{Out}, x) where Out @ Base essentials.jl:785 with MethodInstance for reinterpret(::Type, ::UInt16) (1 children)

 inserting promote_rule(::Type{X1}, ::Type{X2}) where {T1, f1, X1<:FixedPoint{T1, f1}, T2, f2, X2<:FixedPoint{T2, f2}} @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:536 invalidated:
   backedges: 1: superseding promote_rule(::Type, ::Type) @ Base promotion.jl:334 with MethodInstance for promote_rule(::Type, ::Type) (4 children)

 inserting Float64(x::FixedPointNumbers.Normed{UInt128, f}) where f @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/normed.jl:235 invalidated:
   mt_backedges: 1: signature Tuple{Type{Float64}, Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Vector{Number}}) (2 children)
                 2: signature Tuple{Type{Float64}, Any} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Matrix{Any}}) (2 children)
                 3: signature Tuple{Type{Float64}, Any} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Vector{Any}}) (2 children)

 inserting promote_rule(::Type{T}, ::Type{C}) where {T<:Real, C<:AbstractGray} @ ColorVectorSpace ~/.julia/dev/ColorVectorSpace/src/ColorVectorSpace.jl:37 invalidated:
   backedges: 1: superseding promote_rule(::Type, ::Type) @ Base promotion.jl:334 with MethodInstance for promote_rule(::Type{Num}, ::DataType) (8 children)

 inserting (::Type{Ti})(x::FixedPointNumbers.FixedPoint) where Ti<:Integer @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:86 invalidated:
   mt_backedges: 1: signature Tuple{Type{Int64}, Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Int64}, ::Tuple{Vector{Number}}) (10 children)

 inserting reduce_first(::typeof(Base.mul_prod), x::FixedPointNumbers.FixedPoint) @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:563 invalidated:
   backedges: 1: superseding reduce_first(::typeof(Base.mul_prod), x) @ Base reduce.jl:408 with MethodInstance for Base.reduce_first(::typeof(Base.mul_prod), ::Any) (33 children)

 inserting checked_mul(x::X, y::X) where X<:FixedPoint @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:290 invalidated:
   mt_backedges: 1: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for checked_mul(::Int64, ::Integer) (0 children)
                 2: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for checked_mul(::Int64, ::Integer) (3 children)
                 3: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Any, ::Any) (31 children)

 inserting reduce_first(::typeof(Base.add_sum), x::FixedPointNumbers.FixedPoint) @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:560 invalidated:
   backedges: 1: superseding reduce_first(::typeof(Base.add_sum), x) @ Base reduce.jl:405 with MethodInstance for Base.reduce_first(::typeof(Base.add_sum), ::Any) (273 children)

 inserting -(x::X) where X<:FixedPoint @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/l6dW1/src/FixedPointNumbers.jl:332 invalidated:
   mt_backedges: 1: signature Tuple{typeof(-), Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::typeof(-), ::Tuple{Vector{Number}}) (20 children)
                 2: signature Tuple{typeof(-), Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::typeof(-), ::Tuple{Vector{Number}}) (1140 children)

@kimikage
kimikage merged commit f3253e4 into JuliaGraphics:master Oct 26, 2026
11 checks passed
@kimikage
kimikage deleted the round_funcs branch October 27, 2026 03:47
@kimikage

kimikage commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator Author

Around the time of this change, Julia v1.13.3, MTK v11.46.0, and FPN v0.9.3 were released.
The issue with print_matrix_row seems to arise from an interaction with FPN v0.9.3 (cf. JuliaMath/FixedPointNumbers.jl#352) rather than CVS, though it is somewhat strange.

julia> trees = invalidation_trees(invs)
11-element Vector{SnoopCompile.MethodInvalidations}:
 inserting promote_rule(::Type{X1}, ::Type{X2}) where {X1<:FixedPoint, X2<:FixedPoint} @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:543 invalidated:
   backedges: 1: superseding promote_rule(::Type, ::Type) @ Base promotion.jl:334 with MethodInstance for promote_rule(::Type, ::Type) (4 children)

 inserting Float64(x::FixedPointNumbers.Normed{UInt128, f}) where f @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/normed.jl:235 invalidated:
   mt_backedges: 1: signature Tuple{Type{Float64}, Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Vector{Number}}) (2 children)
                 2: signature Tuple{Type{Float64}, Any} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Matrix{Any}}) (2 children)
                 3: signature Tuple{Type{Float64}, Any} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Float64}, ::Tuple{Vector{Any}}) (2 children)

 inserting promote_rule(::Type{T}, ::Type{C}) where {T<:Real, C<:AbstractGray} @ ColorVectorSpace ~/.julia/dev/ColorVectorSpace/src/ColorVectorSpace.jl:37 invalidated:
   backedges: 1: superseding promote_rule(::Type, ::Type) @ Base promotion.jl:334 with MethodInstance for promote_rule(::Type{Num}, ::DataType) (8 children)

 inserting (::Type{Ti})(x::FixedPointNumbers.FixedPoint) where Ti<:Integer @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:86 invalidated:
   mt_backedges: 1: signature Tuple{Type{Int64}, Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::Type{Int64}, ::Tuple{Vector{Number}}) (10 children)

 inserting reduce_first(::typeof(Base.mul_prod), x::FixedPointNumbers.FixedPoint) @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:609 invalidated:
   backedges: 1: superseding reduce_first(::typeof(Base.mul_prod), x) @ Base reduce.jl:408 with MethodInstance for Base.reduce_first(::typeof(Base.mul_prod), ::Any) (16 children)

 inserting print_matrix_row(io::IO, X::Union{BlockArrays.AbstractBlockedUnitRange, LinearAlgebra.Diagonal{<:Any, <:BlockArrays.AbstractBlockedUnitRange}}, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ BlockArrays ~/.julia/packages/BlockArrays/zrp8h/src/show.jl:122 invalidated:
   backedges: 1: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.PipeEndpoint}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              2: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.TTY}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              3: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{IOBuffer}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (9 children)

 inserting print_matrix_row(io::IO, X::Union{SubArray{<:Any, 2, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.Adjoint{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.Adjoint{<:Any, <:ArrayLayouts.LayoutVector}, LinearAlgebra.Diagonal{<:Any, <:ArrayLayouts.LayoutVector}, LinearAlgebra.Hermitian{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.LowerTriangular{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.Symmetric{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.Transpose{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.Transpose{<:Any, <:ArrayLayouts.LayoutVector}, LinearAlgebra.UnitLowerTriangular{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.UnitUpperTriangular{<:Any, <:ArrayLayouts.LayoutMatrix}, LinearAlgebra.UpperTriangular{<:Any, <:ArrayLayouts.LayoutMatrix}, ArrayLayouts.LayoutMatrix, ArrayLayouts.LayoutVector}, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ ArrayLayouts ~/.julia/packages/ArrayLayouts/RowRw/src/ArrayLayouts.jl:421 invalidated:
   backedges: 1: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.PipeEndpoint}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              2: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.TTY}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              3: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{IOBuffer}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (9 children)

 inserting print_matrix_row(io::IO, X::Union{FillArrays.AbstractFill{T, 1} where T, FillArrays.AbstractFill{T, 2} where T, FillArrays.OffDiagonal, FillArrays.RectDiagonal, LinearAlgebra.Diagonal{<:Any, <:FillArrays.AbstractFill{T, 1} where T}, LinearAlgebra.LowerTriangular{<:Any, <:FillArrays.AbstractFill{T, 2} where T}, LinearAlgebra.UnitLowerTriangular{<:Any, <:FillArrays.AbstractFill{T, 2} where T}, LinearAlgebra.UnitUpperTriangular{<:Any, <:FillArrays.AbstractFill{T, 2} where T}, LinearAlgebra.UpperTriangular{<:Any, <:FillArrays.AbstractFill{T, 2} where T}}, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ FillArrays ~/.julia/packages/FillArrays/n8fAM/src/FillArrays.jl:735 invalidated:
   backedges: 1: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.PipeEndpoint}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              2: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{Base.TTY}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (5 children)
              3: superseding print_matrix_row(io::IO, X::AbstractVecOrMat, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString, idxlast::Integer) @ Base arrayshow.jl:97 with MethodInstance for Base.print_matrix_row(::IOContext{IOBuffer}, ::AbstractVecOrMat, ::Vector{Tuple{Int64, Int64}}, ::Int64, ::Vector{Int64}, ::String, ::Int64) (9 children)

 inserting checked_mul(x::Real, ::Type{X}) where X<:FixedPoint @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:62 invalidated:
   mt_backedges: 1: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for checked_mul(::Int64, ::Integer) (0 children)
                 2: signature Tuple{typeof(Base.Checked.checked_mul), Int64, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Int64, ::Any) (0 children)
                 3: signature Tuple{typeof(Base.Checked.checked_mul), Int64, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Int64, ::Any) (0 children)
                 4: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for checked_mul(::Int64, ::Integer) (3 children)
                 5: signature Tuple{typeof(Base.Checked.checked_mul), Any, Any} triggered MethodInstance for (::Base.BottomRF{typeof(Base.Checked.checked_mul)})(::Any, ::Any) (31 children)

 inserting reduce_first(::typeof(Base.add_sum), x::FixedPointNumbers.FixedPoint) @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:606 invalidated:
   backedges: 1: superseding reduce_first(::typeof(Base.add_sum), x) @ Base reduce.jl:405 with MethodInstance for Base.reduce_first(::typeof(Base.add_sum), ::Any) (307 children)

 inserting -(x::X) where X<:FixedPoint @ FixedPointNumbers ~/.julia/packages/FixedPointNumbers/KYrgV/src/FixedPointNumbers.jl:332 invalidated:
   mt_backedges: 1: signature Tuple{typeof(-), Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::typeof(-), ::Tuple{Vector{Number}}) (9 children)
                 2: signature Tuple{typeof(-), Number} triggered MethodInstance for Base.Broadcast.combine_eltypes(::typeof(-), ::Tuple{Vector{Number}}) (1130 children)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant