From 61ef5f58384a67b837afaf5052dedae2ca54ef86 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Mon, 27 Nov 2023 01:32:29 +0300 Subject: [PATCH] Provide `Base.oneunit()` ``` julia> euclidean(a, b) ERROR: MethodError: no method matching VariableRef(::AffExpr) Closest candidates are: (::Type{GenericVariableRef{T}} where T)(::Any, ::Any) @ JuMP ~/.julia/packages/JuMP/h0lrf/src/variables.jl:251 GenericVariableRef{T}(::ConstraintRef{GenericModel{T}, <:MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex}}) where T @ JuMP ~/.julia/packages/JuMP/h0lrf/src/variables.jl:520 GenericVariableRef{T}(::GenericModel{T}) where T @ JuMP ~/.julia/packages/JuMP/h0lrf/src/variables.jl:494 Stacktrace: [1] oneunit(#unused#::Type{VariableRef}) @ Base ./number.jl:370 [2] _eval_start(d::Euclidean, #unused#::Type{VariableRef}, #unused#::Type{VariableRef}, #unused#::Nothing) @ Distances ~/.julia/packages/Distances/PvoXa/src/metrics.jl:320 [3] _eval_start(d::Euclidean, #unused#::Type{VariableRef}, #unused#::Type{VariableRef}) @ Distances ~/.julia/packages/Distances/PvoXa/src/metrics.jl:318 [4] eval_start(d::Euclidean, a::VariableRef, b::VariableRef) @ Distances ~/.julia/packages/Distances/PvoXa/src/metrics.jl:317 [5] _evaluate(d::Euclidean, a::VariableRef, b::VariableRef, #unused#::Nothing) @ Distances ~/.julia/packages/Distances/PvoXa/src/metrics.jl:236 [6] (::Euclidean)(a::VariableRef, b::VariableRef) @ Distances ~/.julia/packages/Distances/PvoXa/src/metrics.jl:328 [7] top-level scope @ REPL[8]:1 ``` --- src/aff_expr.jl | 6 ++++++ src/variables.jl | 6 ++++++ test/test_variable.jl | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/aff_expr.jl b/src/aff_expr.jl index 86570a9ad2b..4c76f6ddc2e 100644 --- a/src/aff_expr.jl +++ b/src/aff_expr.jl @@ -204,8 +204,14 @@ function Base.one(::Type{GenericAffExpr{C,V}}) where {C,V} return GenericAffExpr{C,V}(one(C), OrderedDict{V,C}()) end +function Base.oneunit(::Type{GenericAffExpr{C,V}}) where {C,V} + return GenericAffExpr{C,V}(oneunit(C), OrderedDict{V,C}()) +end + Base.one(a::GenericAffExpr) = one(typeof(a)) +Base.oneunit(a::GenericAffExpr) = oneunit(typeof(a)) + Base.copy(a::GenericAffExpr) = GenericAffExpr(copy(a.constant), copy(a.terms)) Base.broadcastable(a::GenericAffExpr) = Ref(a) diff --git a/src/variables.jl b/src/variables.jl index 203722e9e00..7a4a16b5088 100644 --- a/src/variables.jl +++ b/src/variables.jl @@ -361,10 +361,16 @@ end Base.one(v::AbstractVariableRef) = one(typeof(v)) +Base.oneunit(v::AbstractVariableRef) = oneunit(typeof(v)) + function Base.one(::Type{V}) where {V<:AbstractVariableRef} return one(GenericAffExpr{value_type(V),V}) end +function Base.oneunit(::Type{V}) where {V<:AbstractVariableRef} + return oneunit(GenericAffExpr{value_type(V),V}) +end + """ coefficient(v1::GenericVariableRef{T}, v2::GenericVariableRef{T}) where {T} diff --git a/test/test_variable.jl b/test/test_variable.jl index 773c2527a2d..c3006b610c6 100644 --- a/test/test_variable.jl +++ b/test/test_variable.jl @@ -1616,4 +1616,14 @@ function test_variable_eltype() return end +function test_variable_one() + model = Model() + @variable(model, x) + @test Base.one(x) == 1 + @test Base.one(2 * x) == 1 + @test Base.oneunit(x) == 1 + @test Base.oneunit(2 * x) == 1 + return +end + end # module TestVariable