From 370b70a0ad6abb59e491791d06eae5dca75e965b Mon Sep 17 00:00:00 2001 From: Miles Lubin Date: Sat, 5 Jan 2019 14:03:27 -0500 Subject: [PATCH] Correctly initialise disable_2ndorder (#1738) Fixes #1735 --- src/nlp.jl | 42 +++++++++++++++++++++++++----------------- test/nlp.jl | 10 ++++++++++ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/nlp.jl b/src/nlp.jl index 317c5a06fdd..6d1905ee293 100644 --- a/src/nlp.jl +++ b/src/nlp.jl @@ -297,21 +297,6 @@ end function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol}) nldata::NLPData = d.m.nlp_data - # Check if we have any user-defined operators, in which case we need to - # disable hessians. The result of features_available depends on this. - has_nlobj = nldata.nlobj !== nothing - has_user_mv_operator = false - for nlexpr in nldata.nlexpr - has_user_mv_operator |= Derivatives.has_user_multivariate_operators(nlexpr.nd) - end - if has_nlobj - has_user_mv_operator |= Derivatives.has_user_multivariate_operators(nldata.nlobj.nd) - end - for nlconstr in nldata.nlconstr - has_user_mv_operator |= Derivatives.has_user_multivariate_operators(nlconstr.terms.nd) - end - d.disable_2ndorder = has_user_mv_operator - for feat in requested_features if !(feat in MOI.features_available(d)) error("Unsupported feature $feat") @@ -452,11 +437,34 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol}) nothing end +function recompute_disable_2ndorder(evaluator::NLPEvaluator) + # Check if we have any user-defined operators, in which case we need to + # disable hessians. The result of features_available depends on this. + nldata::NLPData = evaluator.m.nlp_data + has_nlobj = nldata.nlobj !== nothing + has_user_mv_operator = false + for nlexpr in nldata.nlexpr + has_user_mv_operator |= Derivatives. + has_user_multivariate_operators(nlexpr.nd) + end + if has_nlobj + has_user_mv_operator |= Derivatives. + has_user_multivariate_operators(nldata.nlobj.nd) + end + for nlconstr in nldata.nlconstr + has_user_mv_operator |= Derivatives. + has_user_multivariate_operators(nlconstr.terms.nd) + end + evaluator.disable_2ndorder = has_user_mv_operator + return +end + function MOI.features_available(d::NLPEvaluator) + recompute_disable_2ndorder(d) features = [:Grad, :Jac, :ExprGraph] if !d.disable_2ndorder - push!(features,:Hess) - push!(features,:HessVec) + push!(features, :Hess) + push!(features, :HessVec) end return features end diff --git a/test/nlp.jl b/test/nlp.jl index 4980465c1cf..3f60e00f616 100644 --- a/test/nlp.jl +++ b/test/nlp.jl @@ -572,4 +572,14 @@ @test JuMP.value(ex2, JuMP.start_value) ≈ sin(2.0) + 4.0 @test JuMP.value(ex3, JuMP.start_value) ≈ 2.5 * sin(2.0) + 2.0 end + + @testset "Hessians disabled with user-defined multivariate functions" begin + model = Model() + my_f(x, y) = (x - 1)^2 + (y - 2)^2 + JuMP.register(model, :my_f, 2, my_f, autodiff = true) + @variable(model, x[1:2]) + @NLobjective(model, Min, my_f(x[1], x[2])) + evaluator = JuMP.NLPEvaluator(model) + @test !(:Hess in MOI.features_available(evaluator)) + end end