@@ -36,8 +36,6 @@ struct ODESystem <: AbstractODESystem
36
36
states:: Vector
37
37
""" Parameter variables. Must not contain the independent variable."""
38
38
ps:: Vector
39
- """ Symbolic constants."""
40
- cs:: Vector
41
39
""" Array variables."""
42
40
var_to_name:: Any
43
41
""" Control parameters (some subset of `ps`)."""
@@ -122,7 +120,7 @@ struct ODESystem <: AbstractODESystem
122
120
"""
123
121
metadata:: Any
124
122
125
- function ODESystem (deqs, iv, dvs, ps, cs, var_to_name, ctrls, observed, tgrad,
123
+ function ODESystem (deqs, iv, dvs, ps, var_to_name, ctrls, observed, tgrad,
126
124
jac, ctrl_jac, Wfact, Wfact_t, name, systems, defaults,
127
125
torn_matching, connector_type, connections, preface, cevents,
128
126
devents, tearing_state = nothing , substitutions = nothing ,
@@ -135,16 +133,16 @@ struct ODESystem <: AbstractODESystem
135
133
check_equations (equations (cevents), iv)
136
134
end
137
135
if checks == true || (checks & CheckUnits) > 0
138
- all_dimensionless ([dvs; ps; iv; cs ]) || check_units (deqs)
136
+ all_dimensionless ([dvs; ps; iv]) || check_units (deqs)
139
137
end
140
- new (deqs, iv, dvs, ps, cs, var_to_name, ctrls, observed, tgrad, jac,
138
+ new (deqs, iv, dvs, ps, var_to_name, ctrls, observed, tgrad, jac,
141
139
ctrl_jac, Wfact, Wfact_t, name, systems, defaults, torn_matching,
142
140
connector_type, connections, preface, cevents, devents, tearing_state,
143
141
substitutions, metadata)
144
142
end
145
143
end
146
144
147
- function ODESystem (deqs:: AbstractVector{<:Equation} , iv, dvs, ps, cs ;
145
+ function ODESystem (deqs:: AbstractVector{<:Equation} , iv, dvs, ps;
148
146
controls = Num[],
149
147
observed = Equation[],
150
148
systems = ODESystem[],
@@ -166,7 +164,6 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps, cs;
166
164
iv′ = value (scalarize (iv))
167
165
dvs′ = value .(scalarize (dvs))
168
166
ps′ = value .(scalarize (ps))
169
- cs′ = value .(scalarize (cs))
170
167
ctrl′ = value .(scalarize (controls))
171
168
172
169
if ! (isempty (default_u0) && isempty (default_p))
@@ -179,7 +176,6 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps, cs;
179
176
var_to_name = Dict ()
180
177
process_variables! (var_to_name, defaults, dvs′)
181
178
process_variables! (var_to_name, defaults, ps′)
182
- process_variables! (var_to_name, defaults, cs′)
183
179
isempty (observed) || collect_var_to_name! (var_to_name, (eq. lhs for eq in observed))
184
180
185
181
tgrad = RefValue (EMPTY_TGRAD)
@@ -193,7 +189,7 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps, cs;
193
189
end
194
190
cont_callbacks = SymbolicContinuousCallbacks (continuous_events)
195
191
disc_callbacks = SymbolicDiscreteCallbacks (discrete_events)
196
- ODESystem (deqs, iv′, dvs′, ps′, cs′, var_to_name, ctrl′, observed, tgrad, jac,
192
+ ODESystem (deqs, iv′, dvs′, ps′, var_to_name, ctrl′, observed, tgrad, jac,
197
193
ctrl_jac, Wfact, Wfact_t, name, systems, defaults, nothing ,
198
194
connector_type, nothing , preface, cont_callbacks, disc_callbacks,
199
195
metadata, checks = checks)
@@ -205,7 +201,6 @@ function ODESystem(eqs, iv = nothing; kwargs...)
205
201
diffvars = OrderedSet ()
206
202
allstates = OrderedSet ()
207
203
ps = OrderedSet ()
208
- cs = OrderedSet () # Constants
209
204
# reorder equations such that it is in the form of `diffeq, algeeq`
210
205
diffeq = Equation[]
211
206
algeeq = Equation[]
@@ -223,8 +218,8 @@ function ODESystem(eqs, iv = nothing; kwargs...)
223
218
compressed_eqs = Equation[] # equations that need to be expanded later, like `connect(a, b)`
224
219
for eq in eqs
225
220
eq. lhs isa Union{Symbolic, Number} || (push! (compressed_eqs, eq); continue )
226
- collect_vars! (allstates, ps, cs, eq. lhs, iv)
227
- collect_vars! (allstates, ps, cs, eq. rhs, iv)
221
+ collect_vars! (allstates, ps, eq. lhs, iv)
222
+ collect_vars! (allstates, ps, eq. rhs, iv)
228
223
if isdiffeq (eq)
229
224
diffvar, _ = var_from_nested_derivative (eq. lhs)
230
225
isequal (iv, iv_from_nested_derivative (eq. lhs)) ||
@@ -240,7 +235,16 @@ function ODESystem(eqs, iv = nothing; kwargs...)
240
235
algevars = setdiff (allstates, diffvars)
241
236
# the orders here are very important!
242
237
return ODESystem (Equation[diffeq; algeeq; compressed_eqs], iv,
243
- collect (Iterators. flatten ((diffvars, algevars))), ps, cs; kwargs... )
238
+ collect (Iterators. flatten ((diffvars, algevars))), ps; kwargs... )
239
+ end
240
+
241
+ function collect_constants (eqs) # Does this need to be different for other system types?
242
+ constants = Set ()
243
+ for eq in eqs
244
+ collect_constants! (constants,eq. lhs)
245
+ collect_constants! (constants,eq. rhs)
246
+ end
247
+ return collect (constants)
244
248
end
245
249
246
250
# NOTE: equality does not check cached Jacobian
@@ -265,7 +269,6 @@ function flatten(sys::ODESystem, noeqs = false)
265
269
get_iv (sys),
266
270
states (sys),
267
271
parameters (sys),
268
- constants (sys),
269
272
observed = observed (sys),
270
273
continuous_events = continuous_events (sys),
271
274
discrete_events = discrete_events (sys),
@@ -298,6 +301,13 @@ function build_explicit_observed_function(sys, ts;
298
301
dep_vars = scalarize (setdiff (vars, ivs))
299
302
300
303
obs = observed (sys)
304
+
305
+ cs = collect_constants (obs)
306
+ if ! isempty (cs) > 0
307
+ cmap = map (x -> x => getdefault (x), cs)
308
+ obs = map (x -> x. lhs ~ substitute (x. rhs, cmap), obs)
309
+ end
310
+
301
311
sts = Set (states (sys))
302
312
observed_idx = Dict (x. lhs => i for (i, x) in enumerate (obs))
303
313
namespaced_to_obs = Dict (states (sys, x. lhs) => x. lhs for x in obs)
0 commit comments