@@ -117,6 +117,8 @@ Generate a function to evaluate the system's equations.
117
117
"""
118
118
function generate_function end
119
119
120
+ Base. nameof (sys:: AbstractSystem ) = getfield (sys, :name )
121
+
120
122
function getname (t)
121
123
if istree (t)
122
124
operation (t) isa Sym ? getname (operation (t)) : error (" Cannot get name of $t " )
@@ -125,34 +127,54 @@ function getname(t)
125
127
end
126
128
end
127
129
128
- function Base . getproperty (sys:: AbstractSystem , name :: Symbol )
130
+ independent_variable (sys:: AbstractSystem ) = getfield (sys, :iv )
129
131
130
- if name ∈ fieldnames (typeof (sys))
131
- return getfield (sys,name)
132
- elseif ! isempty (sys. systems)
133
- i = findfirst (x-> x. name== name,sys. systems)
132
+ function structure (sys:: AbstractSystem )
133
+ s = get_structure (sys)
134
+ s isa SystemStructure || throw (ArgumentError (" SystemStructure is not yet initialized, please run `sys = initialize_system_structure(sys)` or `sys = alias_elimination(sys)`." ))
135
+ return s
136
+ end
137
+
138
+ for prop in [:eqs , :iv , :states , :ps , :default_p , :default_u0 , :observed , :tgrad , :jac , :Wfact , :Wfact_t , :systems , :structure ]
139
+ fname = Symbol (:get_ , prop)
140
+ @eval begin
141
+ $ fname (sys:: AbstractSystem ) = getfield (sys, $ (QuoteNode (prop)))
142
+ end
143
+ end
144
+
145
+ function Base. getproperty (sys:: AbstractSystem , name:: Symbol )
146
+ sysname = nameof (sys)
147
+ systems = get_systems (sys)
148
+ if isdefined (sys, name)
149
+ Base. depwarn (" `sys.name` like `sys.$name ` is deprecated. Use getters like `get_$name ` instead." , " sys.$name " )
150
+ return getfield (sys, name)
151
+ elseif ! isempty (systems)
152
+ i = findfirst (x-> nameof (x)== name,systems)
134
153
if i != = nothing
135
- return rename (sys . systems[i],renamespace (sys . name ,name))
154
+ return rename (systems[i],renamespace (sysname ,name))
136
155
end
137
156
end
138
157
139
- i = findfirst (x-> getname (x) == name, sys. states)
158
+ sts = get_states (sys)
159
+ i = findfirst (x-> getname (x) == name, sts)
140
160
141
161
if i != = nothing
142
- return rename (sys . states [i],renamespace (sys . name ,name))
162
+ return rename (sts [i],renamespace (sysname ,name))
143
163
end
144
164
145
- if :ps ∈ fieldnames (typeof (sys))
146
- i = findfirst (x-> getname (x) == name,sys. ps)
165
+ if isdefined (sys, :ps )
166
+ ps = get_ps (sys)
167
+ i = findfirst (x-> getname (x) == name,ps)
147
168
if i != = nothing
148
- return rename (sys . ps[i],renamespace (sys . name ,name))
169
+ return rename (ps[i],renamespace (sysname ,name))
149
170
end
150
171
end
151
172
152
- if :observed ∈ fieldnames (typeof (sys))
153
- i = findfirst (x-> getname (x. lhs)== name,sys. observed)
173
+ if isdefined (sys, :observed )
174
+ obs = get_observed (sys)
175
+ i = findfirst (x-> getname (x. lhs)== name,obs)
154
176
if i != = nothing
155
- return rename (sys . observed [i]. lhs,renamespace (sys . name ,name))
177
+ return rename (obs [i]. lhs,renamespace (sysname ,name))
156
178
end
157
179
end
158
180
@@ -171,75 +193,89 @@ function renamespace(namespace, x)
171
193
end
172
194
end
173
195
174
- function namespace_variables (sys:: AbstractSystem )
175
- [renamespace (sys. name,x) for x in states (sys)]
176
- end
196
+ namespace_variables (sys:: AbstractSystem ) = states (sys, states (sys))
197
+ namespace_parameters (sys:: AbstractSystem ) = parameters (sys, parameters (sys))
177
198
178
- function namespace_parameters (sys:: AbstractSystem )
179
- [toparam (renamespace (sys. name,x)) for x in parameters (sys)]
199
+ function namespace_default_u0 (sys)
200
+ d_u0 = default_u0 (sys)
201
+ Dict (states (sys, k) => d_u0[k] for k in keys (d_u0))
180
202
end
181
203
182
- function namespace_pins (sys:: AbstractSystem )
183
- [renamespace (sys. name,x) for x in pins (sys)]
204
+ function namespace_default_p (sys)
205
+ d_p = default_p (sys)
206
+ Dict (parameters (sys, k) => d_p[k] for k in keys (d_p))
184
207
end
185
208
186
209
function namespace_equations (sys:: AbstractSystem )
187
210
eqs = equations (sys)
188
211
isempty (eqs) && return Equation[]
189
- map (eq-> namespace_equation (eq,sys. name,sys. iv. name), eqs)
212
+ iv = independent_variable (sys)
213
+ map (eq-> namespace_equation (eq,nameof (sys),iv), eqs)
190
214
end
191
215
192
- function namespace_equation (eq:: Equation ,name,ivname )
193
- _lhs = namespace_expr (eq. lhs,name,ivname )
194
- _rhs = namespace_expr (eq. rhs,name,ivname )
216
+ function namespace_equation (eq:: Equation ,name,iv )
217
+ _lhs = namespace_expr (eq. lhs,name,iv )
218
+ _rhs = namespace_expr (eq. rhs,name,iv )
195
219
_lhs ~ _rhs
196
220
end
197
221
198
- function namespace_expr (O:: Sym ,name,ivname )
199
- O . name == ivname ? O : rename (O,renamespace (name,O . name ))
222
+ function namespace_expr (O:: Sym ,name,iv )
223
+ isequal (O, iv) ? O : rename (O,renamespace (name,nameof (O) ))
200
224
end
201
225
202
226
_symparam (s:: Symbolic{T} ) where {T} = T
203
- function namespace_expr (O,name,ivname ) where {T}
227
+ function namespace_expr (O,name,iv ) where {T}
204
228
if istree (O)
229
+ renamed = map (a-> namespace_expr (a,name,iv), arguments (O))
205
230
if operation (O) isa Sym
206
- Term {_symparam(O)} (rename (operation (O),renamespace (name,operation (O). name)),namespace_expr .(arguments (O),name,ivname))
231
+ renamed_op = rename (operation (O),renamespace (name,nameof (operation (O))))
232
+ Term {_symparam(O)} (renamed_op,renamed)
207
233
else
208
- similarterm (O,operation (O),namespace_expr .( arguments (O),name,ivname) )
234
+ similarterm (O,operation (O),renamed )
209
235
end
210
236
else
211
237
O
212
238
end
213
239
end
214
240
215
- independent_variable (sys:: AbstractSystem ) = sys. iv
216
241
function states (sys:: AbstractSystem )
217
- unique (isempty (sys. systems) ?
218
- sys. states :
219
- [sys. states;reduce (vcat,namespace_variables .(sys. systems))])
242
+ sts = get_states (sys)
243
+ systems = get_systems (sys)
244
+ unique (isempty (systems) ?
245
+ sts :
246
+ [sts;reduce (vcat,namespace_variables .(systems))])
247
+ end
248
+ function parameters (sys:: AbstractSystem )
249
+ ps = get_ps (sys)
250
+ systems = get_systems (sys)
251
+ isempty (systems) ? ps : [ps;reduce (vcat,namespace_parameters .(systems))]
220
252
end
221
- parameters (sys:: AbstractSystem ) = isempty (sys. systems) ? sys. ps : [sys. ps;reduce (vcat,namespace_parameters .(sys. systems))]
222
- pins (sys:: AbstractSystem ) = isempty (sys. systems) ? sys. pins : [sys. pins;reduce (vcat,namespace_pins .(sys. systems))]
223
253
function observed (sys:: AbstractSystem )
224
- [sys. observed;
254
+ iv = independent_variable (sys)
255
+ obs = get_observed (sys)
256
+ systems = get_systems (sys)
257
+ [obs;
225
258
reduce (vcat,
226
- (namespace_equation .( observed (s), s . name, s . iv . name) for s in sys . systems),
259
+ (map (o -> namespace_equation (o, nameof (s), iv), observed (s)) for s in systems),
227
260
init= Equation[])]
228
261
end
229
262
230
- function states (sys:: AbstractSystem ,name:: Symbol )
231
- x = sys. states[findfirst (x-> x. name== name,sys. states)]
232
- rename (x,renamespace (sys. name,x. name))(sys. iv)
263
+ function default_u0 (sys:: AbstractSystem )
264
+ systems = get_systems (sys)
265
+ d_u0 = get_default_u0 (sys)
266
+ isempty (systems) ? d_u0 : mapreduce (namespace_default_u0, merge, systems; init= d_u0)
233
267
end
234
268
235
- function parameters (sys:: AbstractSystem ,name:: Symbol )
236
- x = sys. ps[findfirst (x-> x. name== name,sys. ps)]
237
- rename (x,renamespace (sys. name,x. name))()
269
+ function default_p (sys:: AbstractSystem )
270
+ systems = get_systems (sys)
271
+ d_p = get_default_p (sys)
272
+ isempty (systems) ? d_p : mapreduce (namespace_default_p, merge, systems; init= d_p)
238
273
end
239
274
240
- function pins (sys:: AbstractSystem ,name:: Symbol )
241
- x = sys. pins[findfirst (x-> x. name== name,sys. ps)]
242
- rename (x,renamespace (sys. name,x. name))(sys. iv ())
275
+ states (sys:: AbstractSystem , v) = renamespace (nameof (sys), v)
276
+ parameters (sys:: AbstractSystem , v) = toparam (states (sys, v))
277
+ for f in [:states , :parameters ]
278
+ @eval $ f (sys:: AbstractSystem , vs:: AbstractArray ) = map (v-> $ f (sys, v), vs)
243
279
end
244
280
245
281
lhss (xs) = map (x-> x. lhs, xs)
@@ -248,57 +284,35 @@ rhss(xs) = map(x->x.rhs, xs)
248
284
flatten (sys:: AbstractSystem ) = sys
249
285
250
286
function equations (sys:: ModelingToolkit.AbstractSystem )
251
- if isempty (sys. systems)
252
- return sys. eqs
287
+ eqs = get_eqs (sys)
288
+ systems = get_systems (sys)
289
+ if isempty (systems)
290
+ return eqs
253
291
else
254
- eqs = Equation[sys . eqs;
292
+ eqs = Equation[eqs;
255
293
reduce (vcat,
256
- namespace_equations .(sys. systems );
294
+ namespace_equations .(get_systems ( sys) );
257
295
init= Equation[])]
258
296
return eqs
259
297
end
260
298
end
261
299
262
- function states (sys:: AbstractSystem ,args... )
263
- name = last (args)
264
- extra_names = reduce (Symbol,[Symbol (:₊ ,x. name) for x in args[1 : end - 1 ]])
265
- newname = renamespace (extra_names,name)
266
- rename (x,renamespace (sys. name,newname))(sys. iv)
267
- end
268
-
269
- function parameters (sys:: AbstractSystem ,args... )
270
- name = last (args)
271
- extra_names = reduce (Symbol,[Symbol (:₊ ,x. name) for x in args[1 : end - 1 ]])
272
- newname = renamespace (extra_names,name)
273
- rename (x,renamespace (sys. name,newname))()
274
- end
275
-
276
300
function islinear (sys:: AbstractSystem )
277
301
rhs = [eq. rhs for eq ∈ equations (sys)]
278
302
279
303
all (islinear (r, states (sys)) for r in rhs)
280
304
end
281
305
282
- function pins (sys:: AbstractSystem ,args... )
283
- name = last (args)
284
- extra_names = reduce (Symbol,[Symbol (:₊ ,x. name) for x in args[1 : end - 1 ]])
285
- newname = renamespace (extra_names,name)
286
- rename (x,renamespace (sys. name,newname))(sys. iv ())
287
- end
288
-
289
306
struct AbstractSysToExpr
290
307
sys:: AbstractSystem
291
308
states:: Vector
292
309
end
293
310
AbstractSysToExpr (sys) = AbstractSysToExpr (sys,states (sys))
294
311
function (f:: AbstractSysToExpr )(O)
295
312
! istree (O) && return toexpr (O)
296
- any (isequal (O), f. states) && return operation (O). name # variables
313
+ any (isequal (O), f. states) && return nameof ( operation (O)) # variables
297
314
if isa (operation (O), Sym)
298
- return build_expr (:call , Any[operation (O). name ; f .(arguments (O))])
315
+ return build_expr (:call , Any[nameof ( operation (O)) ; f .(arguments (O))])
299
316
end
300
317
return build_expr (:call , Any[operation (O); f .(arguments (O))])
301
318
end
302
-
303
- get_default_p (sys) = sys. default_p
304
- get_default_u0 (sys) = sys. default_u0
0 commit comments