diff --git a/src/lp_sensitivity2.jl b/src/lp_sensitivity2.jl index 3b0d62aa1fb..74e91f66d5d 100644 --- a/src/lp_sensitivity2.jl +++ b/src/lp_sensitivity2.jl @@ -334,11 +334,15 @@ end Return `true` if `model` is a linear program. """ function _is_lp(model::GenericModel) + AffType = Union{GenericVariableRef,GenericAffExpr} + if !(objective_function_type(model) <: AffType) + return false + end for (F, S) in list_of_constraint_types(model) # TODO(odow): support Interval constraints. if !(S <: Union{MOI.LessThan,MOI.GreaterThan,MOI.EqualTo}) return false - elseif !(F <: Union{GenericVariableRef,GenericAffExpr}) + elseif !(F <: AffType) return false end end diff --git a/test/test_lp_sensitivity2.jl b/test/test_lp_sensitivity2.jl index 19d33bb43ff..3931dd6b7f8 100644 --- a/test/test_lp_sensitivity2.jl +++ b/test/test_lp_sensitivity2.jl @@ -588,4 +588,39 @@ function test_degenerate_error() return end +function test_is_lp() + err = ErrorException( + """ + Unable to compute LP sensitivity because the model is not a linear program, or it contains interval constraints. + + Remove any nonlinear or integer components, and replace any interval constraints with separate upper and lower bound constraints. + """, + ) + # Integer variable + model = Model() + @variable(model, x, Int) + @test_throws err lp_sensitivity_report(model) + # Quadratic objective + model = Model() + @variable(model, x) + @objective(model, Min, x^2) + @test_throws err lp_sensitivity_report(model) + # Nonlinear objective + model = Model() + @variable(model, x) + @objective(model, Max, log(x)) + @test_throws err lp_sensitivity_report(model) + # Quadratic constraint + model = Model() + @variable(model, x) + @constraint(model, x^2 <= 1) + @test_throws err lp_sensitivity_report(model) + # Conic constraint + model = Model() + @variable(model, x[1:3]) + @constraint(model, x in MOI.ExponentialCone()) + @test_throws err lp_sensitivity_report(model) + return +end + end # module