@@ -131,13 +131,6 @@ function generate_function end
131
131
132
132
Base. nameof (sys:: AbstractSystem ) = getfield (sys, :name )
133
133
134
- function getname (t)
135
- if istree (t)
136
- operation (t) isa Sym ? getname (operation (t)) : error (" Cannot get name of $t " )
137
- else
138
- nameof (t)
139
- end
140
- end
141
134
# Deprecated
142
135
function independent_variable (sys:: AbstractSystem )
143
136
Base. depwarn (" `independent_variable` is deprecated. Use `get_iv` or `independent_variables` instead." ,:independent_variable )
@@ -193,6 +186,7 @@ for prop in [
193
186
:depvars
194
187
:indvars
195
188
:connection_type
189
+ :preface
196
190
]
197
191
fname1 = Symbol (:get_ , prop)
198
192
fname2 = Symbol (:has_ , prop)
@@ -248,37 +242,35 @@ function Base.propertynames(sys::AbstractSystem; private=false)
248
242
end
249
243
end
250
244
251
- Base. getproperty (sys:: AbstractSystem , name:: Symbol ; namespace= true ) = getvar (sys, name; namespace= namespace)
245
+ Base. getproperty (sys:: AbstractSystem , name:: Symbol ; namespace= true ) = wrap ( getvar (sys, name; namespace= namespace) )
252
246
function getvar (sys:: AbstractSystem , name:: Symbol ; namespace= false )
253
- sysname = nameof (sys)
254
247
systems = get_systems (sys)
255
248
if isdefined (sys, name)
256
249
Base. depwarn (" `sys.name` like `sys.$name ` is deprecated. Use getters like `get_$name ` instead." , " sys.$name " )
257
250
return getfield (sys, name)
258
251
elseif ! isempty (systems)
259
252
i = findfirst (x-> nameof (x)== name, systems)
260
253
if i != = nothing
261
- return namespace ? rename (systems[i], renamespace (sysname , name)) : systems[i]
254
+ return namespace ? rename (systems[i], renamespace (sys , name)) : systems[i]
262
255
end
263
256
end
264
257
265
258
if has_var_to_name (sys)
266
259
avs = get_var_to_name (sys)
267
260
v = get (avs, name, nothing )
268
- v === nothing || return namespace ? renamespace (sysname, v, name) : v
269
-
261
+ v === nothing || return namespace ? renamespace (sys, v) : v
270
262
else
271
263
sts = get_states (sys)
272
264
i = findfirst (x-> getname (x) == name, sts)
273
265
if i != = nothing
274
- return namespace ? renamespace (sysname, sts[i]) : sts[i]
266
+ return namespace ? renamespace (sys, sts[i]) : sts[i]
275
267
end
276
268
277
269
if has_ps (sys)
278
270
ps = get_ps (sys)
279
271
i = findfirst (x-> getname (x) == name,ps)
280
272
if i != = nothing
281
- return namespace ? renamespace (sysname, ps[i]) : ps[i]
273
+ return namespace ? renamespace (sys, ps[i]) : ps[i]
282
274
end
283
275
end
284
276
end
@@ -290,7 +282,7 @@ function getvar(sys::AbstractSystem, name::Symbol; namespace=false)
290
282
obs = get_observed (sys)
291
283
i = findfirst (x-> getname (x. lhs)== name,obs)
292
284
if i != = nothing
293
- return namespace ? renamespace (sysname, obs[i]) : obs[i]
285
+ return namespace ? renamespace (sys, obs[i]) : obs[i]
294
286
end
295
287
end
296
288
@@ -330,20 +322,39 @@ ParentScope(sym::Union{Num, Symbolic}) = setmetadata(sym, SymScope, ParentScope(
330
322
struct GlobalScope <: SymScope end
331
323
GlobalScope (sym:: Union{Num, Symbolic} ) = setmetadata (sym, SymScope, GlobalScope ())
332
324
333
- function renamespace (namespace, x, name= nothing )
325
+ renamespace (sys, eq:: Equation ) = namespace_equation (eq, sys)
326
+
327
+ function _renamespace (sys, x)
328
+ v = unwrap (x)
329
+
330
+ if istree (v) && symtype (operation (v)) <: FnType
331
+ ov = metadata (operation (v), metadata (v))
332
+ return similarterm (v, renamespace (sys, ov), arguments (v), symtype (v), metadata= metadata (v))
333
+ end
334
+
335
+ if v isa Namespace
336
+ sysp, v = v. parent, v. named
337
+ sysn = Symbol (getname (sys), :., getname (sysp))
338
+ sys = sys isa AbstractSystem ? rename (sysp, sysn) : sysn
339
+ end
340
+
341
+ Namespace (sys, v)
342
+ end
343
+
344
+ function renamespace (sys, x)
334
345
x = unwrap (x)
335
346
if x isa Symbolic
336
347
let scope = getmetadata (x, SymScope, LocalScope ())
337
348
if scope isa LocalScope
338
- rename (x, renamespace (namespace, name === nothing ? getname (x) : name) )
349
+ _renamespace (sys, x )
339
350
elseif scope isa ParentScope
340
351
setmetadata (x, SymScope, scope. parent)
341
352
else # GlobalScope
342
353
x
343
354
end
344
355
end
345
356
else
346
- Symbol (namespace, :₊ , x)
357
+ Symbol (getname (sys), :., x)
347
358
end
348
359
end
349
360
@@ -353,33 +364,38 @@ namespace_controls(sys::AbstractSystem) = controls(sys, controls(sys))
353
364
354
365
function namespace_defaults (sys)
355
366
defs = defaults (sys)
356
- Dict ((isparameter (k) ? parameters (sys, k) : states (sys, k)) => namespace_expr (defs[k], nameof ( sys), independent_variables (sys) ) for k in keys (defs))
367
+ Dict ((isparameter (k) ? parameters (sys, k) : states (sys, k)) => namespace_expr (defs[k], sys) for k in keys (defs))
357
368
end
358
369
359
370
function namespace_equations (sys:: AbstractSystem )
360
371
eqs = equations (sys)
361
372
isempty (eqs) && return Equation[]
362
- ivs = independent_variables (sys)
363
- map (eq -> namespace_equation (eq, nameof (sys), ivs), eqs)
373
+ map (eq-> namespace_equation (eq, sys), eqs)
364
374
end
365
375
366
- function namespace_equation (eq:: Equation , name, ivs )
367
- _lhs = namespace_expr (eq. lhs, name, ivs )
368
- _rhs = namespace_expr (eq. rhs, name, ivs )
376
+ function namespace_equation (eq:: Equation , sys )
377
+ _lhs = namespace_expr (eq. lhs, sys )
378
+ _rhs = namespace_expr (eq. rhs, sys )
369
379
_lhs ~ _rhs
370
380
end
371
381
372
- function namespace_expr (O:: Sym , name, ivs)
373
- any (isequal (O), ivs) ? O : renamespace (name, O)
382
+ function namespace_assignment (eq:: Assignment , sys)
383
+ _lhs = namespace_expr (eq. lhs, sys)
384
+ _rhs = namespace_expr (eq. rhs, sys)
385
+ Assignment (_lhs, _rhs)
374
386
end
375
387
376
- _symparam (s:: Symbolic{T} ) where {T} = T
377
- function namespace_expr (O, name, ivs) where {T}
378
- O = value (O)
379
- if istree (O)
380
- renamed = map (a -> namespace_expr (a, name, ivs), arguments (O))
381
- if operation (O) isa Sym
382
- renamespace (name, O)
388
+ function namespace_expr (O, sys) where {T}
389
+ ivs = independent_variables (sys)
390
+ O = unwrap (O)
391
+ if any (isequal (O), ivs)
392
+ return O
393
+ elseif isvariable (O)
394
+ renamespace (sys, O)
395
+ elseif istree (O)
396
+ renamed = map (a-> namespace_expr (a, sys), arguments (O))
397
+ if symtype (operation (O)) <: FnType
398
+ renamespace (sys, O)
383
399
else
384
400
similarterm (O, operation (O), renamed)
385
401
end
@@ -409,13 +425,12 @@ function controls(sys::AbstractSystem)
409
425
end
410
426
411
427
function observed (sys:: AbstractSystem )
412
- ivs = independent_variables (sys)
413
428
obs = get_observed (sys)
414
429
systems = get_systems (sys)
415
430
[obs;
416
431
reduce (vcat,
417
- (map (o -> namespace_equation . (o, nameof (s), ivs ), observed (s)) for s in systems),
418
- init = Equation[])]
432
+ (map (o-> namespace_equation (o, s ), observed (s)) for s in systems),
433
+ init= Equation[])]
419
434
end
420
435
421
436
Base. @deprecate default_u0 (x) defaults (x) false
@@ -426,7 +441,7 @@ function defaults(sys::AbstractSystem)
426
441
isempty (systems) ? defs : mapreduce (namespace_defaults, merge, systems; init= defs)
427
442
end
428
443
429
- states (sys:: AbstractSystem , v) = renamespace (nameof ( sys) , v)
444
+ states (sys:: AbstractSystem , v) = renamespace (sys, v)
430
445
parameters (sys:: AbstractSystem , v) = toparam (states (sys, v))
431
446
for f in [:states , :parameters ]
432
447
@eval $ f (sys:: AbstractSystem , vs:: AbstractArray ) = map (v-> $ f (sys, v), vs)
@@ -448,6 +463,25 @@ function equations(sys::ModelingToolkit.AbstractSystem)
448
463
end
449
464
end
450
465
466
+ function preface (sys:: ModelingToolkit.AbstractSystem )
467
+ has_preface (sys) || return nothing
468
+ pre = get_preface (sys)
469
+ systems = get_systems (sys)
470
+ if isempty (systems)
471
+ return pre
472
+ else
473
+ pres = pre === nothing ? [] : pre
474
+ for sys in systems
475
+ pre = get_preface (sys)
476
+ pre === nothing && continue
477
+ for eq in pre
478
+ push! (pres, namespace_assignment (eq, sys))
479
+ end
480
+ end
481
+ return isempty (pres) ? nothing : pres
482
+ end
483
+ end
484
+
451
485
function islinear (sys:: AbstractSystem )
452
486
rhs = [eq. rhs for eq ∈ equations (sys)]
453
487
@@ -913,7 +947,11 @@ function Base.hash(sys::AbstractSystem, s::UInt)
913
947
s = foldr (hash, get_systems (sys), init= s)
914
948
s = foldr (hash, get_states (sys), init= s)
915
949
s = foldr (hash, get_ps (sys), init= s)
916
- s = foldr (hash, get_eqs (sys), init= s)
950
+ if sys isa OptimizationSystem
951
+ s = hash (get_op (sys), s)
952
+ else
953
+ s = foldr (hash, get_eqs (sys), init= s)
954
+ end
917
955
s = foldr (hash, get_observed (sys), init= s)
918
956
s = hash (independent_variables (sys), s)
919
957
return s
@@ -935,7 +973,7 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol=nameo
935
973
else
936
974
throw (" Extending multivariate systems is not supported" )
937
975
end
938
-
976
+
939
977
eqs = union (equations (basesys), equations (sys))
940
978
sts = union (states (basesys), states (sys))
941
979
ps = union (parameters (basesys), parameters (sys))
0 commit comments