jump-dev / MutableArithmetics.jl

Interface for arithmetics on mutable types in Julia
Mozilla Public License 2.0
49 stars 8 forks source link

MOI failure on nightly #260

Closed odow closed 7 months ago

odow commented 7 months ago

When 2 * f is not f *2...

julia> import MathOptInterface as MOI

julia> import LinearAlgebra

julia> x = MOI.VariableIndex(1)
MOI.VariableIndex(1)

julia> f = LinearAlgebra.Symmetric([2*x*x 0; 0 0])
2×2 LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{Int64}, Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}}:
 (0) + 2.0 MOI.VariableIndex(1)²  (0)
 (0)                              (0)

julia> MutableArithmetics.add_mul(f, 2, 2 * f)
2×2 LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{Int64}, Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}}:
 (0) + 8.0 MOI.VariableIndex(1)² + 2.0 MOI.VariableIndex(1)²  (0)
 (0)                                                          (0)

julia> MutableArithmetics.add_mul(f, 2, f * 2)
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] getindex
    @ ./essentials.jl:892 [inlined]
  [2] getindex
    @ ./array.jl:915 [inlined]
  [3] getindex
    @ ./multidimensional.jl:700 [inlined]
  [4] _broadcast_getindex
    @ ./broadcast.jl:639 [inlined]
  [5] _getindex
    @ ./broadcast.jl:670 [inlined]
  [6] _getindex
    @ ./broadcast.jl:669 [inlined]
  [7] _broadcast_getindex
    @ ./broadcast.jl:645 [inlined]
  [8] getindex
    @ ./broadcast.jl:605 [inlined]
  [9] macro expansion
    @ ./broadcast.jl:968 [inlined]
 [10] macro expansion
    @ ./simdloop.jl:77 [inlined]
 [11] copyto!
    @ ./broadcast.jl:967 [inlined]
 [12] copyto!
    @ ./broadcast.jl:920 [inlined]
 [13] copy
    @ ./broadcast.jl:892 [inlined]
 [14] materialize
    @ ./broadcast.jl:867 [inlined]
 [15] broadcast_preserving_zero_d
    @ ./broadcast.jl:856 [inlined]
 [16] *(A::Int64, B::Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}})
    @ Base ./arraymath.jl:21
 [17] *
    @ ~/.julia/packages/MutableArithmetics/NIXlP/src/dispatch.jl:478 [inlined]
 [18] muladd(x::Int64, y::LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{…}, Matrix{…}}, z::LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{…}, Matrix{…}})
    @ Base.Math ./math.jl:1562
 [19] add_mul(a::LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{…}, Matrix{…}}, b::Int64, c::LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{…}, Matrix{…}})
    @ MutableArithmetics ~/.julia/packages/MutableArithmetics/NIXlP/src/MutableArithmetics.jl:27
 [20] top-level scope
    @ REPL[94]:1
Some type information was truncated. Use `show(err)` to see complete types.
odow commented 7 months ago
julia> x = MOI.VariableIndex(1)
MOI.VariableIndex(1)

julia> f = LinearAlgebra.Symmetric([2*x*x 0; 0 0])
2×2 LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{Int64}, Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}}:
 (0) + 2.0 MOI.VariableIndex(1)²  (0)
 (0)                              (0)

julia> 2 * (f * 2)
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] getindex
    @ ./essentials.jl:892 [inlined]
  [2] getindex
    @ ./array.jl:915 [inlined]
  [3] getindex
    @ ./multidimensional.jl:700 [inlined]
  [4] _broadcast_getindex
    @ ./broadcast.jl:639 [inlined]
  [5] _getindex
    @ ./broadcast.jl:670 [inlined]
  [6] _getindex
    @ ./broadcast.jl:669 [inlined]
  [7] _broadcast_getindex
    @ ./broadcast.jl:645 [inlined]
  [8] getindex
    @ ./broadcast.jl:605 [inlined]
  [9] macro expansion
    @ ./broadcast.jl:968 [inlined]
 [10] macro expansion
    @ ./simdloop.jl:77 [inlined]
 [11] copyto!
    @ ./broadcast.jl:967 [inlined]
 [12] copyto!
    @ ./broadcast.jl:920 [inlined]
 [13] copy
    @ ./broadcast.jl:892 [inlined]
 [14] materialize
    @ ./broadcast.jl:867 [inlined]
 [15] broadcast_preserving_zero_d
    @ ./broadcast.jl:856 [inlined]
 [16] *(A::Int64, B::Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}})
    @ Base ./arraymath.jl:21
 [17] *(α::Int64, A::LinearAlgebra.Symmetric{MathOptInterface.ScalarQuadraticFunction{Int64}, Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}})
    @ MutableArithmetics ~/.julia/packages/MutableArithmetics/NIXlP/src/dispatch.jl:478
 [18] top-level scope
    @ REPL[102]:1
odow commented 7 months ago
julia> (2 * f).data
2×2 Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}:
 (0) + 4.0 MOI.VariableIndex(1)²  (0)
 (0)                              (0)

julia> (f * 2).data
2×2 Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}:
    (0) + 4.0 MOI.VariableIndex(1)²  (0)
 #undef                              (0)
odow commented 7 months ago

On Julia 1.10

julia> (f * 2).data
2×2 Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}:
 (0) + 4.0 MOI.VariableIndex(1)²  (0)
 (0)                              (0)

julia> (2 * f).data
2×2 Matrix{MathOptInterface.ScalarQuadraticFunction{Int64}}:
 (0) + 4.0 MOI.VariableIndex(1)²  (0)
 (0)                              (0)
odow commented 7 months ago

Looks like the cause was https://github.com/JuliaLang/julia/pull/52942, which added an optimization to only modify the relevant upper or lower triangle. That's probably fair.

We need to update:

https://github.com/jump-dev/MutableArithmetics.jl/blob/48569d20f5114e898c2ebcead966b9f5530696b9/src/dispatch.jl#L475-L497