Skip to content

Commit db503d1

Browse files
committed
Handle overdetermined systems gracefully when fully_determined = false
1 parent 0f7fd32 commit db503d1

File tree

7 files changed

+38
-29
lines changed

7 files changed

+38
-29
lines changed

src/bipartite_graph.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ return `false` may not be matched.
422422
"""
423423
function maximal_matching(g::BipartiteGraph, srcfilter = vsrc -> true,
424424
dstfilter = vdst -> true, ::Type{U} = Unassigned) where {U}
425-
matching = Matching{U}(ndsts(g))
425+
matching = Matching{U}(max(nsrcs(g), ndsts(g)))
426426
foreach(Iterators.filter(srcfilter, 𝑠vertices(g))) do vsrc
427427
construct_augmenting_path!(matching, g, vsrc, dstfilter)
428428
end

src/parameters.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ function split_parameters_by_type(ps)
102102
split_ps = tighten_types.(Base.Fix1(getindex, ps).(split_idxs))
103103

104104
if ps isa StaticArray
105-
parrs = map(x-> SArray{Tuple{size(x)...}}(x), split_ps)
105+
parrs = map(x -> SArray{Tuple{size(x)...}}(x), split_ps)
106106
split_ps = SArray{Tuple{size(parrs)...}}(parrs)
107107
end
108108
if length(split_ps) == 1 #Tuple not needed, only 1 type

src/systems/abstractsystem.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ function SymbolicIndexingInterface.variable_index(sys::AbstractSystem, sym::Symb
213213
if idx !== nothing
214214
return idx
215215
elseif count('', string(sym)) == 1
216-
return findfirst(isequal(sym), Symbol.(sys.name, :₊, getname.(variable_symbols(sys))))
216+
return findfirst(isequal(sym),
217+
Symbol.(sys.name, :₊, getname.(variable_symbols(sys))))
217218
end
218219
return nothing
219220
end
@@ -255,7 +256,8 @@ function SymbolicIndexingInterface.parameter_index(sys::AbstractSystem, sym::Sym
255256
if idx !== nothing
256257
return idx
257258
elseif count('', string(sym)) == 1
258-
return findfirst(isequal(sym), Symbol.(sys.name, :₊, getname.(parameter_symbols(sys))))
259+
return findfirst(isequal(sym),
260+
Symbol.(sys.name, :₊, getname.(parameter_symbols(sys))))
259261
end
260262
return nothing
261263
end

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,10 @@ function DiffEqBase.ODEProblem(sys::AbstractODESystem, args...; kwargs...)
912912
ODEProblem{true}(sys, args...; kwargs...)
913913
end
914914

915-
function DiffEqBase.ODEProblem(sys::AbstractODESystem, u0map::StaticArray, args...; kwargs...)
915+
function DiffEqBase.ODEProblem(sys::AbstractODESystem,
916+
u0map::StaticArray,
917+
args...;
918+
kwargs...)
916919
ODEProblem{false, SciMLBase.FullSpecialize}(sys, u0map, args...; kwargs...)
917920
end
918921

src/systems/nonlinear/initializesystem.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function initializesystem(sys::ODESystem; name = nameof(sys), guesses = Dict(),
1414
u0 = Vector{Pair}(undef, 0)
1515
defs = ModelingToolkit.defaults(sys)
1616

17-
full_states = [sts;getfield.((observed(sys)),:lhs)]
17+
full_states = [sts; getfield.((observed(sys)), :lhs)]
1818

1919
# Refactor to ODESystem construction
2020
# should be ModelingToolkit.guesses(sys)
@@ -28,26 +28,28 @@ function initializesystem(sys::ODESystem; name = nameof(sys), guesses = Dict(),
2828
def = defs[st]
2929

3030
if def isa Equation
31-
st keys(guesses) && error("Invalid setup: unknown $(st) has an initial condition equation with no guess.")
32-
push!(eqs_ics,def)
33-
push!(u0,st => guesses[st])
31+
st keys(guesses) &&
32+
error("Invalid setup: unknown $(st) has an initial condition equation with no guess.")
33+
push!(eqs_ics, def)
34+
push!(u0, st => guesses[st])
3435
else
35-
push!(eqs_ics,st ~ def)
36+
push!(eqs_ics, st ~ def)
3637
push!(u0, st => def)
3738
end
3839
elseif st keys(guesses)
39-
push!(u0,st => guesses[st])
40+
push!(u0, st => guesses[st])
4041
else
4142
error("Invalid setup: unknown $(st) has no default value or initial guess")
4243
end
4344
end
4445

4546
pars = parameters(sys)
47+
nleqs = [eqs_ics; observed(sys)]
4648

47-
sys_nl = NonlinearSystem([eqs_ics; observed(sys)],
49+
sys_nl = NonlinearSystem(nleqs,
4850
full_states,
4951
pars;
50-
defaults = merge(ModelingToolkit.defaults(sys),todict(u0)),
52+
defaults = merge(ModelingToolkit.defaults(sys), todict(u0)),
5153
name,
5254
kwargs...)
5355

test/inversemodel.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ sol = solve(prob, Rodas5P())
145145
# plot(sol, idxs=[model.tank.xc, model.tank.xT, model.controller.ctr_output.u], layout=3, sp=[1 2 3])
146146
# hline!([prob[cm.ref.k]], label="ref", sp=1)
147147

148-
@test sol(tspan[2], idxs = cm.tank.xc) getp(prob, cm.ref.k)(prob) atol=1e-2 # Test that the inverse model led to the correct reference
148+
@test sol(tspan[2], idxs = cm.tank.xc)getp(prob, cm.ref.k)(prob) atol=1e-2 # Test that the inverse model led to the correct reference
149149

150150
Sf, simplified_sys = Blocks.get_sensitivity_function(model, :y) # This should work without providing an operating opint containing a dummy derivative
151151
x, p = ModelingToolkit.get_u0_p(simplified_sys, op)

test/symbolic_indexing_interface.jl

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ eqs = [D(x) ~ a * y + t, D(y) ~ b * t]
88

99
@test all(is_variable.((odesys,), [x, y, 1, 2, :x, :y]))
1010
@test all(.!is_variable.((odesys,), [a, b, t, 3, 0, :a, :b]))
11-
@test variable_index.((odesys,), [x, y, a, b, t, 1, 2, :x, :y, :a, :b]) == [1, 2, nothing, nothing, nothing, 1, 2, 1, 2, nothing, nothing]
11+
@test variable_index.((odesys,), [x, y, a, b, t, 1, 2, :x, :y, :a, :b]) ==
12+
[1, 2, nothing, nothing, nothing, 1, 2, 1, 2, nothing, nothing]
1213
@test isequal(variable_symbols(odesys), [x, y])
1314
@test all(is_parameter.((odesys,), [a, b, 1, 2, :a, :b]))
1415
@test all(.!is_parameter.((odesys,), [x, y, t, 3, 0, :x, :y]))
15-
@test parameter_index.((odesys,), [x, y, a, b, t, 1, 2, :x, :y, :a, :b]) == [nothing, nothing, 1, 2, nothing, 1, 2, nothing, nothing, 1, 2]
16+
@test parameter_index.((odesys,), [x, y, a, b, t, 1, 2, :x, :y, :a, :b]) ==
17+
[nothing, nothing, 1, 2, nothing, 1, 2, nothing, nothing, 1, 2]
1618
@test isequal(parameter_symbols(odesys), [a, b])
1719
@test all(is_independent_variable.((odesys,), [t, :t]))
1820
@test all(.!is_independent_variable.((odesys,), [x, y, a, :x, :y, :a]))
@@ -23,10 +25,10 @@ eqs = [D(x) ~ a * y + t, D(y) ~ b * t]
2325
@variables x y z
2426
@parameters σ ρ β
2527

26-
eqs = [0 ~ σ*(y-x),
27-
0 ~ x*-z)-y,
28-
0 ~ x*y - β*z]
29-
@named ns = NonlinearSystem(eqs, [x,y,z],[σ,ρ,β])
28+
eqs = [0 ~ σ * (y - x),
29+
0 ~ x *- z) - y,
30+
0 ~ x * y - β * z]
31+
@named ns = NonlinearSystem(eqs, [x, y, z], [σ, ρ, β])
3032

3133
@test !is_time_dependent(ns)
3234

@@ -37,20 +39,20 @@ Dtt = Differential(t)^2
3739
Dt = Differential(t)
3840

3941
#2D PDE
40-
C=1
41-
eq = Dtt(u(t,x)) ~ C^2*Dxx(u(t,x))
42+
C = 1
43+
eq = Dtt(u(t, x)) ~ C^2 * Dxx(u(t, x))
4244

4345
# Initial and boundary conditions
44-
bcs = [u(t,0) ~ 0.,# for all t > 0
45-
u(t,1) ~ 0.,# for all t > 0
46-
u(0,x) ~ x*(1. - x), #for all 0 < x < 1
47-
Dt(u(0,x)) ~ 0. ] #for all 0 < x < 1]
46+
bcs = [u(t, 0) ~ 0.0,# for all t > 0
47+
u(t, 1) ~ 0.0,# for all t > 0
48+
u(0, x) ~ x * (1.0 - x), #for all 0 < x < 1
49+
Dt(u(0, x)) ~ 0.0] #for all 0 < x < 1]
4850

4951
# Space and time domains
50-
domains = [t (0.0,1.0),
51-
x (0.0,1.0)]
52+
domains = [t (0.0, 1.0),
53+
x (0.0, 1.0)]
5254

53-
@named pde_system = PDESystem(eq,bcs,domains,[t,x],[u])
55+
@named pde_system = PDESystem(eq, bcs, domains, [t, x], [u])
5456

5557
@test pde_system.ps == SciMLBase.NullParameters()
5658
@test parameter_symbols(pde_system) == []

0 commit comments

Comments
 (0)