Skip to content

Commit 13928b0

Browse files
committed
Fix ODESymstems and add extra indirection
1 parent af277cf commit 13928b0

File tree

4 files changed

+27
-31
lines changed

4 files changed

+27
-31
lines changed

src/build_function.jl

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -458,27 +458,12 @@ end
458458

459459
vars_to_pairs(args) = vars_to_pairs(args[1],args[2])
460460
function vars_to_pairs(name,vs::AbstractArray)
461-
vs_names = [term_to_symbol(value(u)) for u vs]
462-
exs = [:($name[$i]) for (i, u) enumerate(vs)]
463-
vs_names,exs
461+
vs_names = [tosymbol(u) for u vs]
462+
exs = [:($name[$i]) for (i, u) enumerate(vs)]
463+
vs_names,exs
464464
end
465-
466-
function term_to_symbol(t::Term)
467-
if operation(t) isa Sym
468-
s = nameof(operation(t))
469-
else
470-
error("really?")
471-
end
472-
end
473-
474-
term_to_symbol(s::Sym) = nameof(s)
475-
476465
function vars_to_pairs(name,vs)
477-
[term_to_symbol(value(vs))], [name]
478-
end
479-
480-
function rm_calls_with_iv(expr)
481-
Rewriters.Prewalk(Rewriters.Chain([@rule((~f::(x->x isa Sym))(~t::(x->x isa Sym)) => Sym{symtype((~f)(~t))}((term_to_symbol(~f))))]))(value(expr))
466+
[tosymbol(vs)], [name]
482467
end
483468

484469
get_varnumber(varop, vars::Vector) = findfirst(x->isequal(x,varop),vars)
@@ -494,7 +479,7 @@ function numbered_expr(O::Union{Term,Sym},args...;varordering = args[1],offset =
494479
end
495480
end
496481
end
497-
return Expr(:call, O isa Sym ? nameof(O) : Symbol(O.op),
482+
return Expr(:call, O isa Sym ? nameof(O) : tosymbol(O.op),
498483
[numbered_expr(x,args...;offset=offset,lhsname=lhsname,
499484
rhsnames=rhsnames,varordering=varordering) for x in O.args]...)
500485
end
@@ -504,7 +489,7 @@ function numbered_expr(de::ModelingToolkit.Equation,args...;varordering = args[1
504489

505490
varordering = value.(args[1])
506491
var = var_from_nested_derivative(de.lhs)[1]
507-
i = findfirst(x->isequal(x isa Sym ? term_to_symbol(x) : term_to_symbol(x.op),term_to_symbol(var)),varordering)
492+
i = findfirst(x->isequal(tosymbol(x isa Sym ? x : x.op), tosymbol(var)),varordering)
508493
:($lhsname[$(i+offset)] = $(numbered_expr(de.rhs,args...;offset=offset,
509494
varordering = varordering,
510495
lhsname = lhsname,

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ function calculate_tgrad(sys::AbstractODESystem;
1111
if simplify
1212
tgrad = ModelingToolkit.simplify.(notime_tgrad)
1313
end
14+
xs = states(sys)
15+
rule = Dict(map((x, xt) -> x=>xt, detime_dvs.(xs), xs))
16+
tgrad = substitute.(tgrad, Ref(rule))
1417
sys.tgrad[] = tgrad
1518
return tgrad
1619
end
@@ -41,7 +44,8 @@ ODEToExpr(@nospecialize(sys)) = ODEToExpr(sys,states(sys))
4144
(f::ODEToExpr)(O::Num) = f(value(O))
4245
function (f::ODEToExpr)(O::Term)
4346
if isa(O.op, Sym)
44-
any(isequal(O), f.states) && return O.op.name # dependent variables
47+
any(isequal(O), f.states) && return tosymbol(O)
48+
# dependent variables
4549
return build_expr(:call, Any[O.op.name; f.(O.args)])
4650
end
4751
return build_expr(:call, Any[O.op; f.(O.args)])
@@ -64,9 +68,15 @@ function generate_jacobian(sys::AbstractODESystem, dvs = states(sys), ps = param
6468
conv = ODEToExpr(sys), kwargs...)
6569
end
6670

67-
Base.Symbol(t::Num) = Symbol(value(t))
68-
function Base.Symbol(t::Term)
71+
Base.Symbol(x::Union{Num,Symbolic}) = tosymbol(x)
72+
tosymbol(x; kwargs...) = x
73+
tosymbol(x::Sym; kwargs...) = nameof(x)
74+
tosymbol(t::Num; kwargs...) = tosymbol(value(t); kwargs...)
75+
function tosymbol(t::Term; states=nothing)
6976
if t.op isa Sym
77+
if states !== nothing && !(any(isequal(t), states))
78+
return nameof(t.op)
79+
end
7080
op = nameof(t.op)
7181
args = t.args
7282
elseif t.op isa Differential
@@ -75,7 +85,7 @@ function Base.Symbol(t::Term)
7585
end
7686
op = Symbol(nameof(t.args[1].op),
7787
,
78-
Symbol(t.op.x))
88+
tosymbol(t.op.x))
7989
args = t.args[1].args
8090
else
8191
@goto err
@@ -86,13 +96,13 @@ function Base.Symbol(t::Term)
8696
error("Cannot convert $t to a symbol")
8797
end
8898

89-
makesym(t::Symbolic) = Sym{symtype(t)}(Symbol(t))
90-
makesym(t::Num) = makesym(value(t))
99+
makesym(t::Symbolic; kwargs...) = Sym{symtype(t)}(tosymbol(t; kwargs...))
100+
makesym(t::Num; kwargs...) = makesym(value(t); kwargs...)
91101

92102
function generate_function(sys::AbstractODESystem, dvs = states(sys), ps = parameters(sys); kwargs...)
93103
# optimization
94-
dvs′ = makesym.(value.(dvs))
95-
ps′ = makesym.(value.(ps))
104+
dvs′ = makesym.(value.(dvs), states=dvs)
105+
ps′ = makesym.(value.(ps), states=dvs)
96106

97107
sub = Dict(dvs .=> dvs′)
98108
# substitute x(t) by just x
@@ -107,7 +117,7 @@ function calculate_massmatrix(sys::AbstractODESystem; simplify=true)
107117
M = zeros(length(eqs),length(eqs))
108118
for (i,eq) in enumerate(eqs)
109119
if eq.lhs isa Term && eq.lhs.op isa Differential
110-
j = findfirst(x->isequal(term_to_symbol(x),term_to_symbol(var_from_nested_derivative(eq.lhs)[1])),dvs)
120+
j = findfirst(x->isequal(tosymbol(x),tosymbol(var_from_nested_derivative(eq.lhs)[1])),dvs)
111121
M[i,j] = 1
112122
else
113123
eq.lhs == 0 || error("Only semi-explicit constant mass matrices are currently supported. Faulty equation: $eq.")

test/derivatives.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ t1 = ModelingToolkit.gradient(tmp, [x1, x2])
9797
@parameters t k
9898
@variables x(t)
9999
@derivatives D'~k
100-
@test ModelingToolkit.makesym(D(x).val).name === :xˍk
100+
@test ModelingToolkit.makesym(D(x).val).name === Symbol("xˍk⦗t⦘")
101101

102102
using ModelingToolkit
103103
@variables t x(t)

test/odesystem.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ eqs = [D(x) ~ -A*x,
145145
D(y) ~ A*x - B*_x]
146146
de = ODESystem(eqs)
147147
@test begin
148+
local f
148149
f = eval(generate_function(de, [x,y], [A,B,C])[2])
149150
du = [0.0,0.0]
150151
f(du, [1.0,2.0], [1,2,3], 0.0)

0 commit comments

Comments
 (0)