From 894f51ded83b3c21e44a80d7c0f3898778e84733 Mon Sep 17 00:00:00 2001 From: Dimitri Alston <123396563+DimitriAlston@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:19:46 -0400 Subject: [PATCH] Add function for `register_nlsystem` that doesn't require inequalities --- src/basefuncs.jl | 4 ++-- src/userfuncs.jl | 22 ++++++++++++++++++---- test/runtests.jl | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/basefuncs.jl b/src/basefuncs.jl index 8865532..9ed86b2 100644 --- a/src/basefuncs.jl +++ b/src/basefuncs.jl @@ -11,7 +11,7 @@ # systems. ################################################################################ -function mtk_generate_model_equations(sys::ModelingToolkit.System) +function _generate_model_equations(sys::ModelingToolkit.System) param_dict = copy(ModelingToolkit.initial_conditions(sys)) h = [] for i in eachindex(ModelingToolkit.unknowns(sys)) @@ -30,7 +30,7 @@ function mtk_generate_model_equations(sys::ModelingToolkit.System) return h end -function mtk_generate_reduced_expression(expr::Symbolics.Num, sys::ModelingToolkit.System) +function _generate_reduced_expression(expr::Symbolics.Num, sys::ModelingToolkit.System) sub_dict = ModelingToolkit.initial_conditions(sys) for eqn in ModelingToolkit.observed(sys) sub_dict[eqn.lhs] = eqn.rhs diff --git a/src/userfuncs.jl b/src/userfuncs.jl index fa237f6..f53c37e 100644 --- a/src/userfuncs.jl +++ b/src/userfuncs.jl @@ -33,11 +33,11 @@ function and `Vector{Symbolics.Num}` constraints from a `ModelingToolkit.System` to a `JuMP.Model`. """ function register_nlsystem(model::JuMP.Model, sys::ModelingToolkit.System, obj::Symbolics.Num, ineqs::Vector{Symbolics.Num}) - h = EOptInterface.mtk_generate_model_equations(sys) - f = EOptInterface.mtk_generate_reduced_expression(obj, sys) + h = EOptInterface._generate_model_equations(sys) + f = EOptInterface._generate_reduced_expression(obj, sys) g = [] for i in eachindex(ineqs) - gi = EOptInterface.mtk_generate_reduced_expression(ineqs[i], sys) + gi = EOptInterface._generate_reduced_expression(ineqs[i], sys) push!(g, gi) end JuMP.@constraint(model, [i in eachindex(h)], h[i](JuMP.all_variables(model)...) == 0) @@ -46,12 +46,26 @@ function register_nlsystem(model::JuMP.Model, sys::ModelingToolkit.System, obj:: return end +""" + $(DocStringExtensions.TYPEDSIGNATURES) + +Automatically formulates and adds a user-provided `Symbolics.Num` objective +function from a `ModelingToolkit.System` to a `JuMP.Model`. +""" +function register_nlsystem(model::JuMP.Model, sys::ModelingToolkit.System, obj::Symbolics.Num) + h = EOptInterface._generate_model_equations(sys) + f = EOptInterface._generate_reduced_expression(obj, sys) + JuMP.@constraint(model, [i in eachindex(h)], h[i](JuMP.all_variables(model)...) == 0) + JuMP.@objective(model, Min, f(JuMP.all_variables(model)...)) + return +end + """ $(DocStringExtensions.TYPEDSIGNATURES) Automatically applies specified direct transcription method and registers the discretized ODE `ModelingToolkit.System` as algebraic JuMP constraints. -Current supports Explicit Euler "EE" and Implicit Euler "IE". +Currently supports Explicit Euler "EE" and Implicit Euler "IE". """ function register_odesystem(model::JuMP.Model, sys::ModelingToolkit.System, tspan::Tuple{Real,Real}, tstep::Real, integrator::String) if integrator != "EE" && integrator != "IE" diff --git a/test/runtests.jl b/test/runtests.jl index fef9a09..9c2b172 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -150,6 +150,10 @@ using Test @test JuMP.primal_status(model) == JuMP.FEASIBLE_POINT @test isapprox(JuMP.objective_value(model), 169869.99931631665, atol=1e-3) + model = JuMP.Model(Ipopt.Optimizer) + JuMP.@variable(model, xL[i] <= x[i=1:6] <= xU[i]) + EOptInterface.register_nlsystem(model, system, obj) + end @testset "ODE Model" begin