From c73401efcd2174c928eb69e0c1e3256bafca25dc Mon Sep 17 00:00:00 2001 From: Alexis Montoison Date: Sun, 14 Dec 2025 15:52:22 -0600 Subject: [PATCH 1/2] Update .cirrus.yml --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 81e9ef3..ad5fb1d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,7 +2,7 @@ task: matrix: - name: FreeBSD freebsd_instance: - image_family: freebsd-13-3 + image_family: freebsd-14-2 env: matrix: - JULIA_VERSION: 1 From 6e6094aa14f4098b722ad90b9f9ea912db721995 Mon Sep 17 00:00:00 2001 From: Alexis Montoison Date: Sun, 14 Dec 2025 16:57:41 -0600 Subject: [PATCH 2/2] Use package extensions --- Project.toml | 30 +++++++++------ ext/ExpressionTreeForgeADNLPModelsExt.jl | 16 ++++++++ ext/ExpressionTreeForgeJuMPExt.jl | 18 +++++++++ ext/ExpressionTreeForgeNLPModelsJuMPExt.jl | 8 ++++ src/ExpressionTreeForge.jl | 3 +- src/NLPSupport/get_expr_tree.jl | 44 ---------------------- src/NLPSupport/ordered_include.jl | 1 - src/get_expression_tree.jl | 23 +++++++++++ test/runtests.jl | 3 +- 9 files changed, 86 insertions(+), 60 deletions(-) create mode 100644 ext/ExpressionTreeForgeADNLPModelsExt.jl create mode 100644 ext/ExpressionTreeForgeJuMPExt.jl create mode 100644 ext/ExpressionTreeForgeNLPModelsJuMPExt.jl delete mode 100644 src/NLPSupport/get_expr_tree.jl delete mode 100644 src/NLPSupport/ordered_include.jl create mode 100644 src/get_expression_tree.jl diff --git a/Project.toml b/Project.toml index 8b01454..63911eb 100644 --- a/Project.toml +++ b/Project.toml @@ -1,37 +1,43 @@ name = "ExpressionTreeForge" uuid = "93090adf-0e31-445f-8c8f-44d91f61d7ad" -authors = ["raynaudp "] +authors = ["raynaudp"] version = "0.3.0" [deps] -ADNLPModels = "54578032-b7ea-4c30-94aa-7cbd1cce6c9a" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" -JuMP = "4076af6c-e467-56ae-b986-b466b2749572" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -NLPModelsJuMP = "792afdf1-32c1-5681-94e0-d7bf7a5df49e" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[weakdeps] +ADNLPModels = "54578032-b7ea-4c30-94aa-7cbd1cce6c9a" +JuMP = "4076af6c-e467-56ae-b986-b466b2749572" +NLPModelsJuMP = "792afdf1-32c1-5681-94e0-d7bf7a5df49e" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" +[extensions] +ExpressionTreeForgeJuMPExt = "JuMP" +ExpressionTreeForgeADNLPModelsExt = ["ADNLPModels", "Symbolics"] +ExpressionTreeForgeNLPModelsJuMPExt = "NLPModelsJuMP" + [compat] ADNLPModels = "0.8" ForwardDiff = "0.10,1" +LinearAlgebra = "1.10" JuMP = "1" MathOptInterface = "1" NLPModelsJuMP = "0.13" +OptimizationProblems = "0.9" ReverseDiff = "1.14" -Symbolics = "5,6" -julia = "^1.10.0" +SparseArrays = "1.10" +Symbolics = "6" +Test = "1.10" +julia = "1.10" [extras] -ADNLPModels = "54578032-b7ea-4c30-94aa-7cbd1cce6c9a" -MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" -NLPModelsJuMP = "792afdf1-32c1-5681-94e0-d7bf7a5df49e" OptimizationProblems = "5049e819-d29b-5fba-b941-0eee7e64c1c6" -SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "SparseArrays", "MathOptInterface", "Symbolics", "ADNLPModels", "OptimizationProblems", "NLPModelsJuMP"] +test = ["ADNLPModels", "OptimizationProblems", "NLPModelsJuMP", "JuMP", "Symbolics", "Test"] diff --git a/ext/ExpressionTreeForgeADNLPModelsExt.jl b/ext/ExpressionTreeForgeADNLPModelsExt.jl new file mode 100644 index 0000000..d513aac --- /dev/null +++ b/ext/ExpressionTreeForgeADNLPModelsExt.jl @@ -0,0 +1,16 @@ +module ExpressionTreeForgeADNLPModelsExt + +import ExpressionTreeForge +import ADNLPModels +import Symbolics + +function ExpressionTreeForge.get_expression_tree(adnlp::ADNLPModels.ADNLPModel) + n = adnlp.meta.nvar + Symbolics.@variables x[1:n] + fun = adnlp.f(x) + obj_Expr = Symbolics._toexpr(fun) + expr_tree = ExpressionTreeForge.transform_to_expr_tree(obj_Expr)::ExpressionTreeForge.Type_expr_tree + return expr_tree +end + +end diff --git a/ext/ExpressionTreeForgeJuMPExt.jl b/ext/ExpressionTreeForgeJuMPExt.jl new file mode 100644 index 0000000..181fa79 --- /dev/null +++ b/ext/ExpressionTreeForgeJuMPExt.jl @@ -0,0 +1,18 @@ +module ExpressionTreeForgeJuMPExt + +import ExpressionTreeForge +import JuMP +import MathOptInterface as MOI + +function ExpressionTreeForge.get_expression_tree(model::JuMP.Model) + nlp = JuMP.nonlinear_model(model; force = true) + evaluator = MOI.Nonlinear.Evaluator(nlp) + F = MOI.get(model, MOI.ObjectiveFunctionType()) + MOI.get(model, MOI.ObjectiveFunction{F}()) + if F <: MOI.ScalarNonlinearFunction + MOI.Nonlinear.set_objective(nlp, MOI.get(model, MOI.ObjectiveFunction{F}())) + end + return ExpressionTreeForge.get_expression_tree(evaluator) +end + +end diff --git a/ext/ExpressionTreeForgeNLPModelsJuMPExt.jl b/ext/ExpressionTreeForgeNLPModelsJuMPExt.jl new file mode 100644 index 0000000..fc8f1e0 --- /dev/null +++ b/ext/ExpressionTreeForgeNLPModelsJuMPExt.jl @@ -0,0 +1,8 @@ +module ExpressionTreeForgeNLPModelsJuMPExt + +import ExpressionTreeForge +import NLPModelsJuMP + +ExpressionTreeForge.get_expression_tree(nlp::NLPModelsJuMP.MathOptNLPModel) = ExpressionTreeForge.get_expression_tree(nlp.eval) + +end diff --git a/src/ExpressionTreeForge.jl b/src/ExpressionTreeForge.jl index 37dd399..6fa3541 100644 --- a/src/ExpressionTreeForge.jl +++ b/src/ExpressionTreeForge.jl @@ -1,5 +1,6 @@ module ExpressionTreeForge +include("get_expression_tree.jl") include("type_expr/ordered_include.jl") include("node_expr_tree/ordered_include.jl") include("tree/ordered_include.jl") @@ -12,8 +13,6 @@ using .M_bound_propagations, .M_convexity_detection include("export.jl") -include("NLPSupport/ordered_include.jl") - export create_bounds_tree, get_bounds, set_bounds! export Type_node, Complete_expr_tree, Pre_compiled_tree, Pre_n_compiled_tree, Type_calculus_tree export concave_type, constant_type, convex_type, linear_type, not_treated_type, unknown_type diff --git a/src/NLPSupport/get_expr_tree.jl b/src/NLPSupport/get_expr_tree.jl deleted file mode 100644 index ea7ac21..0000000 --- a/src/NLPSupport/get_expr_tree.jl +++ /dev/null @@ -1,44 +0,0 @@ -using JuMP, MathOptInterface -using Symbolics -using NLPModelsJuMP, ADNLPModels - -""" - expr = get_expression_tree(monlp::MathOptNLPModel) - expr = get_expression_tree(adnlp::ADNLPModel) - expr = get_expression_tree(model::JuMP.Model) - expr = get_expression_tree(evaluator::MOI.Nonlinear.Evaluator) - -Return the objective function as a `Type_expr_tree` for: a `MathOptNLPModel`, a `ADNLPModel`, a `JuMP.Model` or a `MOI.Nonlinear.Evaluator`. -""" -function get_expression_tree(model::JuMP.Model) - nlp = JuMP.nonlinear_model(model; force = true) - evaluator = MOI.Nonlinear.Evaluator(nlp) - F = MOI.get(model, MOI.ObjectiveFunctionType()) - MOI.get(model, MOI.ObjectiveFunction{F}()) - if F <: MOI.ScalarNonlinearFunction - MOI.Nonlinear.set_objective(nlp, MOI.get(model, MOI.ObjectiveFunction{F}())) - end - return get_expression_tree(evaluator) -end - -get_expression_tree(nlp::MathOptNLPModel) = get_expression_tree(nlp.eval) -get_expression_tree(model::MathOptInterface.Nonlinear.Model) = - get_expression_tree(MathOptInterface.Nonlinear.Evaluator(model)) - -function get_expression_tree(evaluator::MOI.Nonlinear.Evaluator) - MathOptInterface.initialize(evaluator, [:ExprGraph]) - obj_Expr = MathOptInterface.objective_expr(evaluator)::Expr - expr_tree = - ExpressionTreeForge.transform_to_expr_tree(obj_Expr)::ExpressionTreeForge.Type_expr_tree - return expr_tree -end - -function get_expression_tree(adnlp::ADNLPModel) - n = adnlp.meta.nvar - Symbolics.@variables x[1:n] - fun = adnlp.f(x) - obj_Expr = Symbolics._toexpr(fun) - expr_tree = - ExpressionTreeForge.transform_to_expr_tree(obj_Expr)::ExpressionTreeForge.Type_expr_tree - return expr_tree -end diff --git a/src/NLPSupport/ordered_include.jl b/src/NLPSupport/ordered_include.jl deleted file mode 100644 index ae563cd..0000000 --- a/src/NLPSupport/ordered_include.jl +++ /dev/null @@ -1 +0,0 @@ -include("get_expr_tree.jl") diff --git a/src/get_expression_tree.jl b/src/get_expression_tree.jl new file mode 100644 index 0000000..cf1e339 --- /dev/null +++ b/src/get_expression_tree.jl @@ -0,0 +1,23 @@ +import MathOptInterface as MOI + +""" + expr = get_expression_tree(monlp::MathOptNLPModel) + expr = get_expression_tree(adnlp::ADNLPModel) + expr = get_expression_tree(model::JuMP.Model) + expr = get_expression_tree(evaluator::MOI.Nonlinear.Evaluator) + +Return the objective function as a `Type_expr_tree` for: a `MathOptNLPModel`, a `ADNLPModel`, a `JuMP.Model` or a `MOI.Nonlinear.Evaluator`. +""" +function get_expression_tree end + +function get_expression_tree(evaluator::MOI.Nonlinear.Evaluator) + MOI.initialize(evaluator, [:ExprGraph]) + obj_Expr = MOI.objective_expr(evaluator)::Expr + expr_tree = ExpressionTreeForge.transform_to_expr_tree(obj_Expr)::ExpressionTreeForge.Type_expr_tree + return expr_tree +end + +function ExpressionTreeForge.get_expression_tree(model::MOI.Nonlinear.Model) + evaluator = MOI.Nonlinear.Evaluator(model) + return ExpressionTreeForge.get_expression_tree(evaluator) +end diff --git a/test/runtests.jl b/test/runtests.jl index 4352659..c68432d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,5 +1,6 @@ using LinearAlgebra, SparseArrays, Test -using JuMP, MathOptInterface, Symbolics +using JuMP, MathOptInterface +using ADNLPModels, Symbolics using ExpressionTreeForge const MOI = MathOptInterface