Skip to content

Commit e3cfaaf

Browse files
authored
Merge pull request #1003 from JuliaOpt/bl/empty_vectorize
Fix vectorize for empty vector
2 parents 49180c6 + 0b94c55 commit e3cfaaf

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

src/Utilities/functions.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,13 +1820,13 @@ Returns the vector of scalar affine functions in the form of a
18201820
`MOI.VectorAffineFunction{T}`.
18211821
"""
18221822
function vectorize(funcs::AbstractVector{MOI.ScalarAffineFunction{T}}) where T
1823-
nterms = sum(func -> number_of_affine_terms(T, func), funcs)
1824-
out_dim = sum(func -> output_dim(T, func), funcs)
1823+
nterms = mapreduce(func -> number_of_affine_terms(T, func), +, funcs, init=0)
1824+
out_dim = mapreduce(func -> output_dim(T, func), +, funcs, init=0)
18251825
terms = Vector{MOI.VectorAffineTerm{T}}(undef, nterms)
18261826
constant = zeros(T, out_dim)
18271827
fill_vector(terms, T, fill_terms, number_of_affine_terms, funcs)
18281828
fill_vector(constant, T, fill_constant, output_dim, funcs)
1829-
return VAF(terms, constant)
1829+
return MOI.VectorAffineFunction(terms, constant)
18301830
end
18311831

18321832
"""
@@ -1836,16 +1836,16 @@ Returns the vector of scalar quadratic functions in the form of a
18361836
`MOI.VectorQuadraticFunction{T}`.
18371837
"""
18381838
function vectorize(funcs::AbstractVector{MOI.ScalarQuadraticFunction{T}}) where T
1839-
num_affine_terms = sum(func -> number_of_affine_terms(T, func), funcs)
1840-
num_quadratic_terms = sum(func -> number_of_quadratic_terms(T, func), funcs)
1841-
out_dim = sum(func -> output_dim(T, func), funcs)
1839+
num_affine_terms = mapreduce(func -> number_of_affine_terms(T, func), +, funcs, init=0)
1840+
num_quadratic_terms = mapreduce(func -> number_of_quadratic_terms(T, func), +, funcs, init=0)
1841+
out_dim = mapreduce(func -> output_dim(T, func), +, funcs, init=0)
18421842
affine_terms = Vector{MOI.VectorAffineTerm{T}}(undef, num_affine_terms)
18431843
quadratic_terms = Vector{MOI.VectorQuadraticTerm{T}}(undef, num_quadratic_terms)
18441844
constant = zeros(T, out_dim)
18451845
fill_vector(affine_terms, T, fill_terms, number_of_affine_terms, funcs)
18461846
fill_vector(quadratic_terms, T, fill_terms, number_of_quadratic_terms, funcs)
18471847
fill_vector(constant, T, fill_constant, output_dim, funcs)
1848-
return VQF(affine_terms, quadratic_terms, constant)
1848+
return MOI.VectorQuadraticFunction(affine_terms, quadratic_terms, constant)
18491849
end
18501850

18511851
function promote_operation(::typeof(vcat), ::Type{T}, ::Type{T}...) where T

test/Utilities/functions.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ fz = MOI.SingleVariable(z)
2121
g2 = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm{Int}[], 1)
2222
g3 = MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(5, y)], 4)
2323
@test g MOIU.vectorize([g1, g2, g3])
24+
vov = MOIU.vectorize(MOI.SingleVariable[])
25+
@test MOI.output_dimension(vov) == 0
26+
@test vov isa MOI.VectorOfVariables
27+
aff = MOIU.vectorize(MOI.ScalarAffineFunction{Int}[])
28+
@test MOI.output_dimension(aff) == 0
29+
@test aff isa MOI.VectorAffineFunction{Int}
30+
quad = MOIU.vectorize(MOI.ScalarQuadraticFunction{Int}[])
31+
@test MOI.output_dimension(quad) == 0
32+
@test quad isa MOI.VectorQuadraticFunction{Int}
2433
end
2534
@testset "operate vcat" begin
2635
v = MOI.VectorOfVariables([y, w])

0 commit comments

Comments
 (0)