From 81c5b88611cf2e19ed9ad45f536ef7f555cf1bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 22 Sep 2026 11:03:31 +0200 Subject: [PATCH] Fix inferenceof eval_variables --- src/Utilities/functions.jl | 25 ++++++++++++++++++++----- test/Utilities/test_functions.jl | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index 39fffd6169..ba69f0893e 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -130,7 +130,10 @@ end eval_variables(value_fn::Function, f::MOI.VariableIndex) = value_fn(f) -function eval_variables(value_fn::Function, f::MOI.ScalarAffineFunction) +function eval_variables( + value_fn::F, + f::MOI.ScalarAffineFunction, +) where {F<:Function} out = f.constant for t in f.terms out += eval_variables(value_fn, t) @@ -138,7 +141,10 @@ function eval_variables(value_fn::Function, f::MOI.ScalarAffineFunction) return out end -function eval_variables(value_fn::Function, f::MOI.ScalarQuadraticFunction) +function eval_variables( + value_fn::F, + f::MOI.ScalarQuadraticFunction, +) where {F<:Function} out = f.constant for a in f.affine_terms out += eval_variables(value_fn, a) @@ -149,11 +155,17 @@ function eval_variables(value_fn::Function, f::MOI.ScalarQuadraticFunction) return out end -function eval_variables(value_fn::Function, f::MOI.VectorOfVariables) +function eval_variables( + value_fn::F, + f::MOI.VectorOfVariables, +) where {F<:Function} return map(value_fn, f.variables) end -function eval_variables(value_fn::Function, f::MOI.VectorAffineFunction) +function eval_variables( + value_fn::F, + f::MOI.VectorAffineFunction, +) where {F<:Function} out = copy(f.constants) for t in f.terms out[t.output_index] += eval_variables(value_fn, t.scalar_term) @@ -161,7 +173,10 @@ function eval_variables(value_fn::Function, f::MOI.VectorAffineFunction) return out end -function eval_variables(value_fn::Function, f::MOI.VectorQuadraticFunction) +function eval_variables( + value_fn::F, + f::MOI.VectorQuadraticFunction, +) where {F<:Function} out = copy(f.constants) for t in f.affine_terms out[t.output_index] += eval_variables(value_fn, t.scalar_term) diff --git a/test/Utilities/test_functions.jl b/test/Utilities/test_functions.jl index 01d477af56..b49427bf65 100644 --- a/test/Utilities/test_functions.jl +++ b/test/Utilities/test_functions.jl @@ -221,6 +221,21 @@ function test_eval_variables() @test MOI.output_dimension(fvq) == 2 @test MOI.Utilities.eval_variables(vi -> vals[vi], fvq) ≈ [13, 1] @test MOI.Utilities.eval_variables(vi -> vals[vi], fvq) ≈ [13, 1] + model = MOI.Utilities.Model{Float64}() + value_fn = vi -> vals[vi] + for (func, expected) in ( + (z, 5), + (fvv, [3, 5, 1]), + (fsa, 22.0), + (fva, [12.0, 7.0]), + (fsq, 16.0), + (fvq, [13.0, 1.0]), + ) + @test (@inferred MOI.Utilities.eval_variables(value_fn, func)) == + expected + @test (@inferred MOI.Utilities.eval_variables(value_fn, model, func)) == + expected + end return end