Skip to content

Commit 25865ea

Browse files
committed
added: linearize! is now allocation-free
1 parent ba24fd2 commit 25865ea

File tree

3 files changed

+30
-23
lines changed

3 files changed

+30
-23
lines changed

src/model/linearization.jl

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,25 @@ function linearize!(
146146
d0 .= d .- nonlinmodel.dop
147147
x0 .= x .- nonlinmodel.xop
148148
# --- compute the Jacobians at linearization points ---
149-
A::Matrix{NT}, Bu::Matrix{NT}, Bd::Matrix{NT} = linmodel.A, linmodel.Bu, linmodel.Bd
150-
C::Matrix{NT}, Dd::Matrix{NT} = linmodel.C, linmodel.Dd
149+
#A::Matrix{NT}, Bu::Matrix{NT}, Bd::Matrix{NT} = linmodel.A, linmodel.Bu, linmodel.Bd
150+
#C::Matrix{NT}, Dd::Matrix{NT} = linmodel.C, linmodel.Dd
151151
xnext0::Vector{NT}, y0::Vector{NT} = linmodel.buffer.x, linmodel.buffer.y
152-
myf_x0!(xnext0, x0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
153-
myf_u0!(xnext0, u0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
154-
myf_d0!(xnext0, d0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
155-
myh_x0!(y0, x0) = h!(y0, nonlinmodel, x0, d0, model.p)
156-
myh_d0!(y0, d0) = h!(y0, nonlinmodel, x0, d0, model.p)
157-
ForwardDiff.jacobian!(A, myf_x0!, xnext0, x0)
158-
ForwardDiff.jacobian!(Bu, myf_u0!, xnext0, u0)
159-
ForwardDiff.jacobian!(Bd, myf_d0!, xnext0, d0)
160-
ForwardDiff.jacobian!(C, myh_x0!, y0, x0)
161-
ForwardDiff.jacobian!(Dd, myh_d0!, y0, d0)
152+
#myf_x0!(xnext0, x0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
153+
#myf_u0!(xnext0, u0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
154+
#myf_d0!(xnext0, d0) = f!(xnext0, nonlinmodel, x0, u0, d0, model.p)
155+
#myh_x0!(y0, x0) = h!(y0, nonlinmodel, x0, d0, model.p)
156+
#myh_d0!(y0, d0) = h!(y0, nonlinmodel, x0, d0, model.p)
157+
#ForwardDiff.jacobian!(A, myf_x0!, xnext0, x0)
158+
#ForwardDiff.jacobian!(Bu, myf_u0!, xnext0, u0)
159+
#ForwardDiff.jacobian!(Bd, myf_d0!, xnext0, d0)
160+
#ForwardDiff.jacobian!(C, myh_x0!, y0, x0)
161+
#ForwardDiff.jacobian!(Dd, myh_d0!, y0, d0)
162+
jb = nonlinmodel.buffer.jacobian
163+
jacobianA!(linmodel.A, jb, nonlinmodel, x0, u0, d0)
164+
jacobianBu!(linmodel.Bu, jb, nonlinmodel, x0, u0, d0)
165+
jacobianBd!(linmodel.Bd, jb, nonlinmodel, x0, u0, d0)
166+
jacobianC!(linmodel.C, jb, nonlinmodel, x0, d0)
167+
jacobianDd!(linmodel.Dd, jb, nonlinmodel, x0, d0)
162168
# --- compute the nonlinear model output at operating points ---
163169
h!(y0, nonlinmodel, x0, d0, model.p)
164170
y = y0

src/model/nonlinmodel.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ function NonLinModel{NT}(
144144
isnothing(solver) && (solver=EmptySolver())
145145
f!, h! = get_mutating_functions(NT, f, h)
146146
f!, h! = get_solver_functions(NT, solver, f!, h!, Ts, nu, nx, ny, nd)
147-
jacobian = JacobianBuffer{NT}(f!, h!, nu, nx, ny, nd)
147+
jacobian = JacobianBuffer{NT}(f!, h!, nu, nx, ny, nd, p)
148148
buffer = SimModelBuffer{NT}(nu, nx, ny, nd, jacobian)
149149
return NonLinModel{NT}(f!, h!, Ts, nu, nx, ny, nd, p, solver, buffer)
150150
end

src/sim_model.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ struct JacobianBuffer{
3434
CHX<:ForwardDiff.JacobianConfig
3535
}
3636
xnext::Vector{NT}
37+
u::Vector{NT}
3738
x::Vector{NT}
3839
y::Vector{NT}
39-
u::Vector{NT}
4040
d::Vector{NT}
4141
f_x!::FX
4242
f_u!::FU
@@ -48,33 +48,34 @@ struct JacobianBuffer{
4848
f_d_cfg::CFD
4949
h_x_cfg::CHX
5050
h_d_cfg::CHU
51+
5152
end
5253

5354
"""
54-
JacobianBuffer(NT::DataType, f!::Function, h!::Function, nx, nu, ny, nd)
55+
JacobianBuffer(NT::DataType, f!::Function, h!::Function, nu, nx, ny, nd)
5556
5657
Buffer object for calling `ForwardDiff.jacobian!` on `SimModel` without any allocation.
5758
"""
5859
function JacobianBuffer{NT}(
59-
f!::Function, h!::Function, nx::Int, nu::Int, ny::Int, nd::Int
60+
f!::Function, h!::Function, nu::Int, nx::Int, ny::Int, nd::Int, p
6061
) where NT <: Real
6162
xnext = Vector{NT}(undef, nx)
63+
u = Vector{NT}(undef, nu)
6264
x = Vector{NT}(undef, nx)
6365
y = Vector{NT}(undef, ny)
64-
u = Vector{NT}(undef, nu)
6566
d = Vector{NT}(undef, nd)
66-
f_x!(y, x) = f!(y, x, u, d)
67-
f_u!(y, u) = f!(y, x, u, d)
68-
f_d!(y, d) = f!(y, x, u, d)
69-
h_x!(y, x) = h!(y, x, d)
70-
h_d!(y, d) = h!(y, x, d)
67+
f_x!(xnext, x) = f!(xnext, x, u, d, p)
68+
f_u!(xnext, u) = f!(xnext, x, u, d, p)
69+
f_d!(xnext, d) = f!(xnext, x, u, d, p)
70+
h_x!(y, x) = h!(y, x, d, p)
71+
h_d!(y, d) = h!(y, x, d, p)
7172
f_x_cfg = ForwardDiff.JacobianConfig(f_x!, xnext, x)
7273
f_u_cfg = ForwardDiff.JacobianConfig(f_u!, xnext, u)
7374
f_d_cfg = ForwardDiff.JacobianConfig(f_d!, xnext, d)
7475
h_x_cfg = ForwardDiff.JacobianConfig(h_x!, y, x)
7576
h_d_cfg = ForwardDiff.JacobianConfig(h_d!, y, d)
7677
return JacobianBuffer(
77-
xnext, x, y, u, d,
78+
xnext, u, x, y, d,
7879
f_x!, f_u!, f_d!, h_x!, h_d!,
7980
f_x_cfg, f_u_cfg, f_d_cfg, h_x_cfg, h_d_cfg
8081
)

0 commit comments

Comments
 (0)