From 6ebe1d36501d1febef8adb90d0c3b8b8b95dbfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Fri, 25 Apr 2025 23:48:06 +0200 Subject: [PATCH 1/5] Disable linearity detection for subexpression if no hessian --- src/Nonlinear/ReverseAD/mathoptinterface_api.jl | 1 + src/Nonlinear/ReverseAD/types.jl | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Nonlinear/ReverseAD/mathoptinterface_api.jl b/src/Nonlinear/ReverseAD/mathoptinterface_api.jl index 787eb62673..47ee17393d 100644 --- a/src/Nonlinear/ReverseAD/mathoptinterface_api.jl +++ b/src/Nonlinear/ReverseAD/mathoptinterface_api.jl @@ -69,6 +69,7 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol}) d.data.expressions[k], d.subexpression_linearity, moi_index_to_consecutive_index, + d.want_hess, ) d.subexpressions[k] = subex d.subexpression_linearity[k] = subex.linearity diff --git a/src/Nonlinear/ReverseAD/types.jl b/src/Nonlinear/ReverseAD/types.jl index 6526a2d461..0e58ad9e82 100644 --- a/src/Nonlinear/ReverseAD/types.jl +++ b/src/Nonlinear/ReverseAD/types.jl @@ -18,12 +18,17 @@ struct _SubexpressionStorage expr::Nonlinear.Expression, subexpression_linearity, moi_index_to_consecutive_index, + want_hess::Bool, ) nodes = _replace_moi_variables(expr.nodes, moi_index_to_consecutive_index) adj = Nonlinear.adjacency_matrix(nodes) N = length(nodes) - linearity = _classify_linearity(nodes, adj, subexpression_linearity) + linearity = if want_hess + _classify_linearity(nodes, adj, subexpression_linearity)[1] + else + NONLINEAR + end return new( nodes, adj, From e39fdbc12a0b1b59cea1d9c86a9dd6d2bc7679b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 26 Apr 2025 09:04:12 +0200 Subject: [PATCH 2/5] Fix --- src/Nonlinear/ReverseAD/types.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nonlinear/ReverseAD/types.jl b/src/Nonlinear/ReverseAD/types.jl index 0e58ad9e82..fc599accb0 100644 --- a/src/Nonlinear/ReverseAD/types.jl +++ b/src/Nonlinear/ReverseAD/types.jl @@ -37,7 +37,7 @@ struct _SubexpressionStorage zeros(N), # partials_storage, zeros(N), # reverse_storage, Float64[], - linearity[1], + linearity, ) end end From f402f753a034853d9cb38cf2bed38c9d45972096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 26 Apr 2025 09:18:07 +0200 Subject: [PATCH 3/5] Add test --- test/Nonlinear/ReverseAD.jl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/Nonlinear/ReverseAD.jl b/test/Nonlinear/ReverseAD.jl index 43fbb28b4f..2f65a2bc70 100644 --- a/test/Nonlinear/ReverseAD.jl +++ b/test/Nonlinear/ReverseAD.jl @@ -630,6 +630,18 @@ function test_linearity() return end +function test_linearity_no_hess() + x = MOI.VariableIndex(1) + model = Nonlinear.Model() + ex = Nonlinear.add_expression(model, :($x + 1)) + Nonlinear.set_objective(model, ex) + evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x]) + MOI.initialize(evaluator, [:Grad, :Jac]) + # We initialized without the need for the hessian so + # the linearity shouldn't be computed. + @test only(evaluator.backend.subexpressions).linearity == ReverseAD.NONLINEAR +end + function test_dual_forward() x = MOI.VariableIndex(1) y = MOI.VariableIndex(2) From c1d891858e17a84d61d41306d8acfb456bc01563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 26 Apr 2025 09:18:17 +0200 Subject: [PATCH 4/5] Fix format --- test/Nonlinear/ReverseAD.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Nonlinear/ReverseAD.jl b/test/Nonlinear/ReverseAD.jl index 2f65a2bc70..4adbb88094 100644 --- a/test/Nonlinear/ReverseAD.jl +++ b/test/Nonlinear/ReverseAD.jl @@ -639,7 +639,8 @@ function test_linearity_no_hess() MOI.initialize(evaluator, [:Grad, :Jac]) # We initialized without the need for the hessian so # the linearity shouldn't be computed. - @test only(evaluator.backend.subexpressions).linearity == ReverseAD.NONLINEAR + @test only(evaluator.backend.subexpressions).linearity == + ReverseAD.NONLINEAR end function test_dual_forward() From 88cdcb5397aac7b31409299db5514f1d15f14be5 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Mon, 28 Apr 2025 08:13:21 +1200 Subject: [PATCH 5/5] Update test/Nonlinear/ReverseAD.jl --- test/Nonlinear/ReverseAD.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Nonlinear/ReverseAD.jl b/test/Nonlinear/ReverseAD.jl index 4adbb88094..75a11aae66 100644 --- a/test/Nonlinear/ReverseAD.jl +++ b/test/Nonlinear/ReverseAD.jl @@ -641,6 +641,7 @@ function test_linearity_no_hess() # the linearity shouldn't be computed. @test only(evaluator.backend.subexpressions).linearity == ReverseAD.NONLINEAR + return end function test_dual_forward()