From 86b0432350276da2626b9e9771f8b7db7baa8040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 10 Jan 2020 13:42:34 +0100 Subject: [PATCH 1/7] remove N field --- src/Utilities/mockoptimizer.jl | 4 +-- src/attributes.jl | 54 ++++++++++++++++------------------ src/nlp.jl | 10 +++---- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/Utilities/mockoptimizer.jl b/src/Utilities/mockoptimizer.jl index cf7246af3c..56c0f950d1 100644 --- a/src/Utilities/mockoptimizer.jl +++ b/src/Utilities/mockoptimizer.jl @@ -307,14 +307,14 @@ function MOI.get(mock::MockOptimizer, attr::MOI.DualObjectiveValue) end end function MOI.get(mock::MockOptimizer, attr::MOI.PrimalStatus) - if attr.N > mock.result_count + if attr.result_index > mock.result_count return MOI.NO_SOLUTION else return mock.primalstatus end end function MOI.get(mock::MockOptimizer, attr::MOI.DualStatus) - if attr.N > mock.result_count + if attr.result_index > mock.result_count return MOI.NO_SOLUTION else return mock.dualstatus diff --git a/src/attributes.jl b/src/attributes.jl index 7604eb1446..15e4fee745 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -123,13 +123,11 @@ struct ResultIndexBoundsError{AttrType} <: Exception attr::AttrType result_count::Int end -# TODO: rename the .N -> .result_index field in necessary attributes (e.g., -# VariablePrimal, ConstraintPrimal, ConstraintDual), and remove this helper -# function. + _result_index_field(attr) = attr.result_index function check_result_index_bounds(model::ModelLike, attr) result_count = get(model, ResultCount()) - if !(1 <= _result_index_field(attr) <= result_count) + if !(1 <= attr.result_index <= result_count) throw(ResultIndexBoundsError(attr, result_count)) end end @@ -946,10 +944,10 @@ A variable attribute for the assignment to some primal variable's value in resul If `N` is omitted, it is 1 by default. """ struct VariablePrimal <: AbstractVariableAttribute - N::Int + result_index::Int end VariablePrimal() = VariablePrimal(1) -_result_index_field(attr::VariablePrimal) = attr.N +_result_index_field(attr::VariablePrimal) = attr.result_index """ CallbackVariablePrimal(callback_data) @@ -1025,11 +1023,11 @@ A constraint attribute for the initial assignment to some constraint's dual valu struct ConstraintDualStart <: AbstractConstraintAttribute end """ - ConstraintPrimal(N) + ConstraintPrimal(result_index::Int) ConstraintPrimal() -A constraint attribute for the assignment to some constraint's primal value(s) in result `N`. -If `N` is omitted, it is 1 by default. +A constraint attribute for the assignment to some constraint's primal value(s) +in result `result_index`. If `result_index` is omitted, it is 1 by default. Given a constraint `function-in-set`, the `ConstraintPrimal` is the value of the function evaluated at the primal solution of the variables. For example, given @@ -1038,23 +1036,23 @@ a primal solution of `(x,y) = (4,5)`, the `ConstraintPrimal` solution of the constraint is `1 * 4 + 2 * 5 + 3 = 17`. """ struct ConstraintPrimal <: AbstractConstraintAttribute - N::Int + result_index::Int end ConstraintPrimal() = ConstraintPrimal(1) -_result_index_field(attr::ConstraintPrimal) = attr.N +_result_index_field(attr::ConstraintPrimal) = attr.result_index """ - ConstraintDual(N) + ConstraintDual(result_index) ConstraintDual() -A constraint attribute for the assignment to some constraint's dual value(s) in result `N`. -If `N` is omitted, it is 1 by default. +A constraint attribute for the assignment to some constraint's dual value(s) in result `result_index`. +If `result_index` is omitted, it is 1 by default. """ struct ConstraintDual <: AbstractConstraintAttribute - N::Int + result_index::Int end ConstraintDual() = ConstraintDual(1) -_result_index_field(attr::ConstraintDual) = attr.N +_result_index_field(attr::ConstraintDual) = attr.result_index """ ConstraintBasisStatus(result_index) @@ -1268,32 +1266,32 @@ The values indicate how to interpret the result vector. UNKNOWN_RESULT_STATUS, OTHER_RESULT_STATUS) """ - PrimalStatus(N) + PrimalStatus(result_index::Int) PrimalStatus() -A model attribute for the `ResultStatusCode` of the primal result `N`. -If `N` is omitted, it defaults to 1. If `N` is larger than the value of -[`ResultCount`](@ref) then `NO_SOLUTION` is returned. +A model attribute for the `ResultStatusCode` of the primal result `result_index`. +If `result_index` is omitted, it defaults to 1. If `result_index` is larger than +the value of [`ResultCount`](@ref) then `NO_SOLUTION` is returned. """ struct PrimalStatus <: AbstractModelAttribute - N::Int + result_index::Int end PrimalStatus() = PrimalStatus(1) -_result_index_field(attr::PrimalStatus) = attr.N +_result_index_field(attr::PrimalStatus) = attr.result_index """ - DualStatus(N) + DualStatus(result_index) DualStatus() -A model attribute for the `ResultStatusCode` of the dual result `N`. -If `N` is omitted, it defaults to 1. If `N` is larger than the value of -[`ResultCount`](@ref) then `NO_SOLUTION` is returned. +A model attribute for the `ResultStatusCode` of the dual result `result_index`. +If `result_index` is omitted, it defaults to 1. If `result_index` is larger than +the value of [`ResultCount`](@ref) then `NO_SOLUTION` is returned. """ struct DualStatus <: AbstractModelAttribute - N::Int + result_index::Int end DualStatus() = DualStatus(1) -_result_index_field(attr::DualStatus) = attr.N +_result_index_field(attr::DualStatus) = attr.result_index """ is_set_by_optimize(::AnyAttribute) diff --git a/src/nlp.jl b/src/nlp.jl index 33c1fc3bd3..5eecbfb997 100644 --- a/src/nlp.jl +++ b/src/nlp.jl @@ -22,17 +22,17 @@ optionally a nonlinear objective. struct NLPBlock <: AbstractModelAttribute end """ - NLPBlockDual(N) + NLPBlockDual(result_index::Int) NLPBlockDual() -The Lagrange multipliers on the constraints from the `NLPBlock` in result `N`. -If `N` is omitted, it is 1 by default. +The Lagrange multipliers on the constraints from the `NLPBlock` in result `result_index`. +If `result_index` is omitted, it is 1 by default. """ struct NLPBlockDual <: AbstractModelAttribute - N::Int + result_index::Int end NLPBlockDual() = NLPBlockDual(1) -_result_index_field(attr::NLPBlockDual) = attr.N +_result_index_field(attr::NLPBlockDual) = attr.result_index is_set_by_optimize(::NLPBlockDual) = true From a0e3bebac55c259a5fe8d8b0b5def1443dbba087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 10 Jan 2020 13:50:01 +0100 Subject: [PATCH 2/7] fix tests --- src/Bridges/Constraint/indicator_sos.jl | 4 ++-- src/Bridges/Constraint/vectorize.jl | 2 +- src/Bridges/Variable/vectorize.jl | 4 ++-- src/Utilities/results.jl | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Bridges/Constraint/indicator_sos.jl b/src/Bridges/Constraint/indicator_sos.jl index 93505b570a..c4fd9d4ed1 100644 --- a/src/Bridges/Constraint/indicator_sos.jl +++ b/src/Bridges/Constraint/indicator_sos.jl @@ -159,8 +159,8 @@ function MOI.supports( end function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintPrimal, bridge::IndicatorSOS1Bridge) - zvalue = MOI.get(model, MOI.VariablePrimal(attr.N), bridge.z_variable_index) - wvalue = MOI.get(model, MOI.VariablePrimal(attr.N), bridge.w_variable_index) + zvalue = MOI.get(model, MOI.VariablePrimal(attr.result_index), bridge.z_variable_index) + wvalue = MOI.get(model, MOI.VariablePrimal(attr.result_index), bridge.w_variable_index) lin_primal_start = MOI.get(model, attr, bridge.linear_constraint_index) return [zvalue, lin_primal_start - wvalue] end diff --git a/src/Bridges/Constraint/vectorize.jl b/src/Bridges/Constraint/vectorize.jl index 44666d941d..247176efee 100644 --- a/src/Bridges/Constraint/vectorize.jl +++ b/src/Bridges/Constraint/vectorize.jl @@ -72,7 +72,7 @@ function MOI.get(model::MOI.ModelLike, @assert length(x) == 1 y = x[1] if !(attr isa MOI.ConstraintPrimal && - MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.N)))) + MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.result_index)))) # If it is an infeasibility certificate, it is a ray and satisfies the # homogenized problem, see https://github.com/JuliaOpt/MathOptInterface.jl/issues/433 # Otherwise, we need to add the set constant since the ConstraintPrimal diff --git a/src/Bridges/Variable/vectorize.jl b/src/Bridges/Variable/vectorize.jl index f29e489e4e..2642c91375 100644 --- a/src/Bridges/Variable/vectorize.jl +++ b/src/Bridges/Variable/vectorize.jl @@ -76,7 +76,7 @@ function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintPrimal, x = MOI.get(model, attr, bridge.vector_constraint) @assert length(x) == 1 y = x[1] - if !MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.N))) + if !MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.result_index))) # If it is an infeasibility certificate, it is a ray and satisfies the # homogenized problem, see https://github.com/JuliaOpt/MathOptInterface.jl/issues/433 # Otherwise, we need to add the set constant since the ConstraintPrimal @@ -98,7 +98,7 @@ function MOI.get(model::MOI.ModelLike, bridge::VectorizeBridge) value = MOI.get(model, attr, bridge.variable) if !(attr isa MOI.VariablePrimal && - MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.N)))) + MOIU.is_ray(MOI.get(model, MOI.PrimalStatus(attr.result_index)))) value += bridge.set_constant end return value diff --git a/src/Utilities/results.jl b/src/Utilities/results.jl index c0b8e5d488..0bb395d0c7 100644 --- a/src/Utilities/results.jl +++ b/src/Utilities/results.jl @@ -267,7 +267,7 @@ function variable_dual(model::MOI.ModelLike, ci::MOI.ConstraintIndex{<:MOI.VectorQuadraticFunction}) func = MOI.get(model, MOI.ConstraintFunction(), ci) set = MOI.get(model, MOI.ConstraintSet(), ci) - primal_attr = MOI.VariablePrimal(attr.N) + primal_attr = MOI.VariablePrimal(attr.result_index) coef = variable_coefficient(func, vi, vi -> MOI.get(model, primal_attr, vi)) dual = MOI.get(model, attr, ci) return set_dot(coef, dual, set) @@ -286,7 +286,7 @@ function variable_dual(model::MOI.ModelLike, vi::MOI.VariableIndex, ci::MOI.ConstraintIndex{<:MOI.ScalarQuadraticFunction}) func = MOI.get(model, MOI.ConstraintFunction(), ci) - primal_attr = MOI.VariablePrimal(attr.N) + primal_attr = MOI.VariablePrimal(attr.result_index) coef = variable_coefficient(func, vi, vi -> MOI.get(model, primal_attr, vi)) dual = MOI.get(model, attr, ci) return coef * dual @@ -369,7 +369,7 @@ function variable_dual(model::MOI.ModelLike, dual += sign * variable_coefficient(f, vi) elseif F <: MOI.ScalarQuadraticFunction f = MOI.get(model, obj_attr) - primal_attr = MOI.VariablePrimal(attr.N) + primal_attr = MOI.VariablePrimal(attr.result_index) dual += sign * variable_coefficient(f, vi, vi -> MOI.get(model, primal_attr, vi)) else error("Fallback getter for variable constraint dual does not", From 29de5620d89e398ac3d78d5ea5786169e1baac1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 10 Jan 2020 15:13:44 +0100 Subject: [PATCH 3/7] deprecate helper function --- src/attributes.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/attributes.jl b/src/attributes.jl index 15e4fee745..56460b2b60 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -124,7 +124,9 @@ struct ResultIndexBoundsError{AttrType} <: Exception result_count::Int end -_result_index_field(attr) = attr.result_index +# deprecate _result_index_field, no export +@deprecate _result_index_field(attr) attr.result_index false + function check_result_index_bounds(model::ModelLike, attr) result_count = get(model, ResultCount()) if !(1 <= attr.result_index <= result_count) From 5a5ac6f67d28606499f7e9f01eedc428bd4e63a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 10 Jan 2020 19:09:41 +0100 Subject: [PATCH 4/7] remove methods for result field --- src/attributes.jl | 5 ----- src/nlp.jl | 1 - test/attributes.jl | 2 ++ 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/attributes.jl b/src/attributes.jl index 56460b2b60..0368c51852 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -949,7 +949,6 @@ struct VariablePrimal <: AbstractVariableAttribute result_index::Int end VariablePrimal() = VariablePrimal(1) -_result_index_field(attr::VariablePrimal) = attr.result_index """ CallbackVariablePrimal(callback_data) @@ -1041,7 +1040,6 @@ struct ConstraintPrimal <: AbstractConstraintAttribute result_index::Int end ConstraintPrimal() = ConstraintPrimal(1) -_result_index_field(attr::ConstraintPrimal) = attr.result_index """ ConstraintDual(result_index) @@ -1054,7 +1052,6 @@ struct ConstraintDual <: AbstractConstraintAttribute result_index::Int end ConstraintDual() = ConstraintDual(1) -_result_index_field(attr::ConstraintDual) = attr.result_index """ ConstraintBasisStatus(result_index) @@ -1279,7 +1276,6 @@ struct PrimalStatus <: AbstractModelAttribute result_index::Int end PrimalStatus() = PrimalStatus(1) -_result_index_field(attr::PrimalStatus) = attr.result_index """ DualStatus(result_index) @@ -1293,7 +1289,6 @@ struct DualStatus <: AbstractModelAttribute result_index::Int end DualStatus() = DualStatus(1) -_result_index_field(attr::DualStatus) = attr.result_index """ is_set_by_optimize(::AnyAttribute) diff --git a/src/nlp.jl b/src/nlp.jl index 5eecbfb997..be25e5310f 100644 --- a/src/nlp.jl +++ b/src/nlp.jl @@ -32,7 +32,6 @@ struct NLPBlockDual <: AbstractModelAttribute result_index::Int end NLPBlockDual() = NLPBlockDual(1) -_result_index_field(attr::NLPBlockDual) = attr.result_index is_set_by_optimize(::NLPBlockDual) = true diff --git a/test/attributes.jl b/test/attributes.jl index e503cf5999..3fb9e32611 100644 --- a/test/attributes.jl +++ b/test/attributes.jl @@ -28,4 +28,6 @@ @test_throws err MOI.set(model, MOI.VariablePrimalStart(), [x], ones(2)) end + attr = MOI.VariablePrimal() + @test_deprecated MOI._result_index_field(attr) end From 6488b9945c39f309db839b2d4ea99e346737f4c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Thu, 3 Dec 2020 20:28:12 +0100 Subject: [PATCH 5/7] fix indexing --- src/Bridges/Constraint/semi_to_binary.jl | 2 +- src/Bridges/Constraint/soc_to_nonconvex_quad.jl | 2 +- src/Utilities/mockoptimizer.jl | 4 ++-- src/Utilities/results.jl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Bridges/Constraint/semi_to_binary.jl b/src/Bridges/Constraint/semi_to_binary.jl index aeef00099f..e3a4a0099e 100644 --- a/src/Bridges/Constraint/semi_to_binary.jl +++ b/src/Bridges/Constraint/semi_to_binary.jl @@ -115,7 +115,7 @@ end function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintPrimal, bridge::SemiToBinaryBridge) - MOI.get(model, MOI.VariablePrimal(attr.N), bridge.variable_index) + MOI.get(model, MOI.VariablePrimal(attr.result_index), bridge.variable_index) end function MOI.supports( diff --git a/src/Bridges/Constraint/soc_to_nonconvex_quad.jl b/src/Bridges/Constraint/soc_to_nonconvex_quad.jl index 6f6c143f1b..abb0a49bd0 100644 --- a/src/Bridges/Constraint/soc_to_nonconvex_quad.jl +++ b/src/Bridges/Constraint/soc_to_nonconvex_quad.jl @@ -180,7 +180,7 @@ end # Attributes, Bridge acting as a constraint function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintPrimal, bridge::AbstractSOCtoNonConvexQuadBridge) - vals = MOI.get.(model, MOI.VariablePrimal(attr.N), bridge.vars) + vals = MOI.get.(model, MOI.VariablePrimal(attr.result_index), bridge.vars) return vals end diff --git a/src/Utilities/mockoptimizer.jl b/src/Utilities/mockoptimizer.jl index 81b7af9d8f..076607fe5e 100644 --- a/src/Utilities/mockoptimizer.jl +++ b/src/Utilities/mockoptimizer.jl @@ -160,10 +160,10 @@ function MOI.set(mock::MockOptimizer, attr::MOI.DualObjectiveValue, value::Real) mock.dual_objective_value[attr.result_index] = value end function MOI.set(mock::MockOptimizer, attr::MOI.PrimalStatus, value::MOI.ResultStatusCode) - mock.primal_status[attr.N] = value + mock.primal_status[attr.result_index] = value end function MOI.set(mock::MockOptimizer, attr::MOI.DualStatus, value::MOI.ResultStatusCode) - mock.dual_status[attr.N] = value + mock.dual_status[attr.result_index] = value end MOI.set(mock::MockOptimizer, ::MockModelAttribute, value::Integer) = (mock.attribute = value) function MOI.supports(mock::MockOptimizer, attr::MOI.AbstractOptimizerAttribute) diff --git a/src/Utilities/results.jl b/src/Utilities/results.jl index 94ff6858be..9fcba71448 100644 --- a/src/Utilities/results.jl +++ b/src/Utilities/results.jl @@ -149,7 +149,7 @@ function get_fallback(model::MOI.ModelLike, attr::MOI.ConstraintPrimal, idx::MOI.ConstraintIndex) f = MOI.get(model, MOI.ConstraintFunction(), idx) # TODO do not include constant if primal solution is a ray - return eval_variables(vi -> MOI.get(model, MOI.VariablePrimal(attr.N), vi), f) + return eval_variables(vi -> MOI.get(model, MOI.VariablePrimal(attr.result_index), vi), f) end ################ Constraint Dual for Variable-wise constraints ################# From f7ae306207e39f93b8a9e106137e1666840cafa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Thu, 3 Dec 2020 21:22:35 +0100 Subject: [PATCH 6/7] fix deprecations --- src/Utilities/mockoptimizer.jl | 10 +++++----- src/attributes.jl | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Utilities/mockoptimizer.jl b/src/Utilities/mockoptimizer.jl index 076607fe5e..9b1d58f6f4 100644 --- a/src/Utilities/mockoptimizer.jl +++ b/src/Utilities/mockoptimizer.jl @@ -318,14 +318,14 @@ function MOI.get(mock::MockOptimizer, attr::MOI.PrimalStatus) if attr.result_index > mock.result_count return MOI.NO_SOLUTION else - return get(mock.primal_status, attr.N, MOI.NO_SOLUTION) + return get(mock.primal_status, attr.result_index, MOI.NO_SOLUTION) end end function MOI.get(mock::MockOptimizer, attr::MOI.DualStatus) if attr.result_index > mock.result_count return MOI.NO_SOLUTION else - return get(mock.dual_status, attr.N, MOI.NO_SOLUTION) + return get(mock.dual_status, attr.result_index, MOI.NO_SOLUTION) end end MOI.get(mock::MockOptimizer, ::MockModelAttribute) = mock.attribute @@ -402,7 +402,7 @@ function _safe_set_result(dict::Dict{K,V}, attr::MOI.AnyAttribute, index::K, if !haskey(dict, xored) dict[xored] = V() end - dict[xored][MOI._result_index_field(attr)] = value + dict[xored][attr.result_index] = value end function _safe_get_result(dict::Dict, attr::MOI.AnyAttribute, index::MOI.Index, name::String) @@ -411,9 +411,9 @@ function _safe_get_result(dict::Dict, attr::MOI.AnyAttribute, index::MOI.Index, if result_to_value === nothing error("No mock $name is set for ", index_name, " `", index, "`.") end - value = get(result_to_value, MOI._result_index_field(attr), nothing) + value = get(result_to_value, attr.result_index, nothing) if value === nothing - error("No mock $name is set for ", index_name, " `", index, "` at result index `", MOI._result_index_field(attr), "`.") + error("No mock $name is set for ", index_name, " `", index, "` at result index `", attr.result_index, "`.") end return value end diff --git a/src/attributes.jl b/src/attributes.jl index 49f772105a..99aa562d97 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -1004,11 +1004,11 @@ A variable attribute for the initial assignment to some primal variable's value struct VariablePrimalStart <: AbstractVariableAttribute end """ - VariablePrimal(N) + VariablePrimal(result_index) VariablePrimal() -A variable attribute for the assignment to some primal variable's value in result `N`. -If `N` is omitted, it is 1 by default. +A variable attribute for the assignment to some primal variable's value in result `result_index`. +If `result_index` is omitted, it is 1 by default. """ struct VariablePrimal <: AbstractVariableAttribute result_index::Int From 952c087208c411ad1f71173a788723172690d273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Besan=C3=A7on?= Date: Fri, 4 Dec 2020 15:33:02 +0100 Subject: [PATCH 7/7] test deprecation --- src/MathOptInterface.jl | 2 ++ src/attributes.jl | 3 --- src/deprecate.jl | 20 ++++++++++++++++++++ test/attributes.jl | 19 ++++++++++++++++++- 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/deprecate.jl diff --git a/src/MathOptInterface.jl b/src/MathOptInterface.jl index 6153434604..88f84aa49a 100644 --- a/src/MathOptInterface.jl +++ b/src/MathOptInterface.jl @@ -139,6 +139,8 @@ include("modifications.jl") include("variables.jl") include("nlp.jl") +include("deprecate.jl") + # submodules include("Utilities/Utilities.jl") # MOI.Utilities include("Test/Test.jl") # MOI.Test diff --git a/src/attributes.jl b/src/attributes.jl index 99aa562d97..7d4ce8859e 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -124,9 +124,6 @@ struct ResultIndexBoundsError{AttrType} <: Exception result_count::Int end -# deprecate _result_index_field, no export -@deprecate _result_index_field(attr) attr.result_index false - function check_result_index_bounds(model::ModelLike, attr) result_count = get(model, ResultCount()) if !(1 <= attr.result_index <= result_count) diff --git a/src/deprecate.jl b/src/deprecate.jl new file mode 100644 index 0000000000..63b496e3d9 --- /dev/null +++ b/src/deprecate.jl @@ -0,0 +1,20 @@ +# deprecate _result_index_field and accessing attr.N, no export +@deprecate _result_index_field(attr) attr.result_index false + +function Base.getproperty(attr::Attr, f::Symbol) where Attr <:Union{ + ObjectiveValue, + DualObjectiveValue, + VariablePrimal, + ConstraintPrimal, + ConstraintDual, + ConstraintBasisStatus, + PrimalStatus, + DualStatus, + NLPBlockDual, + } + if f === :N + @warn "Field attr.N is deprecated, use attr.result_index" + return getfield(attr, :result_index) + end + return getfield(attr, f) +end diff --git a/test/attributes.jl b/test/attributes.jl index de34b791ba..c8c0057153 100644 --- a/test/attributes.jl +++ b/test/attributes.jl @@ -30,5 +30,22 @@ ones(2)) end attr = MOI.VariablePrimal() - @test_deprecated MOI._result_index_field(attr) + @test_deprecated begin + @test MOI._result_index_field(attr) == 1 + end + + for attr_type in ( + MOI.ObjectiveValue, + MOI.DualObjectiveValue, + MOI.VariablePrimal, + MOI.ConstraintPrimal, + MOI.ConstraintDual, + MOI.ConstraintBasisStatus, + MOI.PrimalStatus, + MOI.DualStatus, + MOI.NLPBlockDual, + ) + attr = attr_type(1) + @test_logs (:warn, "Field attr.N is deprecated, use attr.result_index") attr.N + end end