@@ -79,7 +79,15 @@ function initialize_system_structure(sys)
79
79
var2idx = Dict {Any,Int} ()
80
80
symbolic_incidence = []
81
81
fullvars = []
82
- var_counter = 0
82
+ var_counter = Ref (0 )
83
+ addvar! = let fullvars= fullvars, var_counter= var_counter
84
+ var -> begin
85
+ get! (var2idx, var) do
86
+ push! (fullvars, var)
87
+ var_counter[] += 1
88
+ end
89
+ end
90
+ end
83
91
84
92
for (i, eq) in enumerate (eqs)
85
93
vars = OrderedSet ()
@@ -91,19 +99,16 @@ function initialize_system_structure(sys)
91
99
if isparameter (var) || (istree (var) && isparameter (operation (var)))
92
100
continue
93
101
end
102
+ varidx = addvar! (var)
94
103
push! (statevars, var)
95
- varidx = get! (var2idx, var) do
96
- push! (fullvars, var)
97
- var_counter += 1
98
- end
99
104
100
- if isdifferential (var)
105
+ dvar = var
106
+ idx = varidx
107
+ while isdifferential (dvar)
108
+ push! (dervaridxs, idx)
101
109
isalgeq = false
102
- diffvar = arguments (var)[1 ]
103
- if diffvar isa Differential
104
- throw (InvalidSystemException (" The equation [ $eq ] is not first order" ))
105
- end
106
- push! (dervaridxs, varidx)
110
+ dvar = arguments (dvar)[1 ]
111
+ idx = addvar! (dvar)
107
112
end
108
113
end
109
114
push! (symbolic_incidence, copy (statevars))
@@ -123,12 +128,10 @@ function initialize_system_structure(sys)
123
128
vartype[dervaridx] = DERIVATIVE_VARIABLE
124
129
dervar = fullvars[dervaridx]
125
130
diffvar = arguments (dervar)[1 ]
126
- diffvaridx = get (var2idx, diffvar, 0 )
127
- if diffvaridx != 0
128
- push! (diffvars, diffvar)
129
- varassoc[diffvaridx] = dervaridx
130
- inv_varassoc[dervaridx] = diffvaridx
131
- end
131
+ diffvaridx = var2idx[diffvar]
132
+ push! (diffvars, diffvar)
133
+ varassoc[diffvaridx] = dervaridx
134
+ inv_varassoc[dervaridx] = diffvaridx
132
135
end
133
136
134
137
algvars = setdiff (states (sys), diffvars)
0 commit comments