From 8051edd4ba0567415bf1b3789f1fb33c9abb7c9e Mon Sep 17 00:00:00 2001 From: odow Date: Tue, 27 Jul 2021 12:38:19 +1200 Subject: [PATCH 1/5] [breaking] re-order fields of QuadraticFunction --- .../Constraint/soc_to_nonconvex_quad.jl | 4 +- .../UnitTests/basic_constraint_tests.jl | 4 +- src/DeprecatedTest/UnitTests/constraints.jl | 4 +- src/DeprecatedTest/UnitTests/objectives.jl | 10 +-- src/DeprecatedTest/contquadratic.jl | 24 +++--- src/DeprecatedTest/nlp.jl | 2 +- src/FileFormats/MOF/read.jl | 4 +- src/Test/test_basic_constraint.jl | 4 +- src/Test/test_constraint.jl | 4 +- src/Test/test_nonlinear.jl | 2 +- src/Test/test_objective.jl | 10 +-- src/Test/test_quadratic.jl | 24 +++--- src/Utilities/functions.jl | 42 +++++------ src/Utilities/mutable_arithmetics.jl | 2 +- src/Utilities/parser.jl | 4 +- src/deprecate.jl | 18 +++++ src/functions.jl | 35 +++++---- test/Bridges/Constraint/quad_to_soc.jl | 4 +- test/FileFormats/NL/NL.jl | 24 +++--- test/Utilities/functions.jl | 74 +++++++++---------- test/Utilities/model.jl | 10 +-- test/Utilities/parser.jl | 10 +-- test/Utilities/print.jl | 2 +- test/deprecate.jl | 24 ++++++ test/functions.jl | 24 +++--- 25 files changed, 208 insertions(+), 161 deletions(-) diff --git a/src/Bridges/Constraint/soc_to_nonconvex_quad.jl b/src/Bridges/Constraint/soc_to_nonconvex_quad.jl index cfb24db7cb..e58832f39b 100644 --- a/src/Bridges/Constraint/soc_to_nonconvex_quad.jl +++ b/src/Bridges/Constraint/soc_to_nonconvex_quad.jl @@ -47,7 +47,7 @@ function bridge_constraint( push!(q_terms, MOI.ScalarQuadraticTerm(T(2), var, var)) end - fq = MOI.ScalarQuadraticFunction(a_terms, q_terms, zero(T)) + fq = MOI.ScalarQuadraticFunction(q_terms, a_terms, zero(T)) quad = MOI.add_constraint(model, fq, MOI.LessThan(zero(T))) # ScalarAffineFunction's are added instead of SingleVariable's # because models can only have one SingleVariable per variable. @@ -107,7 +107,7 @@ function bridge_constraint( push!(q_terms, MOI.ScalarQuadraticTerm(T(2), var, var)) end - fq = MOI.ScalarQuadraticFunction(a_terms, q_terms, zero(T)) + fq = MOI.ScalarQuadraticFunction(q_terms, a_terms, zero(T)) quad = MOI.add_constraint(model, fq, MOI.LessThan(zero(T))) # ScalarAffineFunction's are added instead of SingleVariable's # because models can only have one SingleVariable per variable. diff --git a/src/DeprecatedTest/UnitTests/basic_constraint_tests.jl b/src/DeprecatedTest/UnitTests/basic_constraint_tests.jl index eebe5d891a..f2b2190621 100644 --- a/src/DeprecatedTest/UnitTests/basic_constraint_tests.jl +++ b/src/DeprecatedTest/UnitTests/basic_constraint_tests.jl @@ -11,8 +11,8 @@ const dummy_scalar_affine = # 1.0 * x + 1.0 * x^2 + 0.0 const dummy_scalar_quadratic = (x::Vector{MOI.VariableIndex}) -> MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(1.0, x), MOI.ScalarQuadraticTerm.(1.0, x, x), + MOI.ScalarAffineTerm.(1.0, x), 0.0, ) # x₁ + + 0.0 @@ -26,11 +26,11 @@ const dummy_vector_affine = # + x₂ + + x₂^2 + 0.0 const dummy_vector_quadratic = (x::Vector{MOI.VariableIndex}) -> MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.(1:length(x), MOI.ScalarAffineTerm.(1.0, x)), # affine component MOI.VectorQuadraticTerm.( 1:length(x), MOI.ScalarQuadraticTerm.(1.0, x, x), ), # affine component + MOI.VectorAffineTerm.(1:length(x), MOI.ScalarAffineTerm.(1.0, x)), # affine component zeros(Float64, length(x)), # constant term ) diff --git a/src/DeprecatedTest/UnitTests/constraints.jl b/src/DeprecatedTest/UnitTests/constraints.jl index 9715771817..b8ba2b3562 100644 --- a/src/DeprecatedTest/UnitTests/constraints.jl +++ b/src/DeprecatedTest/UnitTests/constraints.jl @@ -299,12 +299,12 @@ function solve_qcp_edge_cases(model::MOI.ModelLike, config::Config) MOI.add_constraint( model, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0], [x[2]]), # affine terms MOI.ScalarQuadraticTerm.( [2.0, 2.0], [x[1], x[1]], [x[1], x[1]], ), # quad + MOI.ScalarAffineTerm.([1.0], [x[2]]), # affine terms 0.0, # constant ), MOI.LessThan(1.0), @@ -341,12 +341,12 @@ function solve_qcp_edge_cases(model::MOI.ModelLike, config::Config) MOI.add_constraint( model, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.25, 0.25, 0.5, 2.0], [x[1], x[1], x[2], x[1], x[2]], [x[1], x[2], x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), MOI.LessThan(1.0), diff --git a/src/DeprecatedTest/UnitTests/objectives.jl b/src/DeprecatedTest/UnitTests/objectives.jl index e2b57ac35e..0fd044acf5 100644 --- a/src/DeprecatedTest/UnitTests/objectives.jl +++ b/src/DeprecatedTest/UnitTests/objectives.jl @@ -232,8 +232,8 @@ function solve_qp_edge_cases(model::MOI.ModelLike, config::Config) model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], x, x), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -250,8 +250,8 @@ function solve_qp_edge_cases(model::MOI.ModelLike, config::Config) model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0, 1.0], [x[1], x[1]]), # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], x, x), # quad + MOI.ScalarAffineTerm.([1.0, 1.0], [x[1], x[1]]), # affine terms 0.0, # constant ), ) @@ -268,12 +268,12 @@ function solve_qp_edge_cases(model::MOI.ModelLike, config::Config) model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 2.0], [x[1], x[1]], [x[1], x[1]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -290,12 +290,12 @@ function solve_qp_edge_cases(model::MOI.ModelLike, config::Config) model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.25, 0.25, 0.5, 2.0], [x[1], x[1], x[2], x[1], x[2]], [x[1], x[2], x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -338,12 +338,12 @@ function solve_qp_zero_offdiag(model::MOI.ModelLike, config::Config) model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.0, 2.0], [x[1], x[1], x[2]], [x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) diff --git a/src/DeprecatedTest/contquadratic.jl b/src/DeprecatedTest/contquadratic.jl index 1c019497a3..c5e51c2a9c 100644 --- a/src/DeprecatedTest/contquadratic.jl +++ b/src/DeprecatedTest/contquadratic.jl @@ -54,12 +54,12 @@ function qp1test(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], MOI.ScalarQuadraticTerm.( [2.0, 1.0, 2.0, 1.0, 2.0], v[[1, 1, 2, 2, 3]], v[[1, 2, 2, 3, 3]], ), + MOI.ScalarAffineTerm{Float64}[], 0.0, ) MOI.set( @@ -153,12 +153,12 @@ function qp2test(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(0.0, v), MOI.ScalarQuadraticTerm.( [2.0, 0.5, 0.5, 2.0, 1.0, 1.0, 1.0], [v[1], v[1], v[1], v[2], v[2], v[3], v[3]], [v[1], v[2], v[2], v[2], v[3], v[3], v[3]], ), + MOI.ScalarAffineTerm.(0.0, v), 0.0, ) MOI.set( @@ -197,12 +197,12 @@ function qp2test(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MAX_SENSE obj2 = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(0.0, v), MOI.ScalarQuadraticTerm.( [-4.0, -1.0, -1.0, -4.0, -2.0, -2.0, -2.0], [v[1], v[1], v[1], v[2], v[2], v[3], v[3]], [v[1], v[2], v[2], v[2], v[3], v[3], v[3]], ), + MOI.ScalarAffineTerm.(0.0, v), 0.0, ) MOI.set( @@ -272,8 +272,8 @@ function qp3test(model::MOI.ModelLike, config::Config) @test vc2.value == y.value MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), MOI.ScalarQuadraticTerm.([4.0, 2.0, 1.0], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), 1.0, ) MOI.set( @@ -404,8 +404,8 @@ function qcp1test(model::MOI.ModelLike, config::Config) ) == 1 end c2f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.0, y)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(1.0, y)], 0.0, ) c2 = MOI.add_constraint(model, c2f, MOI.LessThan(2.0)) @@ -491,8 +491,8 @@ function qcp2test(model::MOI.ModelLike, config::Config) x = MOI.add_variable(model) @test MOI.get(model, MOI.NumberOfVariables()) == 1 cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(2.0)) @@ -557,8 +557,8 @@ function qcp3test(model::MOI.ModelLike, config::Config) x = MOI.add_variable(model) @test MOI.get(model, MOI.NumberOfVariables()) == 1 cf = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], [MOI.ScalarQuadraticTerm(2.0, x, x)], + MOI.ScalarAffineTerm{Float64}[], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(2.0)) @@ -631,8 +631,8 @@ function _qcp4test(model::MOI.ModelLike, config::Config, less_than::Bool) vc = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.EqualTo(1.0)) @test vc.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], MOI.ScalarQuadraticTerm.([2.0, 1.0, 2.0], [x, x, y], [x, y, y]), + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) if !less_than @@ -736,8 +736,8 @@ function ncqcp1test(model::MOI.ModelLike, config::Config) vc2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.GreaterThan(1.0)) @test vc2.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(1.0, x, y)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(4.0)) @@ -805,14 +805,14 @@ function ncqcp2test(model::MOI.ModelLike, config::Config) vc2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.GreaterThan(0.0)) @test vc2.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(1.0, x, y)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.EqualTo(4.0)) cf2 = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c2 = MOI.add_constraint(model, cf2, MOI.EqualTo(4.0)) @@ -903,8 +903,8 @@ function socp1test(model::MOI.ModelLike, config::Config) ) == 1 end c2f = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], MOI.ScalarQuadraticTerm.([2.0, 2.0, -2.0], [x, y, t], [x, y, t]), + MOI.ScalarAffineTerm{Float64}[], 0.0, ) c2 = MOI.add_constraint(model, c2f, MOI.LessThan(0.0)) diff --git a/src/DeprecatedTest/nlp.jl b/src/DeprecatedTest/nlp.jl index c78e39de38..804a666f15 100644 --- a/src/DeprecatedTest/nlp.jl +++ b/src/DeprecatedTest/nlp.jl @@ -543,8 +543,8 @@ function test_qp_complementarity_constraint( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([-10.0, 4.0], x[[1, 2]]), MOI.ScalarQuadraticTerm.([2.0, 8.0], x[1:2], x[1:2]), + MOI.ScalarAffineTerm.([-10.0, 4.0], x[[1, 2]]), 26.0, ), ) diff --git a/src/FileFormats/MOF/read.jl b/src/FileFormats/MOF/read.jl index 15f9bbafb9..aa950021c5 100644 --- a/src/FileFormats/MOF/read.jl +++ b/src/FileFormats/MOF/read.jl @@ -209,8 +209,8 @@ function function_to_moi( name_map::Dict{String,MOI.VariableIndex}, ) return MOI.ScalarQuadraticFunction{Float64}( - parse_scalar_affine_term.(object["affine_terms"], Ref(name_map)), parse_scalar_quadratic_term.(object["quadratic_terms"], Ref(name_map)), + parse_scalar_affine_term.(object["affine_terms"], Ref(name_map)), object["constant"]::Float64, ) end @@ -269,8 +269,8 @@ function function_to_moi( name_map::Dict{String,MOI.VariableIndex}, ) return MOI.VectorQuadraticFunction{Float64}( - parse_vector_affine_term.(object["affine_terms"], Ref(name_map)), parse_vector_quadratic_term.(object["quadratic_terms"], Ref(name_map)), + parse_vector_affine_term.(object["affine_terms"], Ref(name_map)), Float64.(object["constants"]), ) end diff --git a/src/Test/test_basic_constraint.jl b/src/Test/test_basic_constraint.jl index 494a22a3bc..47c58c1b0f 100644 --- a/src/Test/test_basic_constraint.jl +++ b/src/Test/test_basic_constraint.jl @@ -28,8 +28,8 @@ function _function( x::Vector{MOI.VariableIndex}, ) where {T} return MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(one(T), x), MOI.ScalarQuadraticTerm.(one(T), x, x), + MOI.ScalarAffineTerm.(one(T), x), zero(T), ) end @@ -51,11 +51,11 @@ function _function( x::Vector{MOI.VariableIndex}, ) where {T} return MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.(1:length(x), MOI.ScalarAffineTerm.(one(T), x)), MOI.VectorQuadraticTerm.( 1:length(x), MOI.ScalarQuadraticTerm.(one(T), x, x), ), + MOI.VectorAffineTerm.(1:length(x), MOI.ScalarAffineTerm.(one(T), x)), zeros(T, length(x)), ) end diff --git a/src/Test/test_constraint.jl b/src/Test/test_constraint.jl index 4ab7b8802f..c5755d1964 100644 --- a/src/Test/test_constraint.jl +++ b/src/Test/test_constraint.jl @@ -420,8 +420,8 @@ function test_constraint_qcp_duplicate_diagonal( MOI.add_constraint( model, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0], [x[2]]), # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], [x[1], x[1]], [x[1], x[1]]), # quad + MOI.ScalarAffineTerm.([1.0], [x[2]]), # affine terms 0.0, # constant ), MOI.LessThan(1.0), @@ -490,12 +490,12 @@ function test_constraint_qcp_duplicate_off_diagonal( MOI.add_constraint( model, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.25, 0.25, 0.5, 2.0], [x[1], x[1], x[2], x[1], x[2]], [x[1], x[2], x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), MOI.LessThan(1.0), diff --git a/src/Test/test_nonlinear.jl b/src/Test/test_nonlinear.jl index f636f7d153..e3ccb68985 100644 --- a/src/Test/test_nonlinear.jl +++ b/src/Test/test_nonlinear.jl @@ -614,8 +614,8 @@ function test_nonlinear_qp_complementarity_constraint( model, MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}}(), MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([-10.0, 4.0], x[[1, 2]]), MOI.ScalarQuadraticTerm.([2.0, 8.0], x[1:2], x[1:2]), + MOI.ScalarAffineTerm.([-10.0, 4.0], x[[1, 2]]), 26.0, ), ) diff --git a/src/Test/test_objective.jl b/src/Test/test_objective.jl index ff0950152e..674d2087de 100644 --- a/src/Test/test_objective.jl +++ b/src/Test/test_objective.jl @@ -253,8 +253,8 @@ function test_objective_qp_ObjectiveFunction_edge_cases( model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], x, x), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -270,8 +270,8 @@ function test_objective_qp_ObjectiveFunction_edge_cases( model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0, 1.0], [x[1], x[1]]), # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], x, x), # quad + MOI.ScalarAffineTerm.([1.0, 1.0], [x[1], x[1]]), # affine terms 0.0, # constant ), ) @@ -287,8 +287,8 @@ function test_objective_qp_ObjectiveFunction_edge_cases( model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.([2.0, 2.0], [x[1], x[1]], [x[1], x[1]]), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -304,12 +304,12 @@ function test_objective_qp_ObjectiveFunction_edge_cases( model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.25, 0.25, 0.5, 2.0], [x[1], x[1], x[2], x[1], x[2]], [x[1], x[2], x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) @@ -387,12 +387,12 @@ function test_objective_qp_ObjectiveFunction_zero_ofdiag( model, obj_attr, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], # affine terms MOI.ScalarQuadraticTerm.( [2.0, 0.0, 2.0], [x[1], x[1], x[2]], [x[1], x[2], x[2]], ), # quad + MOI.ScalarAffineTerm{Float64}[], # affine terms 0.0, # constant ), ) diff --git a/src/Test/test_quadratic.jl b/src/Test/test_quadratic.jl index 2a688e45d3..c3f063af3a 100644 --- a/src/Test/test_quadratic.jl +++ b/src/Test/test_quadratic.jl @@ -54,12 +54,12 @@ function test_quadratic_integration(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], MOI.ScalarQuadraticTerm.( [2.0, 1.0, 2.0, 1.0, 2.0], v[[1, 1, 2, 2, 3]], v[[1, 2, 2, 3, 3]], ), + MOI.ScalarAffineTerm{Float64}[], 0.0, ) MOI.set( @@ -180,12 +180,12 @@ function test_quadratic_duplicate_terms(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(0.0, v), MOI.ScalarQuadraticTerm.( [2.0, 0.5, 0.5, 2.0, 1.0, 1.0, 1.0], [v[1], v[1], v[1], v[2], v[2], v[3], v[3]], [v[1], v[2], v[2], v[2], v[3], v[3], v[3]], ), + MOI.ScalarAffineTerm.(0.0, v), 0.0, ) MOI.set( @@ -232,12 +232,12 @@ function test_quadratic_duplicate_terms(model::MOI.ModelLike, config::Config) MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE) @test MOI.get(model, MOI.ObjectiveSense()) == MOI.MAX_SENSE obj2 = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(0.0, v), MOI.ScalarQuadraticTerm.( [-4.0, -1.0, -1.0, -4.0, -2.0, -2.0, -2.0], [v[1], v[1], v[1], v[2], v[2], v[3], v[3]], [v[1], v[2], v[2], v[2], v[3], v[3], v[3]], ), + MOI.ScalarAffineTerm.(0.0, v), 0.0, ) MOI.set( @@ -349,8 +349,8 @@ function test_quadratic_nonhomogeneous(model::MOI.ModelLike, config::Config) @test vc2.value == y.value MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), MOI.ScalarQuadraticTerm.([4.0, 2.0, 1.0], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), 1.0, ) MOI.set( @@ -511,8 +511,8 @@ function test_quadratic_constraint_integration( ) == 1 end c2f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.0, y)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(1.0, y)], 0.0, ) c2 = MOI.add_constraint(model, c2f, MOI.LessThan(2.0)) @@ -630,8 +630,8 @@ function test_quadratic_constraint_basic(model::MOI.ModelLike, config::Config) x = MOI.add_variable(model) @test MOI.get(model, MOI.NumberOfVariables()) == 1 cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(2.0)) @@ -723,8 +723,8 @@ function test_quadratic_constraint_minimize( x = MOI.add_variable(model) @test MOI.get(model, MOI.NumberOfVariables()) == 1 cf = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], [MOI.ScalarQuadraticTerm(2.0, x, x)], + MOI.ScalarAffineTerm{Float64}[], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(2.0)) @@ -817,8 +817,8 @@ function _test_quadratic_constraint_helper( vc = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.EqualTo(1.0)) @test vc.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], MOI.ScalarQuadraticTerm.([2.0, 1.0, 2.0], [x, x, y], [x, y, y]), + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) if !less_than @@ -957,8 +957,8 @@ function test_quadratic_nonconvex_constraint_integration( vc2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.GreaterThan(1.0)) @test vc2.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(1.0, x, y)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.LessThan(4.0)) @@ -1044,14 +1044,14 @@ function test_quadratic_nonconvex_constraint_basic( vc2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.GreaterThan(0.0)) @test vc2.value == y.value cf = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(1.0, x, y)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c = MOI.add_constraint(model, cf, MOI.EqualTo(4.0)) cf2 = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(0.0, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(0.0, x)], 0.0, ) c2 = MOI.add_constraint(model, cf2, MOI.EqualTo(4.0)) @@ -1154,8 +1154,8 @@ function test_quadratic_SecondOrderCone_basic( ) == 1 end c2f = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], MOI.ScalarQuadraticTerm.([2.0, 2.0, -2.0], [x, y, t], [x, y, t]), + MOI.ScalarAffineTerm{Float64}[], 0.0, ) c2 = MOI.add_constraint(model, c2f, MOI.LessThan(0.0)) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index 59992d32f0..a856dc4cfd 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -319,8 +319,8 @@ function substitute_variables( func::MOI.ScalarQuadraticFunction{T}, ) where {T,F<:Function} g = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{T}[], MOI.ScalarQuadraticTerm{T}[], + MOI.ScalarAffineTerm{T}[], MOI.constant(func), ) for term in func.affine_terms @@ -347,8 +347,8 @@ function substitute_variables( func::MOI.VectorQuadraticFunction{T}, ) where {T,F<:Function} g = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm{T}[], MOI.VectorQuadraticTerm{T}[], + MOI.VectorAffineTerm{T}[], copy(MOI.constant(func)), ) for term in func.affine_terms @@ -531,14 +531,14 @@ function Base.getindex( output_index::Integer, ) where {T} return MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{T}[ - it.f.affine_terms[i].scalar_term for - i in ChainedIteratorAtIndex(it.cache[1], output_index) - ], MOI.ScalarQuadraticTerm{T}[ it.f.quadratic_terms[i].scalar_term for i in ChainedIteratorAtIndex(it.cache[2], output_index) ], + MOI.ScalarAffineTerm{T}[ + it.f.affine_terms[i].scalar_term for + i in ChainedIteratorAtIndex(it.cache[1], output_index) + ], it.f.constants[output_index], ) end @@ -563,7 +563,7 @@ function Base.getindex( ) end end - return MOI.VectorQuadraticFunction(vat, vqt, it.f.constants[output_indices]) + return MOI.VectorQuadraticFunction(vqt, vat, it.f.constants[output_indices]) end """ @@ -592,8 +592,8 @@ function zero_with_output_dimension( n::Integer, ) where {T} return MOI.VectorQuadraticFunction{T}( - MOI.VectorAffineTerm{T}[], MOI.VectorQuadraticTerm{T}[], + MOI.VectorAffineTerm{T}[], zeros(T, n), ) end @@ -1128,7 +1128,7 @@ function modify_function( change.variable, change.new_coefficient, ) - return MOI.ScalarQuadraticFunction(terms, f.quadratic_terms, f.constant) + return MOI.ScalarQuadraticFunction(f.quadratic_terms, terms, f.constant) end function _modifycoefficients( @@ -1186,7 +1186,7 @@ function modify_function( change.variable, change.new_coefficients, ) - return MOI.VectorQuadraticFunction(terms, f.quadratic_terms, f.constants) + return MOI.VectorQuadraticFunction(f.quadratic_terms, terms, f.constants) end # Arithmetic @@ -1709,8 +1709,8 @@ function operate( g::MOI.ScalarQuadraticFunction{T}, ) where {T} return MOI.ScalarQuadraticFunction( - [f.terms; operate_terms(op, g.affine_terms)], operate_terms(op, g.quadratic_terms), + [f.terms; operate_terms(op, g.affine_terms)], op(f.constant, g.constant), ) end @@ -1721,8 +1721,8 @@ function operate( f::MOI.ScalarQuadraticFunction{T}, ) where {T} return MOI.ScalarQuadraticFunction( - operate_terms(op, f.affine_terms), operate_terms(op, f.quadratic_terms), + operate_terms(op, f.affine_terms), op(f.constant), ) end @@ -2104,8 +2104,8 @@ function operate( f::MOI.VectorQuadraticFunction{T}, ) where {T} return MOI.VectorQuadraticFunction( - operate_terms(op, f.affine_terms), operate_terms(op, f.quadratic_terms), + operate_terms(op, f.affine_terms), op.(f.constants), ) end @@ -2124,8 +2124,8 @@ function operate( g::MOI.VectorQuadraticFunction{T}, ) where {T} return MOI.VectorQuadraticFunction( - [f.terms; operate_terms(op, g.affine_terms)], operate_terms(op, g.quadratic_terms), + [f.terms; operate_terms(op, g.affine_terms)], op.(f.constants, g.constants), ) end @@ -2267,7 +2267,6 @@ function operate( g::MOI.SingleVariable, ) where {T} return MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{T}[], [ MOI.ScalarQuadraticTerm( f.variable == g.variable ? 2one(T) : one(T), @@ -2275,6 +2274,7 @@ function operate( g.variable, ), ], + MOI.ScalarAffineTerm{T}[], zero(T), ) end @@ -2298,7 +2298,7 @@ function operate( ), f.terms, ) - return MOI.ScalarQuadraticFunction(aff_terms, quad_terms, zero(T)) + return MOI.ScalarQuadraticFunction(quad_terms, aff_terms, zero(T)) end function operate( ::typeof(*), @@ -2345,7 +2345,7 @@ function operate( end end constant = f.constant * g.constant - return MOI.ScalarQuadraticFunction(aff_terms, quad_terms, constant) + return MOI.ScalarQuadraticFunction(quad_terms, aff_terms, constant) end Base.:*(f::MOI.AbstractFunction) = f @@ -2787,7 +2787,7 @@ function vectorize( funcs, ) fill_vector(constant, T, fill_constant, output_dim, funcs) - return MOI.VectorQuadraticFunction(affine_terms, quadratic_terms, constant) + return MOI.VectorQuadraticFunction(quadratic_terms, affine_terms, constant) end function promote_operation(::typeof(vcat), ::Type{T}, ::Type{T}...) where {T} @@ -2888,8 +2888,8 @@ function scalarize( counting_quadratics = count_terms(dimension, f.quadratic_terms) functions = MOI.ScalarQuadraticFunction{T}[ MOI.ScalarQuadraticFunction{T}( - MOI.ScalarAffineTerm{T}[], MOI.ScalarQuadraticTerm{T}[], + MOI.ScalarAffineTerm{T}[], constants[i], ) for i in 1:dimension ] @@ -2989,8 +2989,8 @@ function operate_coefficients(f, func::MOI.ScalarAffineFunction) end function operate_coefficients(f, func::MOI.ScalarQuadraticFunction) return MOI.ScalarQuadraticFunction( - [operate_coefficient(f, term) for term in func.affine_terms], [operate_coefficient(f, term) for term in func.quadratic_terms], + [operate_coefficient(f, term) for term in func.affine_terms], f(func.constant), ) end @@ -3002,8 +3002,8 @@ function operate_coefficients(f, func::MOI.VectorAffineFunction) end function operate_coefficients(f, func::MOI.VectorQuadraticFunction) return MOI.VectorQuadraticFunction( - [operate_coefficient(f, term) for term in func.affine_terms], [operate_coefficient(f, term) for term in func.quadratic_terms], + [operate_coefficient(f, term) for term in func.affine_terms], map(f, func.constants), ) end diff --git a/src/Utilities/mutable_arithmetics.jl b/src/Utilities/mutable_arithmetics.jl index deb9904f08..869bb6baab 100644 --- a/src/Utilities/mutable_arithmetics.jl +++ b/src/Utilities/mutable_arithmetics.jl @@ -24,8 +24,8 @@ function MA.mutable_copy(func::MOI.ScalarQuadraticFunction) ) for t in func.quadratic_terms ] return MOI.ScalarQuadraticFunction( - affine_terms, quadratic_terms, + affine_terms, MA.copy_if_mutable(func.constant), ) end diff --git a/src/Utilities/parser.jl b/src/Utilities/parser.jl index 11b417533c..018832b76e 100644 --- a/src/Utilities/parser.jl +++ b/src/Utilities/parser.jl @@ -99,8 +99,8 @@ function _parse_function(ex) return _ParsedVectorAffineFunction(affine_terms, constant) else return _ParsedVectorQuadraticFunction( - affine_terms, quadratic_terms, + affine_terms, constant, ) end @@ -163,8 +163,8 @@ function _parse_function(ex) return _ParsedScalarAffineFunction(affine_terms, constant) else return _ParsedScalarQuadraticFunction( - affine_terms, quadratic_terms, + affine_terms, constant, ) end diff --git a/src/deprecate.jl b/src/deprecate.jl index a66224ed95..6cfa53ad4a 100644 --- a/src/deprecate.jl +++ b/src/deprecate.jl @@ -50,3 +50,21 @@ function RawParameter(name::Any) ) return RawOptimizerAttribute(string(name)) end + +function ScalarQuadraticFunction( + affine_terms::Vector{<:ScalarAffineTerm{T}}, + quadratic_terms::Vector{<:ScalarQuadraticTerm{T}}, + constant::T, +) where {T} + @warn("Fields of ScalarQuadraticFunction have been re-ordered.", maxlog = 1) + return ScalarQuadraticFunction(quadratic_terms, affine_terms, constant) +end + +function VectorQuadraticFunction( + affine_terms::Vector{<:VectorAffineTerm{T}}, + quadratic_terms::Vector{<:VectorQuadraticTerm{T}}, + constant::Vector{T}, +) where {T} + @warn("Fields of VectorQuadraticFunction have been re-ordered.", maxlog = 1) + return VectorQuadraticFunction(quadratic_terms, affine_terms, constant) +end diff --git a/src/functions.jl b/src/functions.jl index e84b42b628..62c74fffb6 100644 --- a/src/functions.jl +++ b/src/functions.jl @@ -147,12 +147,16 @@ struct ScalarQuadraticTerm{T} variable_2::VariableIndex end -# Note: ScalarQuadraticFunction is mutable because its `constant` field is likely of an immutable -# type, while its other fields are of mutable types, meaning that creating a `ScalarQuadraticFunction` -# allocates, and it is desirable to provide a zero-allocation option for working with -# ScalarQuadraticFunctions. See https://github.com/jump-dev/MathOptInterface.jl/pull/343. +# Note: ScalarQuadraticFunction is mutable because its `constant` field is +# likely of an immutable type, while its other fields are of mutable types, +# meaning that creating a `ScalarQuadraticFunction` allocates, and it is +# desirable to provide a zero-allocation option for working with +# ScalarQuadraticFunctions. +# +# See https://github.com/jump-dev/MathOptInterface.jl/pull/343. + """ - ScalarQuadraticFunction{T}(affine_terms, quadratic_terms, constant) + ScalarQuadraticFunction{T}(quadratic_terms, affine_terms, constant) The scalar-valued quadratic function ``\\frac{1}{2}x^TQx + a^T x + b``, where: * ``a`` is a sparse vector specified by a list of `ScalarAffineTerm` structs. @@ -170,8 +174,8 @@ For example, for two scalar variables ``y, z``, the quadratic expression `ScalarQuadraticTerm.([1.0, 2.0], [y, y], [z, y])`. """ mutable struct ScalarQuadraticFunction{T} <: AbstractScalarFunction - affine_terms::Vector{ScalarAffineTerm{T}} quadratic_terms::Vector{ScalarQuadraticTerm{T}} + affine_terms::Vector{ScalarAffineTerm{T}} constant::T end @@ -198,7 +202,7 @@ function VectorQuadraticTerm( end """ - VectorQuadraticFunction{T}(affine_terms, quadratic_terms, constants) + VectorQuadraticFunction{T}(quadratic_terms, affine_terms, constants) The vector-valued quadratic function with i`th` component ("output index") defined as ``\\frac{1}{2}x^TQ_ix + a_i^T x + b_i``, where: @@ -214,10 +218,11 @@ coefficients are summed together. "Mirrored" indices `(q,r)` and `(r,q)` (where specified. """ struct VectorQuadraticFunction{T} <: AbstractVectorFunction - affine_terms::Vector{VectorAffineTerm{T}} quadratic_terms::Vector{VectorQuadraticTerm{T}} + affine_terms::Vector{VectorAffineTerm{T}} constants::Vector{T} end + output_dimension(f::VectorQuadraticFunction) = length(f.constants) # Function modifications @@ -577,8 +582,8 @@ end # Conversion to ScalarQuadraticFunction function Base.convert(::Type{ScalarQuadraticFunction{T}}, α::T) where {T} return ScalarQuadraticFunction{T}( - ScalarAffineTerm{T}[], ScalarQuadraticTerm{T}[], + ScalarAffineTerm{T}[], α, ) end @@ -598,8 +603,8 @@ function Base.convert( f::ScalarAffineFunction{T}, ) where {T} return ScalarQuadraticFunction{T}( - f.terms, ScalarQuadraticTerm{T}[], + f.terms, f.constant, ) end @@ -623,8 +628,8 @@ function Base.convert( g::SingleVariable, ) where {T} return VectorQuadraticFunction{T}( - [VectorAffineTerm(1, ScalarAffineTerm(one(T), g.variable))], VectorQuadraticTerm{T}[], + [VectorAffineTerm(1, ScalarAffineTerm(one(T), g.variable))], [zero(T)], ) end @@ -644,8 +649,8 @@ function Base.convert( g::ScalarAffineFunction, ) where {T} return VectorQuadraticFunction{T}( - VectorAffineTerm{T}[VectorAffineTerm(1, term) for term in g.terms], VectorQuadraticTerm{T}[], + VectorAffineTerm{T}[VectorAffineTerm(1, term) for term in g.terms], [g.constant], ) end @@ -655,12 +660,12 @@ function Base.convert( g::ScalarQuadraticFunction, ) where {T} return VectorQuadraticFunction{T}( - VectorAffineTerm{T}[ - VectorAffineTerm(1, term) for term in g.affine_terms - ], VectorQuadraticTerm{T}[ VectorQuadraticTerm(1, term) for term in g.quadratic_terms ], + VectorAffineTerm{T}[ + VectorAffineTerm(1, term) for term in g.affine_terms + ], [g.constant], ) end diff --git a/test/Bridges/Constraint/quad_to_soc.jl b/test/Bridges/Constraint/quad_to_soc.jl index 3dc744a299..f9da505a0b 100644 --- a/test/Bridges/Constraint/quad_to_soc.jl +++ b/test/Bridges/Constraint/quad_to_soc.jl @@ -26,8 +26,8 @@ function test_error_for_nonconvex_quadratic_constraints() MOI.add_constraint( bridged_mock, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], [MOI.ScalarQuadraticTerm(1.0, x, x)], + MOI.ScalarAffineTerm{Float64}[], 0.0, ), MOI.GreaterThan(0.0), @@ -37,8 +37,8 @@ function test_error_for_nonconvex_quadratic_constraints() MOI.add_constraint( bridged_mock, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], [MOI.ScalarQuadraticTerm(-1.0, x, x)], + MOI.ScalarAffineTerm{Float64}[], 0.0, ), MOI.LessThan(0.0), diff --git a/test/FileFormats/NL/NL.jl b/test/FileFormats/NL/NL.jl index 69e05fca32..9617b94bb6 100644 --- a/test/FileFormats/NL/NL.jl +++ b/test/FileFormats/NL/NL.jl @@ -43,8 +43,8 @@ end function test_nlexpr_scalarquadratic_0() x = MOI.VariableIndex(1) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], MOI.ScalarQuadraticTerm{Float64}[], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) return _test_nlexpr( @@ -59,8 +59,8 @@ end function test_nlexpr_scalarquadratic_1a() x = MOI.VariableIndex(1) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) terms = [NL.OPMULT, x, x] @@ -70,8 +70,8 @@ end function test_nlexpr_scalarquadratic_1b() x = MOI.VariableIndex(1) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [MOI.ScalarQuadraticTerm(2.5, x, x)], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) terms = [NL.OPMULT, 1.25, NL.OPMULT, x, x] @@ -82,8 +82,8 @@ function test_nlexpr_scalarquadratic_1c() x = MOI.VariableIndex(1) y = MOI.VariableIndex(2) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [MOI.ScalarQuadraticTerm(1.0, x, y)], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) terms = [NL.OPMULT, x, y] @@ -94,11 +94,11 @@ function test_nlexpr_scalarquadratic_2() x = MOI.VariableIndex(1) y = MOI.VariableIndex(2) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [ MOI.ScalarQuadraticTerm(2.0, x, x), MOI.ScalarQuadraticTerm(1.0, x, y), ], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) terms = [NL.OPPLUS, NL.OPMULT, x, x, NL.OPMULT, x, y] @@ -110,12 +110,12 @@ function test_nlexpr_scalarquadratic_3() y = MOI.VariableIndex(2) z = MOI.VariableIndex(3) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [ MOI.ScalarQuadraticTerm(2.0, x, x), MOI.ScalarQuadraticTerm(0.5, x, y), MOI.ScalarQuadraticTerm(4.0, x, z), ], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) terms = [ @@ -599,13 +599,13 @@ function test_nlmodel_linear_quadratic() MOI.add_constraint(model, MOI.SingleVariable(x[3]), MOI.Integer()) f = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(1.0, x[2:4]), 2.0) g = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.0, x[1])], [MOI.ScalarQuadraticTerm(2.0, x[1], x[2])], + [MOI.ScalarAffineTerm(1.0, x[1])], 3.0, ) h = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.0, x[3])], [MOI.ScalarQuadraticTerm(1.0, x[1], x[2])], + [MOI.ScalarAffineTerm(1.0, x[3])], 0.0, ) MOI.add_constraint(model, f, MOI.Interval(1.0, 10.0)) @@ -690,8 +690,8 @@ function test_nlmodel_quadratic_interval() model = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()) x = MOI.add_variable(model) g = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.0, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(1.0, x)], 3.0, ) MOI.add_constraint(model, g, MOI.Interval(1.0, 10.0)) @@ -744,8 +744,8 @@ end function test_eval_scalarquadratic() x = MOI.VariableIndex(1) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(1.1, x)], [MOI.ScalarQuadraticTerm(2.0, x, x)], + [MOI.ScalarAffineTerm(1.1, x)], 3.0, ) @test NL._evaluate(NL._NLExpr(f), Dict(x => 1.1)) == 5.42 @@ -814,8 +814,8 @@ function test_issue_79() z = MOI.add_variable(model) MOI.add_constraint(model, MOI.SingleVariable(z), MOI.ZeroOne()) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(-1.0, z)], [MOI.ScalarQuadraticTerm(1.0, z, z)], + [MOI.ScalarAffineTerm(-1.0, z)], 0.25, ) MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f) @@ -823,8 +823,8 @@ function test_issue_79() MOI.add_constraint( model, MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], [MOI.ScalarQuadraticTerm(1.0, x, z)], + MOI.ScalarAffineTerm{Float64}[], 0.0, ), MOI.LessThan(0.0), diff --git a/test/Utilities/functions.jl b/test/Utilities/functions.jl index c9de928fe1..fdf16dc162 100644 --- a/test/Utilities/functions.jl +++ b/test/Utilities/functions.jl @@ -212,19 +212,19 @@ function test_eval_variables() @test MOI.Utilities.eval_variables(vi -> vals[vi], fva) ≈ [12, 7] @test MOI.Utilities.eval_variables(vi -> vals[vi], fva) ≈ [12, 7] fsq = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(1.0, [x, y]), MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), + MOI.ScalarAffineTerm.(1.0, [x, y]), -3.0, ) @test MOI.output_dimension(fsq) == 1 @test MOI.Utilities.eval_variables(vi -> vals[vi], fsq) ≈ 16 @test MOI.Utilities.eval_variables(vi -> vals[vi], fsq) ≈ 16 fvq = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), MOI.VectorQuadraticTerm.( [1, 2, 2], MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), - ), + ), + MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), [-3.0, -2.0], ) @test MOI.output_dimension(fvq) == 2 @@ -297,8 +297,8 @@ end function test_map_indices() fsq = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.(1.0, [x, y]), MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), + MOI.ScalarAffineTerm.(1.0, [x, y]), -3.0, ) index_map = Dict(x => y, y => z, w => w, z => x) @@ -309,11 +309,11 @@ function test_map_indices() @test gsq.quadratic_terms == sqts @test gsq.constant == -3.0 fvq = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), MOI.VectorQuadraticTerm.( [1, 2, 2], MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), - ), + ), + MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), [-3.0, -2.0], ) gvq = MOI.Utilities.map_indices(index_map, fvq) @@ -410,14 +410,14 @@ end function test_indexing_on_VectorQuadraticFunction() f = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.( - [2, 1, 3, 2, 2], - MOI.ScalarAffineTerm.([1, 7, 2, 9, 3], [x, y, z, z, y]), - ), MOI.VectorQuadraticTerm.( [2, 3, 1, 2], MOI.ScalarQuadraticTerm.([1, 6, 4, 3], [z, x, x, y], [y, z, z, y]), ), + MOI.VectorAffineTerm.( + [2, 1, 3, 2, 2], + MOI.ScalarAffineTerm.([1, 7, 2, 9, 3], [x, y, z, z, y]), + ), [2, 7, 5], ) it = MOI.Utilities.eachscalar(f) @@ -584,8 +584,8 @@ function test_Scalar_Affine_convert() MOI.SingleVariable(x) @test convert(typeof(f), f) === f quad_f = MOI.ScalarQuadraticFunction( - f.terms, MOI.ScalarQuadraticTerm{Float64}[], + f.terms, f.constant, ) @test convert(MOI.ScalarQuadraticFunction{Float64}, f) ≈ quad_f @@ -802,73 +802,73 @@ function test_Scalar_Quadratic_operate() @test f ≈ (fx + 2) * (fx + 1) + (fy + 1) * (2fy + 3fx) + (5 - 3fx - 2fy) @test f ≈ begin MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(3, x)], MOI.ScalarQuadraticTerm.([2], [x], [x]), + [MOI.ScalarAffineTerm(3, x)], 4, ) + MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([4, 3], [y, x], [y, y]), + MOI.ScalarAffineTerm{Int}[], 3, ) end @test f ≈ begin MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(3, x)], MOI.ScalarQuadraticTerm.([2], [x], [x]), + [MOI.ScalarAffineTerm(3, x)], 10, ) - MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([-4, -3], [y, x], [y, y]), + MOI.ScalarAffineTerm{Int}[], 3, ) end @test f ≈ begin MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(3, x)], 5) + MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([2, 4, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm{Int}[], 2, ) end @test f ≈ begin MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(3, x)], 5) - MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([-2, -4, -3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm{Int}[], -2, ) end @test f ≈ begin MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([2, 4, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm{Int}[], 2, ) + MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(3, x)], 5) end @test f ≈ begin MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Int}[], MOI.ScalarQuadraticTerm.([2, 4, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm{Int}[], 12, ) - MOI.ScalarAffineFunction([MOI.ScalarAffineTerm(-3, x)], 5) end @test f ≈ begin MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([2], [x]), MOI.ScalarQuadraticTerm.([2, 4, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([2], [x]), 7, ) + MOI.SingleVariable(x) end @test f ≈ MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([3], [x]), MOI.ScalarQuadraticTerm.([2, 4, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([3], [x]), 10, ) - 3 @test f ≈ 2.0 * MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([3.0], [x]), MOI.ScalarQuadraticTerm.([2.0, 4.0, 3.0], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([3.0], [x]), 7.0, ) / 2.0 return @@ -965,14 +965,14 @@ end function test_Vector_Quadratic() f = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.( - [1, 2, 2], - MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), - ), MOI.VectorQuadraticTerm.( [1, 1, 2], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), ), + MOI.VectorAffineTerm.( + [1, 2, 2], + MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), + ), [7, 3, 4], ) @test MOI.output_dimension(f) == 3 @@ -1584,14 +1584,14 @@ function test_vector_plus_and_neg() [3, 1, 4], ) f = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.( - [1, 2, 2], - MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), - ), MOI.VectorQuadraticTerm.( [1, 1, 2], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), ), + MOI.VectorAffineTerm.( + [1, 2, 2], + MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), + ), [7, 3, 4], ) v_plus_g = MOI.VectorAffineFunction( @@ -1623,25 +1623,25 @@ function test_vector_plus_and_neg() [0, 0, 0], ) f_plus_α = MOI.VectorQuadraticFunction( + MOI.VectorQuadraticTerm.( + [1, 1, 2], + MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), + ), MOI.VectorAffineTerm.( [1, 2, 2], MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), ), + [8, 5, 7], + ) + f_minus_g = MOI.VectorQuadraticFunction( MOI.VectorQuadraticTerm.( [1, 1, 2], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), ), - [8, 5, 7], - ) - f_minus_g = MOI.VectorQuadraticFunction( MOI.VectorAffineTerm.( [1, 2, 2, 3, 1], MOI.ScalarAffineTerm.([3, 1, 2, -5, -2], [x, x, y, y, x]), ), - MOI.VectorQuadraticTerm.( - [1, 1, 2], - MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), - ), [4, 2, 0], ) @test v + g ≈ v_plus_g diff --git a/test/Utilities/model.jl b/test/Utilities/model.jl index b2e6ae958e..ff77e0bbb1 100644 --- a/test/Utilities/model.jl +++ b/test/Utilities/model.jl @@ -221,8 +221,8 @@ function test_quadratic_functions() x, y = MOI.add_variables(model, 2) @test 2 == @inferred MOI.get(model, MOI.NumberOfVariables()) f1 = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([3], [x]), MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([3], [x]), 7, ) c1 = MOI.add_constraint(model, f1, MOI.Interval(-1, 1)) @@ -241,14 +241,14 @@ function test_quadratic_functions() }(), )) == [c1] f2 = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.( - [1, 2, 2], - MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), - ), MOI.VectorQuadraticTerm.( [1, 1, 2], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), ), + MOI.VectorAffineTerm.( + [1, 2, 2], + MOI.ScalarAffineTerm.([3, 1, 2], [x, x, y]), + ), [7, 3, 4], ) c2 = MOI.add_constraint(model, f2, MOI.PositiveSemidefiniteConeTriangle(3)) diff --git a/test/Utilities/parser.jl b/test/Utilities/parser.jl index 872a3b625a..82e74e4601 100644 --- a/test/Utilities/parser.jl +++ b/test/Utilities/parser.jl @@ -48,8 +48,8 @@ function test__parse_function() @test _struct_isequal( MOIU._parse_function(:(2 * x * y + y + 1.0)), MOIU._ParsedScalarQuadraticFunction( - MOIU._ParsedScalarAffineTerm.([1.0], [:y]), MOIU._ParsedScalarQuadraticTerm.([2.0], [:x], [:y]), + MOIU._ParsedScalarAffineTerm.([1.0], [:y]), 1.0, ), ) @@ -70,14 +70,14 @@ function test__parse_function() @test _struct_isequal( MOIU._parse_function(:([x, 2x + y + 5.0, 1 * x * x])), MOIU._ParsedVectorQuadraticFunction( - MOIU._ParsedVectorAffineTerm.( - [1, 2, 2], - MOIU._ParsedScalarAffineTerm.([1.0, 2.0, 1.0], [:x, :x, :y]), - ), MOIU._ParsedVectorQuadraticTerm.( [3], MOIU._ParsedScalarQuadraticTerm.([2.0], [:x], [:x]), ), + MOIU._ParsedVectorAffineTerm.( + [1, 2, 2], + MOIU._ParsedScalarAffineTerm.([1.0, 2.0, 1.0], [:x, :x, :y]), + ), [0.0, 5.0, 0.0], ), ) diff --git a/test/Utilities/print.jl b/test/Utilities/print.jl index 2874f4bc1e..51e411f8a1 100644 --- a/test/Utilities/print.jl +++ b/test/Utilities/print.jl @@ -130,8 +130,8 @@ function test_ScalarQuadraticFunction() MOI.set(model, MOI.VariableName(), x, "x") MOI.set(model, MOI.VariableName(), y, "y") f = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([-1.2, 1.3], [x, x]), MOI.ScalarQuadraticTerm.([0.5, 0.6], [x, x], [x, y]), + MOI.ScalarAffineTerm.([-1.2, 1.3], [x, x]), 1.4, ) @test MOIU._to_string(PLAIN, model, f) == diff --git a/test/deprecate.jl b/test/deprecate.jl index cb6f4fe137..803660c1b1 100644 --- a/test/deprecate.jl +++ b/test/deprecate.jl @@ -42,6 +42,30 @@ function test_deprecations_ScalarQuadraticTerm() @test_logs (:warn,) t.variable_index_2 == y end +function test_deprecations_ScalarQuadraticFunction() + @test_logs( + (:warn,), + MOI.ScalarQuadraticFunction( + MOI.ScalarAffineTerm{Int}[], + MOI.ScalarQuadraticTerm{Int}[], + 0, + ), + ) + return +end + +function test_deprecations_VectorQuadraticFunction() + @test_logs( + (:warn,), + MOI.VectorQuadraticFunction( + MOI.VectorAffineTerm{Int}[], + MOI.VectorQuadraticTerm{Int}[], + [0, 1], + ), + ) + return +end + function test_RawOptimizerAttribute() @test_logs (:warn,) MOI.RawParameter(:a) == MOI.RawOptimizerAttribute("a") end diff --git a/test/functions.jl b/test/functions.jl index f5552e1f11..69d17b5dae 100644 --- a/test/functions.jl +++ b/test/functions.jl @@ -60,8 +60,8 @@ function test_functions_convert_SingleVariable() ) f_vqf = convert(MOI.VectorQuadraticFunction{Float64}, f) @test f_vqf ≈ MOI.VectorQuadraticFunction( - [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(1.0, x))], MOI.VectorQuadraticTerm{Float64}[], + [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(1.0, x))], [0.0], ) end @@ -78,8 +78,8 @@ function test_functions_convert_ScalarAffineFunction() ) f_vqf = convert(MOI.VectorQuadraticFunction{Float64}, f) @test f_vqf ≈ MOI.VectorQuadraticFunction( - [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(2.0, x))], MOI.VectorQuadraticTerm{Float64}[], + [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(2.0, x))], [1.0], ) end @@ -88,19 +88,19 @@ function test_functions_convert_ScalarQuadraticFunction() model = MOI.Utilities.Model{Float64}() x = MOI.add_variable(model) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(2.0, x)], [MOI.ScalarQuadraticTerm(3.0, x, x)], + [MOI.ScalarAffineTerm(2.0, x)], 1.0, ) @test_throws(MethodError, convert(MOI.VectorOfVariables, f)) @test_throws(MethodError, convert(MOI.VectorAffineFunction{Float64}, f)) f_vqf = convert(MOI.VectorQuadraticFunction{Float64}, f) @test f_vqf ≈ MOI.VectorQuadraticFunction( - [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(2.0, x))], MOI.VectorQuadraticTerm{Float64}[MOI.VectorQuadraticTerm( 1, MOI.ScalarQuadraticTerm(3.0, x, x), )], + [MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(2.0, x))], [1.0], ) end @@ -172,8 +172,8 @@ function test_isapprox_ScalarQuadraticFunction() y = MOI.VariableIndex(2) z = MOI.VariableIndex(3) f = MOI.ScalarQuadraticFunction( - [MOI.ScalarAffineTerm(3, x)], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), + [MOI.ScalarAffineTerm(3, x)], 8, ) g = deepcopy(f) @@ -195,14 +195,14 @@ function test_isapprox_VectorQuadraticFunction() y = MOI.VariableIndex(2) z = MOI.VariableIndex(3) f = MOI.VectorQuadraticFunction( - MOI.VectorAffineTerm.( - [1, 2, 1], - MOI.ScalarAffineTerm.([3, 1, 1], [x, x, y]), - ), MOI.VectorQuadraticTerm.( [1, 1, 2], MOI.ScalarQuadraticTerm.([1, 2, 3], [x, y, x], [x, y, y]), ), + MOI.VectorAffineTerm.( + [1, 2, 1], + MOI.ScalarAffineTerm.([3, 1, 1], [x, x, y]), + ), [10, 11, 12], ) g = deepcopy(f) @@ -224,21 +224,21 @@ end function test_isapprox_issue_1483() x = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float16}[], MOI.ScalarQuadraticTerm{Float16}[], + MOI.ScalarAffineTerm{Float16}[], Float16(0.0), ) y = MOI.ScalarQuadraticFunction( + MOI.ScalarQuadraticTerm{Float16}[], MOI.ScalarAffineTerm{Float16}[MOI.ScalarAffineTerm( Float16(1.0), MOI.VariableIndex(1234), )], - MOI.ScalarQuadraticTerm{Float16}[], Float16(0.0), ) z = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float16}[], MOI.ScalarQuadraticTerm{Float16}[], + MOI.ScalarAffineTerm{Float16}[], Float16(0.0), ) @test !(x ≈ y) From d3ea43ca081627ab39ba0e9e949d71dbc3b7cf74 Mon Sep 17 00:00:00 2001 From: odow Date: Tue, 27 Jul 2021 13:53:45 +1200 Subject: [PATCH 2/5] Fix formatting --- test/Utilities/functions.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Utilities/functions.jl b/test/Utilities/functions.jl index fdf16dc162..314482dcb0 100644 --- a/test/Utilities/functions.jl +++ b/test/Utilities/functions.jl @@ -223,8 +223,8 @@ function test_eval_variables() MOI.VectorQuadraticTerm.( [1, 2, 2], MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), - ), - MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), + ), + MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), [-3.0, -2.0], ) @test MOI.output_dimension(fvq) == 2 @@ -312,8 +312,8 @@ function test_map_indices() MOI.VectorQuadraticTerm.( [1, 2, 2], MOI.ScalarQuadraticTerm.(1.0, [x, w, w], [z, z, y]), - ), - MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), + ), + MOI.VectorAffineTerm.([2, 1], MOI.ScalarAffineTerm.(1.0, [x, y])), [-3.0, -2.0], ) gvq = MOI.Utilities.map_indices(index_map, fvq) From 39b05bfd1936dd415d9882c307ff06465044c308 Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 28 Jul 2021 23:27:04 +1200 Subject: [PATCH 3/5] Fix other methods --- src/Utilities/functions.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index a856dc4cfd..b8d65b48eb 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -1042,8 +1042,8 @@ function filter_variables( f::Union{MOI.ScalarQuadraticFunction,MOI.VectorQuadraticFunction}, ) return typeof(f)( - _filter_variables(keep, f.affine_terms), _filter_variables(keep, f.quadratic_terms), + _filter_variables(keep, f.affine_terms), MOI.constant(f), ) end @@ -1077,10 +1077,10 @@ function modify_function(f::VAF, change::MOI.VectorConstantChange) return VAF(f.terms, change.new_constant) end function modify_function(f::SQF, change::MOI.ScalarConstantChange) - return SQF(f.affine_terms, f.quadratic_terms, change.new_constant) + return SQF(f.quadratic_terms, f.affine_terms, change.new_constant) end function modify_function(f::VQF, change::MOI.VectorConstantChange) - return VQF(f.affine_terms, f.quadratic_terms, change.new_constant) + return VQF(f.quadratic_terms, f.affine_terms, change.new_constant) end function _modifycoefficient( From c5fc8053c4da12334cf79f41fb2668f0c2234a03 Mon Sep 17 00:00:00 2001 From: odow Date: Wed, 28 Jul 2021 23:35:03 +1200 Subject: [PATCH 4/5] Another missing change --- src/Utilities/functions.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index b8d65b48eb..0282852057 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -171,7 +171,7 @@ end function map_indices(index_map::F, f::Union{SQF,VQF}) where {F<:Function} lin = map_indices.(index_map, f.affine_terms) quad = map_indices.(index_map, f.quadratic_terms) - return typeof(f)(lin, quad, MOI.constant(f)) + return typeof(f)(quad, lin, MOI.constant(f)) end # Function changes From 47aa06b07f776adb9c0cfb83d7bd4d1c0b5482b4 Mon Sep 17 00:00:00 2001 From: odow Date: Thu, 29 Jul 2021 00:14:23 +1200 Subject: [PATCH 5/5] More changes --- src/Utilities/functions.jl | 10 +++++----- src/Utilities/parser.jl | 4 ++-- src/functions.jl | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Utilities/functions.jl b/src/Utilities/functions.jl index 0282852057..16095898fa 100644 --- a/src/Utilities/functions.jl +++ b/src/Utilities/functions.jl @@ -453,8 +453,8 @@ function ScalarFunctionIterator(f::MOI.VectorQuadraticFunction) return ScalarFunctionIterator( f, ( - output_index_iterator(f.affine_terms, MOI.output_dimension(f)), output_index_iterator(f.quadratic_terms, MOI.output_dimension(f)), + output_index_iterator(f.affine_terms, MOI.output_dimension(f)), ), ) end @@ -533,11 +533,11 @@ function Base.getindex( return MOI.ScalarQuadraticFunction( MOI.ScalarQuadraticTerm{T}[ it.f.quadratic_terms[i].scalar_term for - i in ChainedIteratorAtIndex(it.cache[2], output_index) + i in ChainedIteratorAtIndex(it.cache[1], output_index) ], MOI.ScalarAffineTerm{T}[ it.f.affine_terms[i].scalar_term for - i in ChainedIteratorAtIndex(it.cache[1], output_index) + i in ChainedIteratorAtIndex(it.cache[2], output_index) ], it.f.constants[output_index], ) @@ -550,13 +550,13 @@ function Base.getindex( vat = MOI.VectorAffineTerm{T}[] vqt = MOI.VectorQuadraticTerm{T}[] for (i, output_index) in enumerate(output_indices) - for j in ChainedIteratorAtIndex(it.cache[1], output_index) + for j in ChainedIteratorAtIndex(it.cache[2], output_index) push!( vat, MOI.VectorAffineTerm(i, it.f.affine_terms[j].scalar_term), ) end - for j in ChainedIteratorAtIndex(it.cache[2], output_index) + for j in ChainedIteratorAtIndex(it.cache[1], output_index) push!( vqt, MOI.VectorQuadraticTerm(i, it.f.quadratic_terms[j].scalar_term), diff --git a/src/Utilities/parser.jl b/src/Utilities/parser.jl index 018832b76e..9fe5cc3b52 100644 --- a/src/Utilities/parser.jl +++ b/src/Utilities/parser.jl @@ -27,8 +27,8 @@ struct _ParsedScalarQuadraticTerm end struct _ParsedScalarQuadraticFunction - affine_terms::Vector{_ParsedScalarAffineTerm} quadratic_terms::Vector{_ParsedScalarQuadraticTerm} + affine_terms::Vector{_ParsedScalarAffineTerm} constant::Float64 end @@ -38,8 +38,8 @@ struct _ParsedVectorQuadraticTerm end struct _ParsedVectorQuadraticFunction - affine_terms::Vector{_ParsedVectorAffineTerm} quadratic_terms::Vector{_ParsedVectorQuadraticTerm} + affine_terms::Vector{_ParsedVectorAffineTerm} constant::Vector{Float64} end diff --git a/src/functions.jl b/src/functions.jl index 62c74fffb6..c306eafc47 100644 --- a/src/functions.jl +++ b/src/functions.jl @@ -387,8 +387,8 @@ end function _dicts(f::Union{ScalarQuadraticFunction,VectorQuadraticFunction}) return ( - sum_dict(term_pair.(f.affine_terms)), sum_dict(term_pair.(f.quadratic_terms)), + sum_dict(term_pair.(f.affine_terms)), ) end @@ -486,8 +486,8 @@ function Base.copy( func::F, ) where {F<:Union{ScalarQuadraticFunction,VectorQuadraticFunction}} return F( - copy(func.affine_terms), copy(func.quadratic_terms), + copy(func.affine_terms), copy(constant(func)), ) end