Skip to content

Commit c84e5fa

Browse files
committed
Merge branch 'master' into ms/observed_lowering
2 parents 4bce8aa + 0feba8f commit c84e5fa

File tree

14 files changed

+365
-213
lines changed

14 files changed

+365
-213
lines changed

Project.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ModelingToolkit"
22
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "5.0.1"
4+
version = "5.1.0"
55

66
[deps]
77
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
@@ -36,7 +36,7 @@ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
3636
[compat]
3737
ArrayInterface = "2.8"
3838
DataStructures = "0.17, 0.18"
39-
DiffEqBase = "6.48.1"
39+
DiffEqBase = "6.54.0"
4040
DiffEqJump = "6.7.5"
4141
DiffRules = "0.1, 1.0"
4242
Distributions = "0.24"
@@ -64,6 +64,7 @@ julia = "1.2"
6464
Dagger = "d58978e5-989f-55fb-8d15-ea34adc7bf54"
6565
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
6666
GalacticOptim = "a75be94c-b780-496d-a8a9-0878b188d577"
67+
NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
6768
Optim = "429524aa-4258-5aef-a3af-852621145aeb"
6869
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
6970
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
@@ -72,4 +73,4 @@ StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
7273
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
7374

7475
[targets]
75-
test = ["Dagger", "ForwardDiff", "GalacticOptim", "OrdinaryDiffEq", "Optim", "Random", "SteadyStateDiffEq", "Test", "StochasticDiffEq"]
76+
test = ["Dagger", "ForwardDiff", "GalacticOptim", "NonlinearSolve", "OrdinaryDiffEq", "Optim", "Random", "SteadyStateDiffEq", "Test", "StochasticDiffEq"]

docs/src/tutorials/modelingtoolkitize.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Symbolic Extensions to ODEProblem via Modelingtoolkize
1+
# Symbolic Extensions to ODEProblem via Modelingtoolkitize
22

33
For some `DEProblem` types, automatic tracing functionality is already included
44
via the `modelingtoolkitize` function. Take, for example, the Robertson ODE

docs/src/tutorials/symbolic_functions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ just like any other function. To build a differential operator, use
287287

288288
```julia
289289
@variables t
290-
Differential(t)
290+
D = Differential(t)
291291
```
292292

293293
This is the differential operator ``D = \frac{\partial}{\partial t}``: the number of

src/systems/abstractsystem.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,6 @@ function (f::AbstractSysToExpr)(O)
299299
end
300300
return build_expr(:call, Any[operation(O); f.(arguments(O))])
301301
end
302+
303+
get_default_p(sys) = sys.default_p
304+
get_default_u0(sys) = sys.default_u0

src/systems/control/controlsystem.jl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,33 @@ struct ControlSystem <: AbstractControlSystem
6868
systems: The internal systems
6969
"""
7070
systems::Vector{ControlSystem}
71+
"""
72+
default_u0: The default initial conditions to use when initial conditions
73+
are not supplied in `ODEProblem`.
74+
"""
75+
default_u0::Dict
76+
"""
77+
default_p: The default parameters to use when parameters are not supplied
78+
in `ODEProblem`.
79+
"""
80+
default_p::Dict
7181
end
7282

7383
function ControlSystem(loss, deqs::AbstractVector{<:Equation}, iv, dvs, controls, ps;
74-
pins = [],
75-
observed = [],
76-
systems = ODESystem[],
77-
name=gensym(:ControlSystem))
84+
pins = [],
85+
observed = [],
86+
systems = ODESystem[],
87+
default_u0=Dict(),
88+
default_p=Dict(),
89+
name=gensym(:ControlSystem))
7890
iv′ = value(iv)
7991
dvs′ = value.(dvs)
8092
controls′ = value.(controls)
8193
ps′ = value.(ps)
94+
default_u0 isa Dict || (default_u0 = Dict(default_u0))
95+
default_p isa Dict || (default_p = Dict(default_p))
8296
ControlSystem(value(loss), deqs, iv′, dvs′, controls′,
83-
ps′, pins, observed, name, systems)
97+
ps′, pins, observed, name, systems, default_u0, default_p)
8498
end
8599

86100
struct ControlToExpr
@@ -102,7 +116,7 @@ end
102116
(f::ControlToExpr)(x::Sym) = x.name
103117

104118
function constructRadauIIA5(T::Type = Float64)
105-
sq6 = sqrt(6)
119+
sq6 = sqrt(convert(T, 6))
106120
A = [11//45-7sq6/360 37//225-169sq6/1800 -2//225+sq6/75
107121
37//225+169sq6/1800 11//45+7sq6/360 -2//225-sq6/75
108122
4//9-sq6/36 4//9+sq6/36 1//9]
@@ -111,7 +125,7 @@ function constructRadauIIA5(T::Type = Float64)
111125
A = map(T,A)
112126
α = map(T,α)
113127
c = map(T,c)
114-
return(DiffEqBase.ImplicitRKTableau(A,c,α,5))
128+
return DiffEqBase.ImplicitRKTableau(A,c,α,5)
115129
end
116130

117131

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 36 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,31 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
232232
!linenumbers ? striplines(ex) : ex
233233
end
234234

235+
function process_DEProblem(constructor, sys::AbstractODESystem,u0map,parammap;
236+
version = nothing, tgrad=false,
237+
jac = false,
238+
checkbounds = false, sparse = false,
239+
simplify=false,
240+
linenumbers = true, parallel=SerialForm(),
241+
eval_expression = true,
242+
kwargs...)
243+
dvs = states(sys)
244+
ps = parameters(sys)
245+
u0map′ = lower_mapnames(u0map,sys.iv)
246+
u0 = varmap_to_vars(u0map′,dvs; defaults=get_default_u0(sys))
247+
248+
if !(parammap isa DiffEqBase.NullParameters)
249+
parammap′ = lower_mapnames(parammap)
250+
p = varmap_to_vars(parammap′,ps; defaults=get_default_p(sys))
251+
else
252+
p = ps
253+
end
254+
255+
f = constructor(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
256+
linenumbers=linenumbers,parallel=parallel,simplify=simplify,
257+
sparse=sparse,eval_expression=eval_expression,kwargs...)
258+
return f, u0, p
259+
end
235260

236261
function ODEFunctionExpr(sys::AbstractODESystem, args...; kwargs...)
237262
ODEFunctionExpr{true}(sys, args...; kwargs...)
@@ -258,29 +283,8 @@ Generates an ODEProblem from an ODESystem and allows for automatically
258283
symbolically calculating numerical enhancements.
259284
"""
260285
function DiffEqBase.ODEProblem{iip}(sys::AbstractODESystem,u0map,tspan,
261-
parammap=DiffEqBase.NullParameters();
262-
version = nothing, tgrad=false,
263-
jac = false,
264-
checkbounds = false, sparse = false,
265-
simplify=false,
266-
linenumbers = true, parallel=SerialForm(),
267-
eval_expression = true,
268-
kwargs...) where iip
269-
dvs = states(sys)
270-
ps = parameters(sys)
271-
u0map′ = lower_mapnames(u0map,sys.iv)
272-
u0 = varmap_to_vars(u0map′,dvs)
273-
274-
if !(parammap isa DiffEqBase.NullParameters)
275-
parammap′ = lower_mapnames(parammap)
276-
p = varmap_to_vars(parammap′,ps)
277-
else
278-
p = ps
279-
end
280-
281-
f = ODEFunction{iip}(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
282-
linenumbers=linenumbers,parallel=parallel,simplify=simplify,
283-
sparse=sparse,eval_expression=eval_expression,kwargs...)
286+
parammap=DiffEqBase.NullParameters();kwargs...) where iip
287+
f, u0, p = process_DEProblem(ODEFunction{iip}, sys, u0map, parammap; kwargs...)
284288
ODEProblem{iip}(f,u0,tspan,p;kwargs...)
285289
end
286290

@@ -304,30 +308,12 @@ numerical enhancements.
304308
struct ODEProblemExpr{iip} end
305309

306310
function ODEProblemExpr{iip}(sys::AbstractODESystem,u0map,tspan,
307-
parammap=DiffEqBase.NullParameters();
308-
version = nothing, tgrad=false,
309-
jac = false,
310-
checkbounds = false, sparse = false,
311-
simplify=false,
312-
linenumbers = false, parallel=SerialForm(),
313-
kwargs...) where iip
314-
315-
dvs = states(sys)
316-
ps = parameters(sys)
317-
u0map′ = lower_mapnames(u0map,sys.iv)
318-
u0 = varmap_to_vars(u0map′,dvs)
311+
parammap=DiffEqBase.NullParameters();
312+
kwargs...) where iip
319313

320-
if !(parammap isa DiffEqBase.NullParameters)
321-
parammap′ = lower_mapnames(parammap)
322-
p = varmap_to_vars(parammap′,ps)
323-
else
324-
p = ps
325-
end
314+
f, u0, p = process_DEProblem(ODEFunctionExpr{iip}, sys, u0map, parammap; kwargs...)
315+
linenumbers = get(kwargs, :linenumbers, true)
326316

327-
f = ODEFunctionExpr{iip}(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
328-
linenumbers=linenumbers,parallel=parallel,
329-
simplify=simplify,
330-
sparse=sparse,kwargs...)
331317
ex = quote
332318
f = $f
333319
u0 = $u0
@@ -362,19 +348,9 @@ Generates an SteadyStateProblem from an ODESystem and allows for automatically
362348
symbolically calculating numerical enhancements.
363349
"""
364350
function DiffEqBase.SteadyStateProblem{iip}(sys::AbstractODESystem,u0map,
365-
parammap=DiffEqBase.NullParameters();
366-
version = nothing, tgrad=false,
367-
jac = false,
368-
checkbounds = false, sparse = false,
369-
linenumbers = true, parallel=SerialForm(),
370-
kwargs...) where iip
371-
dvs = states(sys)
372-
ps = parameters(sys)
373-
u0 = varmap_to_vars(u0map,dvs)
374-
p = varmap_to_vars(parammap,ps)
375-
f = ODEFunction(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
376-
linenumbers=linenumbers,parallel=parallel,
377-
sparse=sparse,kwargs...)
351+
parammap=DiffEqBase.NullParameters();
352+
kwargs...) where iip
353+
f, u0, p = process_DEProblem(ODEFunction{iip}, sys, u0map, parammap; kwargs...)
378354
SteadyStateProblem(f,u0,p;kwargs...)
379355
end
380356

@@ -397,18 +373,9 @@ struct SteadyStateProblemExpr{iip} end
397373

398374
function SteadyStateProblemExpr{iip}(sys::AbstractODESystem,u0map,
399375
parammap=DiffEqBase.NullParameters();
400-
version = nothing, tgrad=false,
401-
jac = false,
402-
checkbounds = false, sparse = false,
403-
linenumbers = true, parallel=SerialForm(),
404376
kwargs...) where iip
405-
dvs = states(sys)
406-
ps = parameters(sys)
407-
u0 = varmap_to_vars(u0map,dvs)
408-
p = varmap_to_vars(parammap,ps)
409-
f = ODEFunctionExpr(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
410-
linenumbers=linenumbers,parallel=parallel,
411-
sparse=sparse,kwargs...)
377+
f, u0, p = process_DEProblem(ODEFunctionExpr{iip}, sys, u0map, parammap; kwargs...)
378+
linenumbers = get(kwargs, :linenumbers, true)
412379
ex = quote
413380
f = $f
414381
u0 = $u0

src/systems/diffeqs/odesystem.jl

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,39 @@ struct ODESystem <: AbstractODESystem
6161
systems: The internal systems
6262
"""
6363
systems::Vector{ODESystem}
64+
"""
65+
default_u0: The default initial conditions to use when initial conditions
66+
are not supplied in `ODEProblem`.
67+
"""
68+
default_u0::Dict
69+
"""
70+
default_p: The default parameters to use when parameters are not supplied
71+
in `ODEProblem`.
72+
"""
73+
default_p::Dict
6474
end
6575

66-
function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps;
76+
function ODESystem(
77+
deqs::AbstractVector{<:Equation}, iv, dvs, ps;
6778
pins = Num[],
6879
observed = Num[],
6980
systems = ODESystem[],
70-
name=gensym(:ODESystem))
81+
name=gensym(:ODESystem),
82+
default_u0=Dict(),
83+
default_p=Dict(),
84+
)
7185
iv′ = value(iv)
7286
dvs′ = value.(dvs)
7387
ps′ = value.(ps)
74-
pins′ = value.(pins)
88+
89+
default_u0 isa Dict || (default_u0 = Dict(default_u0))
90+
default_p isa Dict || (default_p = Dict(default_p))
91+
7592
tgrad = RefValue(Vector{Num}(undef, 0))
7693
jac = RefValue{Any}(Matrix{Num}(undef, 0, 0))
7794
Wfact = RefValue(Matrix{Num}(undef, 0, 0))
7895
Wfact_t = RefValue(Matrix{Num}(undef, 0, 0))
79-
ODESystem(deqs, iv′, dvs′, ps′, pins, observed, tgrad, jac, Wfact, Wfact_t, name, systems)
96+
ODESystem(deqs, iv′, dvs′, ps′, pins, observed, tgrad, jac, Wfact, Wfact_t, name, systems, default_u0, default_p)
8097
end
8198

8299
var_from_nested_derivative(x, i=0) = (missing, missing)

0 commit comments

Comments
 (0)