@@ -118,6 +118,7 @@ Generate a function to evaluate the system's equations.
118118function generate_function end
119119
120120function Base. getproperty (sys:: AbstractSystem , name:: Symbol )
121+
121122 if name ∈ fieldnames (typeof (sys))
122123 return getfield (sys,name)
123124 elseif ! isempty (sys. systems)
@@ -126,6 +127,7 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
126127 return rename (sys. systems[i],renamespace (sys. name,name))
127128 end
128129 end
130+
129131 i = findfirst (x-> x. name== name,sys. states)
130132 if i != = nothing
131133 x = rename (sys. states[i],renamespace (sys. name,name))
@@ -135,12 +137,21 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
135137 return x ()
136138 end
137139 end
140+
138141 if :ps ∈ fieldnames (typeof (sys))
139142 i = findfirst (x-> x. name== name,sys. ps)
140143 if i != = nothing
141144 return rename (sys. ps[i],renamespace (sys. name,name))()
142145 end
143146 end
147+
148+ if :observed ∈ fieldnames (typeof (sys))
149+ i = findfirst (x-> convert (Variable,x. lhs). name== name,sys. observed)
150+ if i != = nothing
151+ return rename (convert (Variable,sys. observed[i]. lhs),renamespace (sys. name,name))(getfield (sys,:iv )())
152+ end
153+ end
154+
144155 throw (error (" Variable $name does not exist" ))
145156end
146157
@@ -154,8 +165,13 @@ function namespace_parameters(sys::AbstractSystem)
154165 [rename (x,renamespace (sys. name,x. name)) for x in parameters (sys)]
155166end
156167
168+ function namespace_pins (sys:: AbstractSystem )
169+ [rename (x,renamespace (sys. name,x. name)) for x in pins (sys)]
170+ end
171+
157172namespace_equations (sys:: AbstractSystem ) = namespace_equation .(equations (sys),sys. name,sys. iv. name)
158173
174+
159175function namespace_equation (eq:: Equation ,name,ivname)
160176 _lhs = namespace_operation (eq. lhs,name,ivname)
161177 _rhs = namespace_operation (eq. rhs,name,ivname)
@@ -172,11 +188,14 @@ end
172188namespace_operation (O:: Constant ,name,ivname) = O
173189
174190independent_variable (sys:: AbstractSystem ) = sys. iv
175- states (sys:: AbstractSystem ) = isempty (sys. systems) ? sys. states : [sys. states;reduce (vcat,namespace_variables .(sys. systems))]
191+ states (sys:: AbstractSystem ) = isempty (sys. systems) ? setdiff ( sys. states, convert .(Variable,sys . pins)) : [sys. states;reduce (vcat,namespace_variables .(sys. systems))]
176192parameters (sys:: AbstractSystem ) = isempty (sys. systems) ? sys. ps : [sys. ps;reduce (vcat,namespace_parameters .(sys. systems))]
177-
178- function equations (sys:: AbstractSystem )
179- isempty (sys. systems) ? sys. eqs : [sys. eqs;reduce (vcat,namespace_equations .(sys. systems))]
193+ pins (sys:: AbstractSystem ) = isempty (sys. systems) ? sys. pins : [sys. pins;reduce (vcat,namespace_pins .(sys. systems))]
194+ function observed (sys:: AbstractSystem )
195+ [sys. observed;
196+ reduce (vcat,
197+ (namespace_equation .(s. observed, s. name, s. iv. name) for s in sys. systems),
198+ init= Equation[])]
180199end
181200
182201function states (sys:: AbstractSystem ,name:: Symbol )
@@ -189,6 +208,34 @@ function parameters(sys::AbstractSystem,name::Symbol)
189208 rename (x,renamespace (sys. name,x. name))()
190209end
191210
211+ function pins (sys:: AbstractSystem ,name:: Symbol )
212+ x = sys. pins[findfirst (x-> x. name== name,sys. ps)]
213+ rename (x,renamespace (sys. name,x. name))(sys. iv ())
214+ end
215+
216+ lhss (xs) = map (x-> x. lhs, xs)
217+ rhss (xs) = map (x-> x. rhs, xs)
218+
219+ function equations (sys:: ModelingToolkit.AbstractSystem ; remove_aliases = true )
220+ if isempty (sys. systems)
221+ return sys. eqs
222+ else
223+ eqs = [sys. eqs;
224+ reduce (vcat,
225+ namespace_equations .(sys. systems);
226+ init= Equation[])]
227+
228+ if ! remove_aliases
229+ return eqs
230+ end
231+ aliases = observed (sys)
232+ dict = Dict (lhss (aliases) .=> rhss (aliases))
233+
234+ # Substitute aliases
235+ return Equation .(lhss (eqs), Rewriters. Fixpoint (x-> substitute (x, dict)).(rhss (eqs)))
236+ end
237+ end
238+
192239function states (sys:: AbstractSystem ,args... )
193240 name = last (args)
194241 extra_names = reduce (Symbol,[Symbol (:₊ ,x. name) for x in args[1 : end - 1 ]])
@@ -212,6 +259,13 @@ function islinear(sys::AbstractSystem)
212259 all (islinear (r, dvs) for r in rhs)
213260end
214261
262+ function pins (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+
215269struct AbstractSysToExpr
216270 sys:: AbstractSystem
217271 states:: Vector{Variable}
0 commit comments