Skip to content

Commit ea461ba

Browse files
committed
correct tests
1 parent 6d0c4a2 commit ea461ba

File tree

3 files changed

+44
-40
lines changed

3 files changed

+44
-40
lines changed

src/linearization.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ The `simplified_sys` has undergone [`structural_simplify`](@ref) and had any occ
2929
3030
See also [`linearize`](@ref) which provides a higher-level interface.
3131
"""
32-
function linearization_function(sys::AbstractSystem, inputs,
33-
outputs;
32+
function linearization_function(sys::AbstractSystem, inputs = inputs(sys),
33+
outputs = outputs(sys);
3434
initialize = true,
3535
initializealg = nothing,
3636
initialization_abstol = 1e-5,
@@ -396,7 +396,7 @@ Construct a `LinearizationProblem` for linearizing the system `sys` with the giv
396396
397397
All other keyword arguments are forwarded to `linearization_function`.
398398
"""
399-
function LinearizationProblem(sys::AbstractSystem, inputs, outputs; t = 0.0, kwargs...)
399+
function LinearizationProblem(sys::AbstractSystem, inputs = inputs(sys), outputs = outputs(sys); t = 0.0, kwargs...)
400400
linfun = linearization_function(sys, inputs, outputs; kwargs...)
401401
return LinearizationProblem(linfun, t)
402402
end
@@ -484,8 +484,8 @@ y &= h(x, z, u)
484484
```
485485
where `x` are differential unknown variables, `z` algebraic variables, `u` inputs and `y` outputs.
486486
"""
487-
function linearize_symbolic(sys::AbstractSystem, inputs,
488-
outputs; allow_input_derivatives = false,
487+
function linearize_symbolic(sys::AbstractSystem, inputs = inputs(sys),
488+
outputs = outputs(sys); allow_input_derivatives = false,
489489
eval_expression = false, eval_module = @__MODULE__,
490490
kwargs...)
491491
diff_idxs, alge_idxs = eq_idxs(sys)
@@ -546,7 +546,7 @@ function linearize_symbolic(sys::AbstractSystem, inputs,
546546
end
547547
end
548548

549-
(; A, B, C, D, f_x, f_z, g_x, g_z, f_u, g_u, h_x, h_z, h_u), sys
549+
(; A, B, C, D, f_x, f_z, g_x, g_z, f_u, g_u, h_x, h_z, h_u)
550550
end
551551

552552
function markio!(state, orig_inputs, inputs, outputs; check = true)
@@ -713,17 +713,17 @@ function linearize(sys, lin_fun::LinearizationFunction; t = 0.0,
713713
return solve(prob; allow_input_derivatives)
714714
end
715715

716-
function linearize(sys, inputs, outputs; op = Dict(), t = 0.0,
716+
function linearize(sys, inputs = inputs(sys), outputs = outputs(sys); op = Dict(), t = 0.0,
717717
allow_input_derivatives = false,
718718
zero_dummy_der = false,
719719
kwargs...)
720-
lin_fun, ssys = linearization_function(sys,
720+
lin_fun = linearization_function(sys,
721721
inputs,
722722
outputs;
723723
zero_dummy_der,
724724
op,
725725
kwargs...)
726-
linearize(ssys, lin_fun; op, t, allow_input_derivatives), ssys
726+
linearize(sys, lin_fun; op, t, allow_input_derivatives)
727727
end
728728

729729
"""

src/systems/systems.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function structural_simplify(
3232
disturbance_inputs = Any[],
3333
kwargs...)
3434
isscheduled(sys) && throw(RepeatedStructuralSimplificationError())
35-
newsys′ = __structural_simplify(sys; simplify,
35+
newsys′ = __structural_simplification(sys; simplify,
3636
allow_symbolic, allow_parameter, conservative, fully_determined,
3737
inputs, outputs, disturbance_inputs,
3838
kwargs...)
@@ -64,12 +64,12 @@ function structural_simplify(
6464
end
6565
end
6666

67-
function __structural_simplify(sys::JumpSystem, args...; kwargs...)
67+
function __structural_simplification(sys::JumpSystem, args...; kwargs...)
6868
return sys
6969
end
7070

71-
function __structural_simplify(sys::SDESystem, args...; kwargs...)
72-
return __structural_simplify(ODESystem(sys), args...; kwargs...)
71+
function __structural_simplification(sys::SDESystem, args...; kwargs...)
72+
return __structural_simplification(ODESystem(sys), args...; kwargs...)
7373
end
7474

7575
function __structural_simplification(sys::AbstractSystem; simplify = false,

test/downstream/linearize.jl

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,20 @@ eqs = [u ~ kp * (r - y)
1313
y ~ x]
1414

1515
@named sys = ODESystem(eqs, t)
16+
sys1 = structural_simplify(sys, inputs = [r], outputs = [y])
1617

17-
lsys, ssys = linearize(sys, [r], [y])
18-
lprob = LinearizationProblem(sys, [r], [y])
18+
lsys = linearize(sys1)
19+
lprob = LinearizationProblem(sys1)
1920
lsys2 = solve(lprob)
20-
lsys3, _ = linearize(sys, [r], [y]; autodiff = AutoFiniteDiff())
21+
lsys3 = linearize(sys1; autodiff = AutoFiniteDiff())
2122

2223
@test lsys.A[] == lsys2.A[] == lsys3.A[] == -2
2324
@test lsys.B[] == lsys2.B[] == lsys3.B[] == 1
2425
@test lsys.C[] == lsys2.C[] == lsys3.C[] == 1
2526
@test lsys.D[] == lsys2.D[] == lsys3.D[] == 0
2627

27-
lsys = linearize(sys, [r], [r])
28+
sys2 = structural_simplify(sys, inputs = [r], outputs = [r])
29+
lsys = linearize(sys2)
2830

2931
@test lsys.A[] == -2
3032
@test lsys.B[] == 1
@@ -86,8 +88,9 @@ connections = [f.y ~ c.r # filtered reference to controller reference
8688
p.y ~ c.y]
8789

8890
@named cl = ODESystem(connections, t, systems = [f, c, p])
91+
cl = structural_simplify(cl, inputs = [f.u], outputs = [p.x])
8992

90-
lsys0 = linearize(cl, [f.u], [p.x])
93+
lsys0 = linearize(cl)
9194
desired_order = [f.x, p.x]
9295
lsys = ModelingToolkit.reorder_unknowns(lsys0, unknowns(cl), desired_order)
9396
lsys1 = linearize(cl, [f.u], [p.x]; autodiff = AutoFiniteDiff())
@@ -99,7 +102,7 @@ lsys2 = ModelingToolkit.reorder_unknowns(lsys1, unknowns(cl), desired_order)
99102
@test lsys.D[] == lsys2.D[] == 0
100103

101104
## Symbolic linearization
102-
lsyss = ModelingToolkit.linearize_symbolic(cl, [f.u], [p.x])
105+
lsyss = ModelingToolkit.linearize_symbolic(cl)
103106

104107
@test ModelingToolkit.fixpoint_sub(lsyss.A, ModelingToolkit.defaults(cl)) == lsys.A
105108
@test ModelingToolkit.fixpoint_sub(lsyss.B, ModelingToolkit.defaults(cl)) == lsys.B
@@ -114,19 +117,18 @@ Nd = 10
114117
@named pid = LimPID(; k, Ti, Td, Nd)
115118

116119
@unpack reference, measurement, ctr_output = pid
117-
pid = structural_simplify(pid, inputs = [reference.u, measurement.u], outputs = [ctr_output.u])
118-
lsys0 = linearize(pid, [reference.u, measurement.u], [ctr_output.u];
119-
op = Dict(reference.u => 0.0, measurement.u => 0.0))
120-
@unpack int, der = pid
120+
pid_s = structural_simplify(pid, inputs = [reference.u, measurement.u], outputs = [ctr_output.u])
121+
lsys0 = linearize(pid_s; op = Dict(reference.u => 0.0, measurement.u => 0.0))
122+
@unpack int, der = pid_s
121123
desired_order = [int.x, der.x]
122-
lsys = ModelingToolkit.reorder_unknowns(lsys0, unknowns(pid), desired_order)
124+
lsys = ModelingToolkit.reorder_unknowns(lsys0, unknowns(pid_s), desired_order)
123125

124126
@test lsys.A == [0 0; 0 -10]
125127
@test lsys.B == [2 -2; 10 -10]
126128
@test lsys.C == [400 -4000]
127129
@test lsys.D == [4400 -4400]
128130

129-
lsyss, _ = ModelingToolkit.linearize_symbolic(pid, [reference.u, measurement.u],
131+
lsyss = ModelingToolkit.linearize_symbolic(pid_s, [reference.u, measurement.u],
130132
[ctr_output.u])
131133

132134
@test ModelingToolkit.fixpoint_sub(
@@ -139,7 +141,7 @@ lsyss, _ = ModelingToolkit.linearize_symbolic(pid, [reference.u, measurement.u],
139141
lsyss.D, ModelingToolkit.defaults_and_guesses(pid)) == lsys.D
140142

141143
# Test with the reverse desired unknown order as well to verify that similarity transform and reoreder_unknowns really works
142-
lsys = ModelingToolkit.reorder_unknowns(lsys, unknowns(pid), reverse(desired_order))
144+
lsys = ModelingToolkit.reorder_unknowns(lsys, unknowns(pid_s), reverse(desired_order))
143145

144146
@test lsys.A == [-10 0; 0 0]
145147
@test lsys.B == [10 -10; 2 -2]
@@ -148,17 +150,17 @@ lsys = ModelingToolkit.reorder_unknowns(lsys, unknowns(pid), reverse(desired_ord
148150

149151
## Test that there is a warning when input is misspecified
150152
if VERSION >= v"1.8"
151-
@test_throws "Some parameters are missing from the variable map." linearize(pid,
153+
@test_throws "Some specified inputs were not found in system. The following variables were not found " structural_simplify(pid, inputs =
152154
[
153155
pid.reference.u,
154156
pid.measurement.u
155-
], [ctr_output.u])
156-
@test_throws "Some parameters are missing from the variable map." linearize(pid,
157-
[
157+
], outputs = [ctr_output.u])
158+
@test_throws "Some specified outputs were not found in system." structural_simplify(pid,
159+
inputs = [
158160
reference.u,
159161
measurement.u
160162
],
161-
[pid.ctr_output.u])
163+
outputs = [pid.ctr_output.u])
162164
else # v1.6 does not have the feature to match error message
163165
@test_throws ErrorException linearize(pid,
164166
[
@@ -200,7 +202,7 @@ lsys = linearize(sat, [u], [y])
200202
# @test substitute(lsyss.D, ModelingToolkit.defaults(sat)) == lsys.D
201203

202204
# outside the linear region the derivative is 0
203-
lsys, ssys = linearize(sat, [u], [y]; op = Dict(u => 2))
205+
lsys = linearize(sat, [u], [y]; op = Dict(u => 2))
204206
@test isempty(lsys.A) # there are no differential variables in this system
205207
@test isempty(lsys.B)
206208
@test isempty(lsys.C)
@@ -306,12 +308,12 @@ m_ss = 2.4000000003229878
306308
eqs = [D(x) ~ p * u, x ~ y]
307309
@named sys = ODESystem(eqs, t)
308310

309-
matrices1, _ = linearize(sys, [u], []; op = Dict(x => 2.0))
310-
matrices2, _ = linearize(sys, [u], []; op = Dict(y => 2.0))
311+
matrices1 = linearize(sys, [u], []; op = Dict(x => 2.0))
312+
matrices2 = linearize(sys, [u], []; op = Dict(y => 2.0))
311313
@test matrices1 == matrices2
312314

313315
# Ensure parameter values passed as `Dict` are respected
314-
linfun, _ = linearization_function(sys, [u], []; op = Dict(x => 2.0))
316+
linfun = linearization_function(sys, [u], []; op = Dict(x => 2.0))
315317
matrices = linfun([1.0], Dict(p => 3.0), 1.0)
316318
# this would be 1 if the parameter value isn't respected
317319
@test matrices.f_u[] == 3.0
@@ -327,26 +329,28 @@ end
327329
@parameters p
328330
eqs = [0 ~ x * log(y) - p]
329331
@named sys = ODESystem(eqs, t; defaults = [p => 1.0])
330-
sys = complete(sys)
332+
sys = structural_simplify(sys, inputs = [x])
331333
@test_throws ModelingToolkit.MissingVariablesError linearize(
332-
sys, [x], []; op = Dict(x => 1.0), allow_input_derivatives = true)
334+
sys; op = Dict(x => 1.0), allow_input_derivatives = true)
333335
@test_nowarn linearize(
334-
sys, [x], []; op = Dict(x => 1.0), guesses = Dict(y => 1.0),
336+
sys; op = Dict(x => 1.0), guesses = Dict(y => 1.0),
335337
allow_input_derivatives = true)
336338
end
337339

338340
@testset "Symbolic values for parameters in `linearize`" begin
339341
@named tank_noi = Tank_noi()
340342
@unpack md_i, h, m, ρ, A, K = tank_noi
343+
tank_noi = structural_simplify(tank_noi, inputs = [md_i], outputs = [h])
341344
m_ss = 2.4000000003229878
342345
@test_nowarn linearize(
343-
tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5))
346+
tank_noi; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5))
344347
end
345348

346349
@testset "Warn on empty operating point" begin
347350
@named tank_noi = Tank_noi()
348351
@unpack md_i, h, m = tank_noi
352+
tank_noi = structural_simplify(tank_noi, inputs = [md_i], outputs = [h])
349353
m_ss = 2.4000000003229878
350354
@test_warn ["empty operating point", "warn_empty_op"] linearize(
351-
tank_noi, [md_i], [h]; p = [md_i => 1.0])
355+
tank_noi; p = [md_i => 1.0])
352356
end

0 commit comments

Comments
 (0)