Skip to content

Commit fe7b6e3

Browse files
committed
Merge branch 'master' into id-tutorial
2 parents 4bb73be + f8deda6 commit fe7b6e3

File tree

7 files changed

+43
-12
lines changed

7 files changed

+43
-12
lines changed

Project.toml

Lines changed: 2 additions & 2 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 = "6.4.6"
4+
version = "6.4.8"
55

66
[deps]
77
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
@@ -72,7 +72,7 @@ SciMLBase = "1.3"
7272
Setfield = "0.7"
7373
SpecialFunctions = "0.7, 0.8, 0.9, 0.10, 1.0"
7474
StaticArrays = "0.10, 0.11, 0.12, 1.0"
75-
SymbolicUtils = "0.12, 0.13"
75+
SymbolicUtils = "0.13.4"
7676
Symbolics = "3.1"
7777
UnPack = "0.1, 1.0"
7878
Unitful = "1.1"

docs/src/basics/FAQ.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,25 @@ lowered array? You can use the internal function `varmap_to_vars`. For example:
2121
```julia
2222
pnew = varmap_to_vars([β=>3.0, c=>10.0, γ=>2.0],parameters(sys))
2323
```
24+
25+
## How do I handle `if` statements in my symbolic forms?
26+
27+
For statements that are in the `if then else` form, use `IfElse.ifelse` from the
28+
[IfElse.jl](https://github.com/SciML/IfElse.jl) package to represent the code in a
29+
functional form. For handling direct `if` statements, you can use equivalent boolean
30+
mathematical expressions. For example `if x > 0 ...` can be implementated as just
31+
`(x > 0) * `, where if `x <= 0` then the boolean will evaluate to `0` and thus the
32+
term will be excluded from the model.
33+
34+
## ERROR: TypeError: non-boolean (Num) used in boolean context?
35+
36+
If you see the error:
37+
38+
```julia
39+
ERROR: TypeError: non-boolean (Num) used in boolean context
40+
```
41+
42+
then it's likely you are trying to trace through a function which cannot be
43+
directly represented in Julia symbols. The techniques to handle this problem,
44+
such as `@register`, are described in detail
45+
[in the Symbolics.jl documentation](https://symbolics.juliasymbolics.org/dev/manual/faq/#Transforming-my-function-to-a-symbolic-equation-has-failed.-What-do-I-do?-1).

src/systems/abstractsystem.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ by default.
948948
function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol=nameof(sys))
949949
T = SciMLBase.parameterless_type(basesys)
950950
ivs = independent_variables(basesys)
951-
if !(typeof(sys) <: T)
951+
if !(sys isa T)
952952
if length(ivs) == 0
953953
sys = convert_system(T, sys)
954954
elseif length(ivs) == 1
@@ -958,11 +958,11 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol=nameo
958958
end
959959
end
960960

961-
eqs = union(equations(basesys), equations(sys))
962-
sts = union(states(basesys), states(sys))
963-
ps = union(parameters(basesys), parameters(sys))
964-
obs = union(observed(basesys), observed(sys))
965-
defs = merge(defaults(basesys), defaults(sys)) # prefer `sys`
961+
eqs = union(get_eqs(basesys), get_eqs(sys))
962+
sts = union(get_states(basesys), get_states(sys))
963+
ps = union(get_ps(basesys), get_ps(sys))
964+
obs = union(get_observed(basesys), get_observed(sys))
965+
defs = merge(get_defaults(basesys), get_defaults(sys)) # prefer `sys`
966966
syss = union(get_systems(basesys), get_systems(sys))
967967

968968
if length(ivs) == 0
@@ -984,7 +984,7 @@ function compose(sys::AbstractSystem, systems::AbstractArray{<:AbstractSystem};
984984
nsys = length(systems)
985985
nsys >= 1 || throw(ArgumentError("There must be at least 1 subsystem. Got $nsys subsystems."))
986986
@set! sys.name = name
987-
@set! sys.systems = systems
987+
@set! sys.systems = [get_systems(sys); systems]
988988
return sys
989989
end
990990
compose(syss::AbstractSystem...; name=nameof(first(syss))) = compose(first(syss), collect(syss[2:end]); name=name)

src/systems/diffeqs/odesystem.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function ODESystem(
125125
Base.depwarn("`default_u0` and `default_p` are deprecated. Use `defaults` instead.", :ODESystem, force=true)
126126
end
127127
defaults = todict(defaults)
128-
defaults = Dict(value(k) => value(v) for (k, v) in pairs(defaults))
128+
defaults = Dict{Any,Any}(value(k) => value(v) for (k, v) in pairs(defaults))
129129

130130
iv′ = value(scalarize(iv))
131131
dvs′ = value.(scalarize(dvs))
@@ -187,6 +187,7 @@ end
187187

188188
# NOTE: equality does not check cached Jacobian
189189
function Base.:(==)(sys1::ODESystem, sys2::ODESystem)
190+
sys1 === sys2 && return true
190191
iv1 = get_iv(sys1)
191192
iv2 = get_iv(sys2)
192193
isequal(iv1, iv2) &&

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function NonlinearSystem(eqs, states, ps;
8585
end
8686
jac = RefValue{Any}(Matrix{Num}(undef, 0, 0))
8787
defaults = todict(defaults)
88-
defaults = Dict(value(k) => value(v) for (k, v) in pairs(defaults))
88+
defaults = Dict{Any,Any}(value(k) => value(v) for (k, v) in pairs(defaults))
8989

9090
states = collect(states)
9191
states, ps = value.(states), value.(ps)

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ function check_operator_variables(eq, op::Type, expr=eq.rhs)
216216
if operation(expr) isa op
217217
throw_invalid_operator(expr, eq, op)
218218
end
219-
foreach(expr -> check_operator_variables(eq, op, expr), arguments(expr))
219+
foreach(expr -> check_operator_variables(eq, op, expr), SymbolicUtils.unsorted_arguments(expr))
220220
end
221221

222222
isdifferential(expr) = istree(expr) && operation(expr) isa Differential

test/components.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,11 @@ sol = solve(prob, Rodas4())
4747

4848
prob = ODAEProblem(sys, u0, (0, 10.0))
4949
sol = solve(prob, Tsit5())
50+
51+
@variables t x1(t) x2(t) x3(t) x4(t)
52+
D = Differential(t)
53+
@named sys1_inner = ODESystem([D(x1) ~ x1], t)
54+
@named sys1_partial = compose(ODESystem([D(x2) ~ x2], t; name=:foo), sys1_inner)
55+
@named sys1 = extend(ODESystem([D(x3) ~ x3], t; name=:foo), sys1_partial)
56+
@named sys2 = compose(ODESystem([D(x4) ~ x4], t; name=:foo), sys1)
57+
@test_nowarn sys2.sys1.sys1_inner.x1 # test the correct nesting

0 commit comments

Comments
 (0)