Skip to content

Commit 64086d1

Browse files
Remove mutability from equations
1 parent 7f8896d commit 64086d1

File tree

3 files changed

+21
-33
lines changed

3 files changed

+21
-33
lines changed

src/equations.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export Equation
22

33

4-
mutable struct Equation
4+
struct Equation
55
lhs::Expression
66
rhs::Expression
77
end

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ using Base: RefValue
33

44
isintermediate(eq::Equation) = !(isa(eq.lhs, Operation) && isa(eq.lhs.op, Differential))
55

6-
mutable struct DiffEq # D(x) = t
6+
struct DiffEq # D(x) = t
77
D::Differential # D
88
var::Variable # x
99
rhs::Expression # t

src/systems/diffeqs/first_order_transform.jl

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,60 +10,48 @@ function lower_varname(var::Variable, idv, order::Int)
1010
return Variable(name, var.subtype, var.dependents)
1111
end
1212

13-
function ode_order_lowering(sys::DiffEqSystem; kwargs...)
14-
eqs = sys.eqs
15-
eqs_lowered = ode_order_lowering(eqs; kwargs...)
13+
function ode_order_lowering(sys::DiffEqSystem)
14+
eqs_lowered = ode_order_lowering(sys.eqs, sys.iv)
1615
DiffEqSystem(eqs_lowered, sys.iv)
1716
end
18-
ode_order_lowering(eqs) = ode_order_lowering!(deepcopy(eqs))
19-
function ode_order_lowering!(eqs)
20-
idv = extract_idv(eqs[1])
21-
D = Differential(idv, 1)
17+
function ode_order_lowering(eqs, iv)
18+
D = Differential(iv, 1)
2219
var_order = Dict{Variable,Int}()
2320
vars = Variable[]
24-
dv_name = eqs[1].var.subtype
21+
new_eqs = similar(eqs, DiffEq)
2522

26-
for eq in eqs
23+
for (i, eq) enumerate(eqs)
2724
var, maxorder = extract_var_order(eq)
2825
maxorder == 1 && continue # fast pass
2926
if maxorder > get(var_order, var, 0)
3027
var_order[var] = maxorder
3128
var vars || push!(vars, var)
3229
end
33-
lhs_renaming!(eq, D)
34-
rhs_renaming!(eq)
30+
eq = lhs_renaming(eq, D)
31+
eq = rhs_renaming(eq)
32+
new_eqs[i] = eq
3533
end
3634

3735
for var vars
3836
order = var_order[var]
3937
for o in (order-1):-1:1
40-
lvar = lower_varname(var, idv, o-1)
41-
rhs = lower_varname(var, idv, o)
38+
lvar = lower_varname(var, iv, o-1)
39+
rhs = lower_varname(var, iv, o)
4240
eq = DiffEq(D, lvar, rhs)
43-
push!(eqs, eq)
41+
push!(new_eqs, eq)
4442
end
4543
end
4644

47-
return eqs
45+
return new_eqs
4846
end
4947

50-
function lhs_renaming!(eq::DiffEq, D)
51-
eq.var = lower_varname(eq.D, eq.var, lower=true)
52-
eq.D = D
53-
return eq
54-
end
55-
rhs_renaming!(eq::DiffEq) = _rec_renaming!(eq.rhs)
48+
lhs_renaming(eq::DiffEq, D) = DiffEq(D, lower_varname(eq.D, eq.var, lower=true), eq.rhs)
49+
rhs_renaming(eq::DiffEq) = DiffEq(eq.D, eq.var, _rec_renaming(eq.rhs))
5650

57-
function _rec_renaming!(rhs)
58-
isa(rhs, Operation) && isa(rhs.op, Differential) &&
59-
return lower_varname(rhs.op, rhs.args[1])
60-
if rhs isa Operation
61-
args = rhs.args
62-
for i in eachindex(args)
63-
args[i] = _rec_renaming!(args[i])
64-
end
65-
end
66-
rhs
51+
function _rec_renaming(rhs)
52+
isa(rhs, Operation) || return rhs
53+
isa(rhs.op, Differential) && return lower_varname(rhs.op, rhs.args[1])
54+
return Operation(rhs.op, _rec_renaming.(rhs.args))
6755
end
6856

6957
extract_var_order(eq::DiffEq) = (eq.var, eq.D.order)

0 commit comments

Comments
 (0)