From 2e7e4925290b439a0c5ca2e67ae2df1243345716 Mon Sep 17 00:00:00 2001 From: odow Date: Fri, 28 May 2021 09:54:23 +1200 Subject: [PATCH 1/2] Document and test zero_with_output_dimension --- src/Utilities/functions.jl | 12 ++++++++++++ test/Utilities/functions.jl | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index a30cf17921..e4e5b1c061 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -566,15 +566,27 @@ function Base.getindex( return MOI.VectorQuadraticFunction(vat, vqt, it.f.constants[output_indices]) end +""" + zero_with_output_dimension(::Type{T}, output_dimension::Integer) where {T} + +Create an instance of type `T` with the output dimension `output_dimension`. + +This is mostly useful in Bridges, when code needs to be agnostic to the type of +vector-valued function that is passed in. +""" +function zero_with_output_dimension end + function zero_with_output_dimension(::Type{Vector{T}}, n::Integer) where {T} return zeros(T, n) end + function zero_with_output_dimension( ::Type{MOI.VectorAffineFunction{T}}, n::Integer, ) where {T} return MOI.VectorAffineFunction{T}(MOI.VectorAffineTerm{T}[], zeros(T, n)) end + function zero_with_output_dimension( ::Type{MOI.VectorQuadraticFunction{T}}, n::Integer, diff --git a/test/Utilities/functions.jl b/test/Utilities/functions.jl index 181d1dedf1..51822b52f5 100644 --- a/test/Utilities/functions.jl +++ b/test/Utilities/functions.jl @@ -1723,3 +1723,39 @@ end [0.0, 0.0, 0.0], ) end + +@testset "zero_with_output_dimension" begin + f = MOI.Utilities.zero_with_output_dimension(Vector{Int}, 2) + @test f == [0, 0] + @test f isa Vector{Int} + + g = MOI.Utilities.zero_with_output_dimension(Vector{Float64}, 2) + @test g == [0.0, 0.0] + @test g isa Vector{Float64} + + h = MOI.Utilities.zero_with_output_dimension( + MOI.VectorAffineFunction{Int}, + 2, + ) + @test MOI.output_dimension(h) == 2 + @test isapprox( + h, + MOI.VectorAffineFunction{Int}(MOI.VectorAffineTerm{Int}[], [0, 0]), + ) + @test h isa MOI.VectorAffineFunction{Int} + + i = MOI.Utilities.zero_with_output_dimension( + MOI.VectorQuadraticFunction{Int}, + 2, + ) + @test MOI.output_dimension(i) == 2 + @test isapprox( + i, + MOI.VectorQuadraticFunction{Int}( + MOI.VectorQuadraticTerm{Int}[], + MOI.VectorAffineTerm{Int}[], + [0, 0], + ), + ) + @test i isa MOI.VectorQuadraticFunction{Int} +end From f5f7f4534bfe11d613751f2599e7a80a28de453d Mon Sep 17 00:00:00 2001 From: odow Date: Fri, 28 May 2021 09:55:08 +1200 Subject: [PATCH 2/2] Add to documentation --- docs/src/submodules/Utilities/reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/submodules/Utilities/reference.md b/docs/src/submodules/Utilities/reference.md index ab6cb8d6d6..253f58e2bf 100644 --- a/docs/src/submodules/Utilities/reference.md +++ b/docs/src/submodules/Utilities/reference.md @@ -149,6 +149,7 @@ Utilities.all_coefficients Utilities.unsafe_add Utilities.isapprox_zero Utilities.modify_function +Utilities.zero_with_output_dimension ``` The following functions can be used to canonicalize a function: