|
26 | 26 | function (f::ODEToExpr)(O::Operation) |
27 | 27 | if isa(O.op, Variable) |
28 | 28 | isequal(O.op, f.sys.iv) && return O.op.name # independent variable |
29 | | - O.op ∈ f.sys.dvs && return O.op.name # dependent variables |
| 29 | + O.op ∈ f.sys.states && return O.op.name # dependent variables |
30 | 30 | isempty(O.args) && return O.op.name # 0-ary parameters |
31 | 31 | return build_expr(:call, Any[O.op.name; f.(O.args)]) |
32 | 32 | end |
|
46 | 46 |
|
47 | 47 | function generate_function(sys::AbstractODESystem, dvs = states(sys), ps = parameters(sys), expression = Val{true}; kwargs...) |
48 | 48 | rhss = [deq.rhs for deq ∈ equations(sys)] |
49 | | - dvs′ = [clean(dv) for dv ∈ dvs] |
50 | | - ps′ = [clean(p) for p ∈ ps] |
| 49 | + dvs′ = convert.(Variable,dvs) |
| 50 | + ps′ = convert.(Variable,ps) |
51 | 51 | return build_function(rhss, dvs′, ps′, (sys.iv.name,), ODEToExpr(sys), expression; kwargs...) |
52 | 52 | end |
53 | 53 |
|
@@ -107,82 +107,10 @@ function calculate_massmatrix(sys::AbstractODESystem, simplify=true) |
107 | 107 | M == I ? I : M |
108 | 108 | end |
109 | 109 |
|
110 | | -renamespace(namespace,name) = Symbol(string(namespace)*"′"*string(name)) |
111 | | - |
112 | 110 | function DiffEqBase.ODEFunction(sys::AbstractODESystem, args...; kwargs...) |
113 | 111 | ODEFunction{true}(sys, args...; kwargs...) |
114 | 112 | end |
115 | 113 |
|
116 | | -function namespace_variables(sys::AbstractODESystem) |
117 | | - [rename(x,renamespace(sys.name,x.name)) for x in states(sys)] |
118 | | -end |
119 | | - |
120 | | -function namespace_parameters(sys::AbstractODESystem) |
121 | | - [rename(x,renamespace(sys.name,x.name)) for x in parameters(sys)] |
122 | | -end |
123 | | - |
124 | | -namespace_equations(sys::AbstractODESystem) = namespace_equation.(equations(sys),sys.name,sys.iv.name) |
125 | | - |
126 | | -function namespace_equation(eq::Equation,name,ivname) |
127 | | - _lhs = namespace_operation(eq.lhs,name,ivname) |
128 | | - _rhs = namespace_operation(eq.rhs,name,ivname) |
129 | | - _lhs ~ _rhs |
130 | | -end |
131 | | - |
132 | | -function namespace_operation(O::Operation,name,ivname) |
133 | | - if O.op isa Variable && O.op.name != ivname |
134 | | - Operation(rename(O.op,renamespace(name,O.op.name)),namespace_operation.(O.args,name,ivname)) |
135 | | - else |
136 | | - Operation(O.op,namespace_operation.(O.args,name,ivname)) |
137 | | - end |
138 | | -end |
139 | | -namespace_operation(O::Constant,name,ivname) = O |
140 | | - |
141 | | - |
142 | | - |
143 | | -independent_variable(sys::AbstractODESystem) = sys.iv |
144 | | -states(sys::AbstractODESystem) = isempty(sys.systems) ? sys.dvs : [sys.dvs;reduce(vcat,namespace_variables.(sys.systems))] |
145 | | -parameters(sys::AbstractODESystem) = isempty(sys.systems) ? sys.ps : [sys.ps;reduce(vcat,namespace_parameters.(sys.systems))] |
146 | | - |
147 | | -function equations(sys::AbstractODESystem) |
148 | | - isempty(sys.systems) ? sys.eqs : [sys.eqs;reduce(vcat,namespace_equations.(sys.systems))] |
149 | | -end |
150 | | - |
151 | | -function states(sys::AbstractODESystem,name::Symbol) |
152 | | - x = sys.dvs[findfirst(x->x.name==name,sys.dvs)] |
153 | | - Variable(Symbol(string(sys.name)*"′"*string(x.name)))(sys.iv()) |
154 | | -end |
155 | | - |
156 | | -function parameters(sys::AbstractODESystem,name::Symbol) |
157 | | - x = sys.ps[findfirst(x->x.name==name,sys.ps)] |
158 | | - Variable(Symbol(string(sys.name)*"′"*string(x.name)))(sys.iv()) |
159 | | -end |
160 | | - |
161 | | -function states(sys::AbstractODESystem,args...) |
162 | | - name = last(args) |
163 | | - extra_names = reduce(*,["′$(x.name)" for x in args[1:end-1]]) |
164 | | - Variable(Symbol(string(sys.name)*extra_names*"′"*string(name)))(sys.iv()) |
165 | | -end |
166 | | - |
167 | | -function parameters(sys::AbstractODESystem,args...) |
168 | | - name = last(args) |
169 | | - extra_names = reduce(*,["′$(x.name)" for x in args[1:end-1]]) |
170 | | - Variable(Symbol(string(sys.name)*extra_names*"′"*string(name)))(sys.iv()) |
171 | | -end |
172 | | - |
173 | | -function _eq_unordered(a, b) |
174 | | - length(a) === length(b) || return false |
175 | | - n = length(a) |
176 | | - idxs = Set(1:n) |
177 | | - for x ∈ a |
178 | | - idx = findfirst(isequal(x), b) |
179 | | - idx === nothing && return false |
180 | | - idx ∈ idxs || return false |
181 | | - delete!(idxs, idx) |
182 | | - end |
183 | | - return true |
184 | | -end |
185 | | - |
186 | 114 | """ |
187 | 115 | $(SIGNATURES) |
188 | 116 |
|
@@ -234,25 +162,5 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys), |
234 | 162 | Wfact = _Wfact, |
235 | 163 | Wfact_t = _Wfact_t, |
236 | 164 | mass_matrix = M, |
237 | | - syms = Symbol.(sys.dvs)) |
238 | | -end |
239 | | - |
240 | | -function Base.getproperty(sys::AbstractODESystem, name::Symbol) |
241 | | - if name ∈ fieldnames(typeof(sys)) |
242 | | - return getfield(sys,name) |
243 | | - elseif !isempty(sys.systems) |
244 | | - i = findfirst(x->x.name==name,sys.systems) |
245 | | - if i !== nothing |
246 | | - return rename(sys.systems[i],renamespace(sys.name,name)) |
247 | | - end |
248 | | - end |
249 | | - i = findfirst(x->x.name==name,sys.dvs) |
250 | | - if i !== nothing |
251 | | - return rename(sys.dvs[i],renamespace(sys.name,name))(getfield(sys,:iv)()) |
252 | | - end |
253 | | - i = findfirst(x->x.name==name,sys.ps) |
254 | | - if i !== nothing |
255 | | - return rename(sys.ps[i],renamespace(sys.name,name))() |
256 | | - end |
257 | | - throw(error("Variable name does not exist")) |
| 165 | + syms = Symbol.(sys.states)) |
258 | 166 | end |
0 commit comments