Skip to content

Commit 701d29b

Browse files
authored
Merge pull request #50 from JuliaControl/clean_namespace
cleaning the namespace with `import`s instead of `using`s
2 parents 2ea9ad1 + 1f9d036 commit 701d29b

14 files changed

+83
-73
lines changed

src/ModelPredictiveControl.jl

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
module ModelPredictiveControl
22

33
using PrecompileTools
4+
using LinearAlgebra
5+
using Random: randn
46

5-
using LinearAlgebra, Random
67
using RecipesBase
7-
using ControlSystemsBase
88
using ForwardDiff
9-
using JuMP
10-
using PreallocationTools
11-
import OSQP, Ipopt
129

10+
import ControlSystemsBase
11+
import ControlSystemsBase: ss, tf, delay
12+
import ControlSystemsBase: Continuous, Discrete
13+
import ControlSystemsBase: StateSpace, TransferFunction, DelayLtiSystem, LTISystem
14+
import ControlSystemsBase: iscontinuous, isdiscrete, sminreal, minreal, c2d, d2c
15+
16+
import JuMP
17+
import JuMP: MOIU, MOI, GenericModel, Model, optimizer_with_attributes, register
18+
import JuMP: @variable, @constraint, @objective, @NLconstraint, @NLobjective
19+
20+
import PreallocationTools: DiffCache, get_tmp
21+
22+
import OSQP, Ipopt
1323

1424
export SimModel, LinModel, NonLinModel
1525
export DiffSolver, RungeKutta
@@ -28,8 +38,8 @@ include("predictive_control.jl")
2838
include("plot_sim.jl")
2939

3040
@setup_workload begin
31-
# Putting some things in `@setup_workload` instead of `@compile_workload` can reduce the size of the
32-
# precompile file and potentially make loading faster.
41+
# Putting some things in `@setup_workload` instead of `@compile_workload` can reduce the
42+
# size of the precompile file and potentially make loading faster.
3343
@compile_workload begin
3444
# all calls in this block will be precompiled, regardless of whether
3545
# they belong to your package or not (on Julia 1.8 and higher)

src/controller/construct.jl

+4-4
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ function setconstraint!(
130130
)
131131
model, con, optim = mpc.estim.model, mpc.con, mpc.optim
132132
nu, ny, nx̂, Hp, Hc = model.nu, model.ny, mpc.estim.nx̂, mpc.Hp, mpc.Hc
133-
notSolvedYet = (termination_status(optim) == OPTIMIZE_NOT_CALLED)
134-
C, E, ex̂ = mpc.C, mpc.Ẽ[:, 1:nu*Hc], mpc.con.ẽx̂[:, 1:nu*Hc]
133+
notSolvedYet = (JuMP.termination_status(optim) == JuMP.OPTIMIZE_NOT_CALLED)
134+
C = mpc.C
135135
isnothing(Umin) && !isnothing(umin) && (Umin = repeat(umin, Hp))
136136
isnothing(Umax) && !isnothing(umax) && (Umax = repeat(umax, Hp))
137137
isnothing(ΔUmin) && !isnothing(Δumin) && (ΔUmin = repeat(Δumin, Hc))
@@ -238,8 +238,8 @@ function setconstraint!(
238238
A = con.A[con.i_b, :]
239239
b = con.b[con.i_b]
240240
ΔŨvar = optim[:ΔŨvar]
241-
delete(optim, optim[:linconstraint])
242-
unregister(optim, :linconstraint)
241+
JuMP.delete(optim, optim[:linconstraint])
242+
JuMP.unregister(optim, :linconstraint)
243243
@constraint(optim, linconstraint, A*ΔŨvar .≤ b)
244244
setnonlincon!(mpc, model)
245245
else

src/controller/execute.jl

+10-10
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ end
134134
By default, add the solution summary `:sol` that can be printed to `info`.
135135
"""
136136
function addinfo!(info, mpc::PredictiveController)
137-
info[:sol] = solution_summary(mpc.optim, verbose=true)
137+
info[:sol] = JuMP.solution_summary(mpc.optim, verbose=true)
138138
return info
139139
end
140140

@@ -280,7 +280,7 @@ function linconstraint!(mpc::PredictiveController, model::LinModel)
280280
mpc.con.b[(n+1):(n+nx̂)] .= @. +mpc.con.x̂max - fx̂
281281
if any(mpc.con.i_b)
282282
lincon = mpc.optim[:linconstraint]
283-
set_normalized_rhs(lincon, mpc.con.b[mpc.con.i_b])
283+
JuMP.set_normalized_rhs(lincon, mpc.con.b[mpc.con.i_b])
284284
end
285285
return nothing
286286
end
@@ -298,7 +298,7 @@ function linconstraint!(mpc::PredictiveController, ::SimModel)
298298
mpc.con.b[(n+1):(n+nΔŨ)] .= @. +mpc.con.ΔŨmax
299299
if any(mpc.con.i_b)
300300
lincon = mpc.optim[:linconstraint]
301-
set_normalized_rhs(lincon, mpc.con.b[mpc.con.i_b])
301+
JuMP.set_normalized_rhs(lincon, mpc.con.b[mpc.con.i_b])
302302
end
303303
return nothing
304304
end
@@ -428,38 +428,38 @@ warm-start value.
428428
function optim_objective!(mpc::PredictiveController{NT}) where {NT<:Real}
429429
optim = mpc.optim
430430
model = mpc.estim.model
431-
ΔŨvar::Vector{VariableRef} = optim[:ΔŨvar]
431+
ΔŨvar::Vector{JuMP.VariableRef} = optim[:ΔŨvar]
432432
# initial ΔŨ (warm-start): [Δu_{k-1}(k); Δu_{k-1}(k+1); ... ; 0_{nu × 1}; ϵ_{k-1}]
433433
ϵ0 = !isinf(mpc.C) ? mpc.ΔŨ[end] : empty(mpc.ΔŨ)
434434
ΔŨ0 = [mpc.ΔŨ[(model.nu+1):(mpc.Hc*model.nu)]; zeros(NT, model.nu); ϵ0]
435-
set_start_value.(ΔŨvar, ΔŨ0)
435+
JuMP.set_start_value.(ΔŨvar, ΔŨ0)
436436
set_objective_linear_coef!(mpc, ΔŨvar)
437437
try
438-
optimize!(optim)
438+
JuMP.optimize!(optim)
439439
catch err
440440
if isa(err, MOI.UnsupportedAttribute{MOI.VariablePrimalStart})
441441
# reset_optimizer to unset warm-start, set_start_value.(nothing) seems buggy
442442
MOIU.reset_optimizer(optim)
443-
optimize!(optim)
443+
JuMP.optimize!(optim)
444444
else
445445
rethrow(err)
446446
end
447447
end
448448
if !issolved(optim)
449-
status = termination_status(optim)
449+
status = JuMP.termination_status(optim)
450450
if iserror(optim)
451451
@error("MPC terminated without solution: returning last solution shifted",
452452
status)
453453
else
454454
@warn("MPC termination status not OPTIMAL or LOCALLY_SOLVED: keeping "*
455455
"solution anyway", status)
456456
end
457-
@debug solution_summary(optim, verbose=true)
457+
@debug JuMP.solution_summary(optim, verbose=true)
458458
end
459459
if iserror(optim)
460460
mpc.ΔŨ .= ΔŨ0
461461
else
462-
mpc.ΔŨ .= value.(ΔŨvar)
462+
mpc.ΔŨ .= JuMP.value.(ΔŨvar)
463463
end
464464
return mpc.ΔŨ
465465
end

src/controller/linmpc.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ function init_optimization!(mpc::LinMPC, optim::JuMP.GenericModel)
243243
# --- variables and linear constraints ---
244244
con = mpc.con
245245
nΔŨ = length(mpc.ΔŨ)
246-
set_silent(optim)
246+
JuMP.set_silent(optim)
247247
limit_solve_time(mpc.optim, mpc.estim.model.Ts)
248248
@variable(optim, ΔŨvar[1:nΔŨ])
249249
A = con.A[con.i_b, :]
@@ -256,6 +256,6 @@ end
256256

257257
"For [`LinMPC`](@ref), set the QP linear coefficient `q̃` just before optimization."
258258
function set_objective_linear_coef!(mpc::LinMPC, ΔŨvar)
259-
set_objective_coefficient(mpc.optim, ΔŨvar, mpc.q̃)
259+
JuMP.set_objective_coefficient(mpc.optim, ΔŨvar, mpc.q̃)
260260
return nothing
261261
end

src/controller/nonlinmpc.jl

+10-10
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ function addinfo!(info, mpc::NonLinMPC)
272272
ŶE = [ŷ; Ŷ]
273273
D̂E = [d; D̂]
274274
info[:JE] = mpc.JE(UE, ŶE, D̂E)
275-
info[:sol] = solution_summary(mpc.optim, verbose=true)
275+
info[:sol] = JuMP.solution_summary(mpc.optim, verbose=true)
276276
return info
277277
end
278278

@@ -285,19 +285,19 @@ function init_optimization!(mpc::NonLinMPC, optim::JuMP.GenericModel{JNT}) where
285285
# --- variables and linear constraints ---
286286
C, con = mpc.C, mpc.con
287287
nΔŨ = length(mpc.ΔŨ)
288-
set_silent(optim)
288+
JuMP.set_silent(optim)
289289
limit_solve_time(mpc.optim, mpc.estim.model.Ts)
290290
@variable(optim, ΔŨvar[1:nΔŨ])
291291
A = con.A[con.i_b, :]
292292
b = con.b[con.i_b]
293293
@constraint(optim, linconstraint, A*ΔŨvar .≤ b)
294294
# --- nonlinear optimization init ---
295-
if !isinf(C) && solver_name(optim) == "Ipopt"
295+
if !isinf(C) && JuMP.solver_name(optim) == "Ipopt"
296296
try
297-
get_attribute(optim, "nlp_scaling_max_gradient")
297+
JuMP.get_attribute(optim, "nlp_scaling_max_gradient")
298298
catch
299299
# default "nlp_scaling_max_gradient" to `10.0/C` if not already set:
300-
set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
300+
JuMP.set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
301301
end
302302
end
303303
model = mpc.estim.model
@@ -387,22 +387,22 @@ function setnonlincon!(mpc::NonLinMPC, ::NonLinModel)
387387
optim = mpc.optim
388388
ΔŨvar = optim[:ΔŨvar]
389389
con = mpc.con
390-
map(con -> delete(optim, con), all_nonlinear_constraints(optim))
390+
map(con -> JuMP.delete(optim, con), JuMP.all_nonlinear_constraints(optim))
391391
for i in findall(.!isinf.(con.Ymin))
392392
f_sym = Symbol("g_Ymin_$(i)")
393-
add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
393+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
394394
end
395395
for i in findall(.!isinf.(con.Ymax))
396396
f_sym = Symbol("g_Ymax_$(i)")
397-
add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
397+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
398398
end
399399
for i in findall(.!isinf.(con.x̂min))
400400
f_sym = Symbol("g_x̂min_$(i)")
401-
add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
401+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
402402
end
403403
for i in findall(.!isinf.(con.x̂max))
404404
f_sym = Symbol("g_x̂max_$(i)")
405-
add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
405+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(ΔŨvar...)) <= 0))
406406
end
407407
return nothing
408408
end

src/estimator/construct.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ function augment_model(model::LinModel{NT}, As, Cs_u, Cs_y; verify_obsv=true) wh
126126
B̂d = [model.Bd; zeros(NT, nxs, nd)]
127127
D̂d = model.Dd
128128
# observability on Ĉ instead of Ĉm, since it would always return false when nym ≠ ny:
129-
if verify_obsv && !observability(Â, Ĉ)[:isobservable]
129+
if verify_obsv && !ControlSystemsBase.observability(Â, Ĉ)[:isobservable]
130130
error("The augmented model is unobservable. You may try to use 0 integrator on "*
131131
"model integrating outputs with nint_ym parameter. Adding integrators at both "*
132132
"inputs (nint_u) and outputs (nint_ym) can also violate observability.")
@@ -175,7 +175,7 @@ function default_nint(model::LinModel, i_ym=1:model.ny, nint_u=0)
175175
As, Cs_u, Cs_y = init_estimstoch(model, i_ym, nint_u, nint_ym)
176176
Â, _ , Ĉ = augment_model(model, As, Cs_u, Cs_y, verify_obsv=false)
177177
# observability on Ĉ instead of Ĉm, since it would always return false when nym ≠ ny
178-
observability(Â, Ĉ)[:isobservable] || (nint_ym[i] = 0)
178+
ControlSystemsBase.observability(Â, Ĉ)[:isobservable] || (nint_ym[i] = 0)
179179
end
180180
return nint_ym
181181
end

src/estimator/kalman.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct SteadyKalmanFilter{NT<:Real, SM<:LinModel} <: StateEstimator{NT}
3535
Q̂_kalman = Matrix(Q̂) # Matrix() required for Julia 1.6
3636
R̂_kalman = zeros(NT, model.ny, model.ny)
3737
R̂_kalman[i_ym, i_ym] =
38-
kalman(Discrete, Â, Ĉ, Q̂_kalman, R̂_kalman)[:, i_ym]
38+
ControlSystemsBase.kalman(Discrete, Â, Ĉ, Q̂_kalman, R̂_kalman)[:, i_ym]
3939
catch my_error
4040
if isa(my_error, ErrorException)
4141
error("Cannot compute the optimal Kalman gain K for the "*

src/estimator/luenberger.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct Luenberger{NT<:Real, SM<:LinModel} <: StateEstimator{NT}
3030
nx̂ = model.nx + nxs
3131
Â, B̂u, Ĉ, B̂d, D̂d = augment_model(model, As, Cs_u, Cs_y)
3232
= try
33-
place(Â, Ĉ, p̂, :o)[:, i_ym]
33+
ControlSystemsBase.place(Â, Ĉ, p̂, :o)[:, i_ym]
3434
catch
3535
error("Cannot compute the Luenberger gain K̂ with specified poles p̂.")
3636
end

src/estimator/mhe.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ function Base.show(io::IO, estim::MovingHorizonEstimator)
66
nx̂, nym, nyu = estim.nx̂, estim.nym, estim.nyu
77
n = maximum(ndigits.((nu, nx̂, nym, nyu, nd))) + 1
88
println(io, "$(typeof(estim).name.name) estimator with a sample time "*
9-
"Ts = $(estim.model.Ts) s, $(solver_name(estim.optim)) optimizer, "*
9+
"Ts = $(estim.model.Ts) s, $(JuMP.solver_name(estim.optim)) optimizer, "*
1010
"$(typeof(estim.model).name.name) and:")
1111
print_estim_dim(io, estim, n)
1212
end

src/estimator/mhe/construct.jl

+13-13
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ function setconstraint!(
412412
model, optim, con = estim.model, estim.optim, estim.con
413413
nx̂, nŵ, nym, He = estim.nx̂, estim.nx̂, estim.nym, estim.He
414414
nX̂con = nx̂*(He+1)
415-
notSolvedYet = (termination_status(optim) == OPTIMIZE_NOT_CALLED)
415+
notSolvedYet = (JuMP.termination_status(optim) == JuMP.OPTIMIZE_NOT_CALLED)
416416
C = estim.C
417417
isnothing(X̂min) && !isnothing(x̂min) && (X̂min = repeat(x̂min, He+1))
418418
isnothing(X̂max) && !isnothing(x̂max) && (X̂max = repeat(x̂max, He+1))
@@ -507,8 +507,8 @@ function setconstraint!(
507507
A = con.A[con.i_b, :]
508508
b = con.b[con.i_b]
509509
Z̃var = optim[:Z̃var]
510-
delete(optim, optim[:linconstraint])
511-
unregister(optim, :linconstraint)
510+
JuMP.delete(optim, optim[:linconstraint])
511+
JuMP.unregister(optim, :linconstraint)
512512
@constraint(optim, linconstraint, A*Z̃var .≤ b)
513513
setnonlincon!(estim, model)
514514
else
@@ -578,22 +578,22 @@ setnonlincon!(::MovingHorizonEstimator, ::SimModel) = nothing
578578
function setnonlincon!(estim::MovingHorizonEstimator, ::NonLinModel)
579579
optim, con = estim.optim, estim.con
580580
Z̃var = optim[:Z̃var]
581-
map(con -> delete(optim, con), all_nonlinear_constraints(optim))
581+
map(con -> JuMP.delete(optim, con), JuMP.all_nonlinear_constraints(optim))
582582
for i in findall(.!isinf.(con.X̂min))
583583
f_sym = Symbol("g_X̂min_$(i)")
584-
add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
584+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
585585
end
586586
for i in findall(.!isinf.(con.X̂max))
587587
f_sym = Symbol("g_X̂max_$(i)")
588-
add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
588+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
589589
end
590590
for i in findall(.!isinf.(con.V̂min))
591591
f_sym = Symbol("g_V̂min_$(i)")
592-
add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
592+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
593593
end
594594
for i in findall(.!isinf.(con.V̂max))
595595
f_sym = Symbol("g_V̂max_$(i)")
596-
add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
596+
JuMP.add_nonlinear_constraint(optim, :($(f_sym)($(Z̃var...)) <= 0))
597597
end
598598
return nothing
599599
end
@@ -967,7 +967,7 @@ function init_optimization!(
967967
estim::MovingHorizonEstimator, ::LinModel, optim::JuMP.GenericModel
968968
)
969969
nZ̃ = length(estim.Z̃)
970-
set_silent(optim)
970+
JuMP.set_silent(optim)
971971
limit_solve_time(estim.optim, estim.model.Ts)
972972
@variable(optim, Z̃var[1:nZ̃])
973973
A = estim.con.A[estim.con.i_b, :]
@@ -988,19 +988,19 @@ function init_optimization!(
988988
C, con = estim.C, estim.con
989989
nZ̃ = length(estim.Z̃)
990990
# --- variables and linear constraints ---
991-
set_silent(optim)
991+
JuMP.set_silent(optim)
992992
limit_solve_time(estim.optim, estim.model.Ts)
993993
@variable(optim, Z̃var[1:nZ̃])
994994
A = estim.con.A[con.i_b, :]
995995
b = estim.con.b[con.i_b]
996996
@constraint(optim, linconstraint, A*Z̃var .≤ b)
997997
# --- nonlinear optimization init ---
998-
if !isinf(C) && solver_name(optim) == "Ipopt"
998+
if !isinf(C) && JuMP.solver_name(optim) == "Ipopt"
999999
try
1000-
get_attribute(optim, "nlp_scaling_max_gradient")
1000+
JuMP.get_attribute(optim, "nlp_scaling_max_gradient")
10011001
catch
10021002
# default "nlp_scaling_max_gradient" to `10.0/C` if not already set:
1003-
set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
1003+
JuMP.set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
10041004
end
10051005
end
10061006
He = estim.He

0 commit comments

Comments
 (0)