Skip to content

Commit d82c0c8

Browse files
Merge pull request #294 from SciML/naming
More reasonable transformation variable names
2 parents 797a915 + e00ca0c commit d82c0c8

File tree

6 files changed

+69
-58
lines changed

6 files changed

+69
-58
lines changed

src/ModelingToolkit.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ include("variables.jl")
8181
include("context_dsl.jl")
8282
include("operations.jl")
8383
include("differentials.jl")
84+
85+
function Base.convert(::Type{Variable},x::Operation)
86+
if x.op isa Variable
87+
x.op
88+
elseif x.op isa Differential
89+
var = x.args[1].op
90+
rename(var,Symbol(var.name,,x.args[1].args[1].op.name))
91+
else
92+
throw(error("This Operation is not a Variable"))
93+
end
94+
end
95+
8496
include("equations.jl")
8597
include("function_registration.jl")
8698
include("simplify.jl")

src/operations.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ Operation(x) = convert(Operation, x)
6666
#convert to Expr
6767
Base.Expr(op::Operation) = simplified_expr(op)
6868
Base.convert(::Type{Expr},x::Operation) = Expr(x)
69-
function Base.convert(::Type{Variable},x::Operation)
70-
x.op isa Variable ? x.op : throw(error("This Operation is not a Variable"))
71-
end
7269

7370
# promotion
7471
Base.promote_rule(::Type{<:Constant}, ::Type{<:Operation}) = Operation

src/systems/abstractsystem.jl

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
2525
throw(error("Variable $name does not exist"))
2626
end
2727

28-
renamespace(namespace,name) = Symbol(string(namespace)*""*string(name))
28+
renamespace(namespace,name) = Symbol(namespace,:₊,name)
2929

3030
function namespace_variables(sys::AbstractSystem)
3131
[rename(x,renamespace(sys.name,x.name)) for x in states(sys)]
@@ -62,22 +62,24 @@ end
6262

6363
function states(sys::AbstractSystem,name::Symbol)
6464
x = sys.states[findfirst(x->x.name==name,sys.states)]
65-
Variable(Symbol(string(sys.name)*""*string(x.name)))(sys.iv())
65+
rename(x,renamespace(sys.name,x.name))(sys.iv())
6666
end
6767

6868
function parameters(sys::AbstractSystem,name::Symbol)
6969
x = sys.ps[findfirst(x->x.name==name,sys.ps)]
70-
Variable(Symbol(string(sys.name)*""*string(x.name)))(sys.iv())
70+
rename(x,renamespace(sys.name,x.name))()
7171
end
7272

7373
function states(sys::AbstractSystem,args...)
7474
name = last(args)
75-
extra_names = reduce(*,["$(x.name)" for x in args[1:end-1]])
76-
Variable(Symbol(string(sys.name)*extra_names*""*string(name)))(sys.iv())
75+
extra_names = reduce(Symbol,[Symbol(:₊,x.name) for x in args[1:end-1]])
76+
newname = renamespace(extra_names,name)
77+
rename(x,renamespace(sys.name,newname))(sys.iv())
7778
end
7879

7980
function parameters(sys::AbstractSystem,args...)
8081
name = last(args)
81-
extra_names = reduce(*,["$(x.name)" for x in args[1:end-1]])
82-
Variable(Symbol(string(sys.name)*extra_names*""*string(name)))(sys.iv())
82+
extra_names = reduce(Symbol,[Symbol(:₊,x.name) for x in args[1:end-1]])
83+
newname = renamespace(extra_names,name)
84+
rename(x,renamespace(sys.name,newname))()
8385
end

src/systems/diffeqs/first_order_transform.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
function lower_varname(var::Variable, idv, order)
22
order == 0 && return var
3-
name = Symbol(var.name, :_, string(idv.name)^order)
3+
name = Symbol(var.name, :ˍ, string(idv.name)^order)
44
return Variable{vartype(var)}(name)
55
end
66

test/components.jl

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ prob = ODEProblem(connected1,u0map,(0.0,100.0),parammap,jac=true)
4242
@test prob.p == [7.0,1.0,2.0,3.0,4.0,5.0,6.0]
4343
@test prob.u0 isa Vector
4444
@test prob.p isa SVector
45-
@test prob.f.syms == [:a,:lorenz1x,:lorenz1y,:lorenz1z,:lorenz2x,:lorenz2y,:lorenz2z]
45+
@test prob.f.syms == [:a,:lorenz1x,:lorenz1y,:lorenz1z,:lorenz2x,:lorenz2y,:lorenz2z]
4646

4747
eqs_flat = [D(a) ~ a*lorenz1.x,
4848
D(lorenz1.x) ~ lorenz1.σ*(lorenz1.y-lorenz1.x),
@@ -56,19 +56,19 @@ eqs_flat = [D(a) ~ a*lorenz1.x,
5656
@test parameters(connected1) == convert.(Variable,[α,lorenz1.σ,lorenz1.ρ,lorenz1.β,lorenz2.σ,lorenz2.ρ,lorenz2.β])
5757
@test eqs_flat == equations(connected1)
5858

59-
@variables lorenz1x(t) lorenz1y(t) lorenz1z(t) lorenz2x(t) lorenz2y(t) lorenz2z(t)
60-
@parameters lorenz1σ lorenz1ρ lorenz1β lorenz2σ lorenz2ρ lorenz2β
59+
@variables lorenz1x(t) lorenz1y(t) lorenz1z(t) lorenz2x(t) lorenz2y(t) lorenz2z(t)
60+
@parameters lorenz1σ lorenz1ρ lorenz1β lorenz2σ lorenz2ρ lorenz2β
6161

62-
eqs_flat2 = [D(a) ~ a*lorenz1x,
63-
D(lorenz1x) ~ lorenz1σ*(lorenz1y-lorenz1x),
64-
D(lorenz1y) ~ lorenz1x*(lorenz1ρ-lorenz1z)-lorenz1y,
65-
0 ~ lorenz1x + lorenz1y + lorenz1β*lorenz1z,
66-
D(lorenz2x) ~ lorenz2σ*(lorenz2y-lorenz2x),
67-
D(lorenz2y) ~ lorenz2x*(lorenz2ρ-lorenz2z)-lorenz2y,
68-
0 ~ lorenz2x + lorenz2y + lorenz2β*lorenz2z]
62+
eqs_flat2 = [D(a) ~ a*lorenz1x,
63+
D(lorenz1x) ~ lorenz1σ*(lorenz1y-lorenz1x),
64+
D(lorenz1y) ~ lorenz1x*(lorenz1ρ-lorenz1z)-lorenz1y,
65+
0 ~ lorenz1x + lorenz1y + lorenz1β*lorenz1z,
66+
D(lorenz2x) ~ lorenz2σ*(lorenz2y-lorenz2x),
67+
D(lorenz2y) ~ lorenz2x*(lorenz2ρ-lorenz2z)-lorenz2y,
68+
0 ~ lorenz2x + lorenz2y + lorenz2β*lorenz2z]
6969

70-
@test [x.name for x in states(connected1)] == [:a,:lorenz1x,:lorenz1y,:lorenz1z,:lorenz2x,:lorenz2y,:lorenz2z]
71-
@test [x.name for x in parameters(connected1)] == [,:lorenz1σ,:lorenz1ρ,:lorenz1β,:lorenz2σ,:lorenz2ρ,:lorenz2β]
70+
@test [x.name for x in states(connected1)] == [:a,:lorenz1x,:lorenz1y,:lorenz1z,:lorenz2x,:lorenz2y,:lorenz2z]
71+
@test [x.name for x in parameters(connected1)] == [,:lorenz1σ,:lorenz1ρ,:lorenz1β,:lorenz2σ,:lorenz2ρ,:lorenz2β]
7272
@test eqs_flat == equations(connected1)
7373

7474
connected2 = ODESystem(connnectedeqs,t,[a],[α],systems=[lorenz1,lorenz2],name=:connected2)
@@ -104,32 +104,32 @@ eqs_flat = [D(g) ~ g*connected1.lorenz1.x,
104104
@test eqs_flat == equations(doublelevel)
105105

106106
@test [x.name for x in states(doublelevel)] == [:g,
107-
:connected1a,:connected1lorenz1x,:connected1lorenz1y,:connected1lorenz1z,:connected1lorenz2x,:connected1lorenz2y,:connected1lorenz2z,
108-
:connected2a,:connected2lorenz1x,:connected2lorenz1y,:connected2lorenz1z,:connected2lorenz2x,:connected2lorenz2y,:connected2lorenz2z]
107+
:connected1a,:connected1lorenz1x,:connected1lorenz1y,:connected1lorenz1z,:connected1lorenz2x,:connected1lorenz2y,:connected1lorenz2z,
108+
:connected2a,:connected2lorenz1x,:connected2lorenz1y,:connected2lorenz1z,:connected2lorenz2x,:connected2lorenz2y,:connected2lorenz2z]
109109
@test [x.name for x in parameters(doublelevel)] == [,
110-
:connected1α,:connected1lorenz1σ,:connected1lorenz1ρ,:connected1lorenz1β,:connected1lorenz2σ,:connected1lorenz2ρ,:connected1lorenz2β,
111-
:connected2α,:connected2lorenz1σ,:connected2lorenz1ρ,:connected2lorenz1β,:connected2lorenz2σ,:connected2lorenz2ρ,:connected2lorenz2β]
112-
113-
@variables connected1a(t) connected1lorenz1x(t) connected1lorenz1y(t) connected1lorenz1z(t) connected1lorenz2x(t) connected1lorenz2y(t) connected1lorenz2z(t)
114-
@variables connected2a(t) connected2lorenz1x(t) connected2lorenz1y(t) connected2lorenz1z(t) connected2lorenz2x(t) connected2lorenz2y(t) connected2lorenz2z(t)
115-
@parameters connected1α connected1lorenz1σ connected1lorenz1ρ connected1lorenz1β connected1lorenz2σ connected1lorenz2ρ connected1lorenz2β
116-
@parameters connected2α connected2lorenz1σ connected2lorenz1ρ connected2lorenz1β connected2lorenz2σ connected2lorenz2ρ connected2lorenz2β
117-
118-
eqs_flat2 = [D(g) ~ g*connected1lorenz1x,
119-
D(connected1a) ~ connected1a*connected1lorenz1x,
120-
D(connected1lorenz1x) ~ connected1lorenz1σ*(connected1lorenz1y-connected1lorenz1x),
121-
D(connected1lorenz1y) ~ connected1lorenz1x*(connected1lorenz1ρ-connected1lorenz1z)-connected1lorenz1y,
122-
0 ~ connected1lorenz1x + connected1lorenz1y + connected1lorenz1β*connected1lorenz1z,
123-
D(connected1lorenz2x) ~ connected1lorenz2σ*(connected1lorenz2y-connected1lorenz2x),
124-
D(connected1lorenz2y) ~ connected1lorenz2x*(connected1lorenz2ρ-connected1lorenz2z)-connected1lorenz2y,
125-
0 ~ connected1lorenz2x + connected1lorenz2y + connected1lorenz2β*connected1lorenz2z,
126-
D(connected2a) ~ connected2a*connected2lorenz1x,
127-
D(connected2lorenz1x) ~ connected2lorenz1σ*(connected2lorenz1y-connected2lorenz1x),
128-
D(connected2lorenz1y) ~ connected2lorenz1x*(connected2lorenz1ρ-connected2lorenz1z)-connected2lorenz1y,
129-
0 ~ connected2lorenz1x + connected2lorenz1y + connected2lorenz1β*connected2lorenz1z,
130-
D(connected2lorenz2x) ~ connected2lorenz2σ*(connected2lorenz2y-connected2lorenz2x),
131-
D(connected2lorenz2y) ~ connected2lorenz2x*(connected2lorenz2ρ-connected2lorenz2z)-connected2lorenz2y,
132-
0 ~ connected2lorenz2x + connected2lorenz2y + connected2lorenz2β*connected2lorenz2z]
110+
:connected1α,:connected1lorenz1σ,:connected1lorenz1ρ,:connected1lorenz1β,:connected1lorenz2σ,:connected1lorenz2ρ,:connected1lorenz2β,
111+
:connected2α,:connected2lorenz1σ,:connected2lorenz1ρ,:connected2lorenz1β,:connected2lorenz2σ,:connected2lorenz2ρ,:connected2lorenz2β]
112+
113+
@variables connected1a(t) connected1lorenz1x(t) connected1lorenz1y(t) connected1lorenz1z(t) connected1lorenz2x(t) connected1lorenz2y(t) connected1lorenz2z(t)
114+
@variables connected2a(t) connected2lorenz1x(t) connected2lorenz1y(t) connected2lorenz1z(t) connected2lorenz2x(t) connected2lorenz2y(t) connected2lorenz2z(t)
115+
@parameters connected1α connected1lorenz1σ connected1lorenz1ρ connected1lorenz1β connected1lorenz2σ connected1lorenz2ρ connected1lorenz2β
116+
@parameters connected2α connected2lorenz1σ connected2lorenz1ρ connected2lorenz1β connected2lorenz2σ connected2lorenz2ρ connected2lorenz2β
117+
118+
eqs_flat2 = [D(g) ~ g*connected1lorenz1x,
119+
D(connected1a) ~ connected1a*connected1lorenz1x,
120+
D(connected1lorenz1x) ~ connected1lorenz1σ*(connected1lorenz1y-connected1lorenz1x),
121+
D(connected1lorenz1y) ~ connected1lorenz1x*(connected1lorenz1ρ-connected1lorenz1z)-connected1lorenz1y,
122+
0 ~ connected1lorenz1x + connected1lorenz1y + connected1lorenz1β*connected1lorenz1z,
123+
D(connected1lorenz2x) ~ connected1lorenz2σ*(connected1lorenz2y-connected1lorenz2x),
124+
D(connected1lorenz2y) ~ connected1lorenz2x*(connected1lorenz2ρ-connected1lorenz2z)-connected1lorenz2y,
125+
0 ~ connected1lorenz2x + connected1lorenz2y + connected1lorenz2β*connected1lorenz2z,
126+
D(connected2a) ~ connected2a*connected2lorenz1x,
127+
D(connected2lorenz1x) ~ connected2lorenz1σ*(connected2lorenz1y-connected2lorenz1x),
128+
D(connected2lorenz1y) ~ connected2lorenz1x*(connected2lorenz1ρ-connected2lorenz1z)-connected2lorenz1y,
129+
0 ~ connected2lorenz1x + connected2lorenz1y + connected2lorenz1β*connected2lorenz1z,
130+
D(connected2lorenz2x) ~ connected2lorenz2σ*(connected2lorenz2y-connected2lorenz2x),
131+
D(connected2lorenz2y) ~ connected2lorenz2x*(connected2lorenz2ρ-connected2lorenz2z)-connected2lorenz2y,
132+
0 ~ connected2lorenz2x + connected2lorenz2y + connected2lorenz2β*connected2lorenz2z]
133133

134134
@test eqs_flat2 == equations(doublelevel)
135135

@@ -140,11 +140,11 @@ M[12,12] = false
140140
M[15,15] = false
141141
@test calculate_massmatrix(doublelevel) == M
142142

143-
jac = [connected1lorenz1x 0 g zeros(1,12)
143+
jac = [connected1lorenz1x 0 g zeros(1,12)
144144
zeros(7,1) calculate_jacobian(connected1) zeros(Expression,7,7)
145145
zeros(Expression,7,8) calculate_jacobian(connected2)]
146146

147-
jac2 = [connected1lorenz1x 0 g zeros(1,12)
147+
jac2 = [connected1lorenz1x 0 g zeros(1,12)
148148
zeros(7,1) ModelingToolkit.namespace_operation.(calculate_jacobian(connected1),connected1.name,:t) zeros(Expression,7,7)
149149
zeros(Expression,7,8) ModelingToolkit.namespace_operation.(calculate_jacobian(connected2),connected2.name,:t)]
150150

test/odesystem.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,25 +123,25 @@ end
123123
# Conversion to first-order ODEs #17
124124
@derivatives D3'''~t
125125
@derivatives D2''~t
126-
@variables u(t) u_tt(t) u_t(t) x_t(t)
126+
@variables u(t) uˍtt(t) uˍt(t) xˍt(t)
127127
eqs = [D3(u) ~ 2(D2(u)) + D(u) + D(x) + 1
128128
D2(x) ~ D(x) + 2]
129129
de = ODESystem(eqs)
130130
de1 = ode_order_lowering(de)
131-
lowered_eqs = [D(u_tt) ~ 2u_tt + u_t + x_t + 1
132-
D(x_t) ~ x_t + 2
133-
D(u_t) ~ u_tt
134-
D(u) ~ u_t
135-
D(x) ~ x_t]
131+
lowered_eqs = [D(uˍtt) ~ 2uˍtt + uˍt + xˍt + 1
132+
D(xˍt) ~ xˍt + 2
133+
D(uˍt) ~ uˍtt
134+
D(u) ~ uˍt
135+
D(x) ~ xˍt]
136136

137137
@test de1 == ODESystem(lowered_eqs)
138138

139139
# issue #219
140140
@test de1.states == [ModelingToolkit.var_from_nested_derivative(eq.lhs)[1] for eq in de1.eqs] == ODESystem(lowered_eqs).states
141141

142-
test_diffeq_inference("first-order transform", de1, t, [u_tt, x_t, u_t, u, x], [])
142+
test_diffeq_inference("first-order transform", de1, t, [uˍtt, xˍt, uˍt, u, x], [])
143143
du = zeros(5)
144-
ODEFunction(de1, [u_tt, x_t, u_t, u, x], [])(du, ones(5), nothing, 0.1)
144+
ODEFunction(de1, [uˍtt, xˍt, uˍt, u, x], [])(du, ones(5), nothing, 0.1)
145145
@test du == [5.0, 3.0, 1.0, 1.0, 1.0]
146146

147147
# Internal calculations

0 commit comments

Comments
 (0)