@@ -274,27 +274,41 @@ function generate_io_function(_sys, inputss::Tuple, outputss::Tuple;
274
274
alloutputs = reduce (union, outputss)
275
275
276
276
missing_inputs = Set {Symbolic} ()
277
+ implicit_outputs = Set {Symbolic} () # fully implicit outputs which do not appear in the equations
277
278
sys = if ModelingToolkit. iscomplete (_sys)
278
279
deepcopy (_sys)
279
280
else
280
281
_openinputs = setdiff (allinputs, Set (parameters (_sys)))
281
282
all_eq_vars = mapreduce (get_variables, union, full_equations (_sys), init= Set {Symbolic} ())
282
283
if ! (_openinputs ⊆ all_eq_vars)
283
284
missing_inputs = setdiff (_openinputs, all_eq_vars)
284
- @warn " The specified inputs ($missing_inputs ) do not appear in the equations of the system!"
285
+ verbose && @warn " The specified inputs ($missing_inputs ) do not appear in the equations of the system!"
285
286
_openinputs = setdiff (_openinputs, missing_inputs)
286
287
end
287
- structural_simplify (_sys, (_openinputs, alloutputs); simplify= false )[1 ]
288
+ _definedoutputs = alloutputs ∩ all_eq_vars
289
+ if ! (Set (_definedoutputs) == Set (alloutputs))
290
+ implicit_outputs = setdiff (alloutputs, _definedoutputs)
291
+ verbose && @warn " The specified outputs $implicit_outputs do not appear in the equations of the system!"
292
+ end
293
+ structural_simplify (_sys, (_openinputs, _definedoutputs); simplify= false )[1 ]
288
294
end
289
295
290
- states = unknowns (sys)
291
296
allparams = parameters (sys) # contains inputs!
292
297
@argcheck allinputs ⊆ Set (allparams) ∪ missing_inputs
293
298
params = setdiff (allparams, Set (allinputs))
294
299
295
300
# extract the main equations and observed equations
296
301
eqs:: Vector{Equation} = full_equations (sys)
297
302
fix_metadata! (eqs, sys);
303
+
304
+ # assert the ordering of states and equations
305
+ explicit_states = Symbolic[eq_type (eq)[2 ] for eq in eqs if ! isnothing (eq_type (eq)[2 ])]
306
+ implicit_states = setdiff (unknowns (sys), explicit_states) ∪ implicit_outputs
307
+ states = map (eqs) do eq
308
+ type = eq_type (eq)
309
+ isnothing (type[2 ]) ? pop! (implicit_states) : type[2 ]
310
+ end
311
+
298
312
# check hat there are no rhs differentials in the equations
299
313
if ! isempty (rhs_differentials (eqs))
300
314
diffs = rhs_differentials (eqs)
@@ -389,7 +403,7 @@ function generate_io_function(_sys, inputss::Tuple, outputss::Tuple;
389
403
# filter out unnecessary parameters
390
404
var_deps = _all_rhs_symbols (eqs)
391
405
unused_params = Set (setdiff (params, (var_deps ∪ out_deps))) # do not exclud obs_deps
392
- if verbose && ! isempth (unused_params)
406
+ if verbose && ! isempty (unused_params)
393
407
@info " Parameters $(unused_params) do not appear in equations of f and g and will be marked as unused."
394
408
end
395
409
0 commit comments