@@ -87,28 +87,36 @@ function generate_function(
87
87
has_difference= false ,
88
88
kwargs...
89
89
)
90
- # optimization
91
- # obsvars = map(eq->eq.lhs, observed(sys))
92
- # fulldvs = [dvs; obsvars]
93
90
94
91
eqs = [eq for eq in equations (sys) if ! isdifferenceeq (eq)]
95
92
foreach (check_derivative_variables, eqs)
96
93
# substitute x(t) by just x
97
94
rhss = implicit_dae ? [_iszero (eq. lhs) ? eq. rhs : eq. rhs - eq. lhs for eq in eqs] :
98
95
[eq. rhs for eq in eqs]
99
- # rhss = Let(obss, rhss)
100
96
101
97
# TODO : add an optional check on the ordering of observed equations
102
98
u = map (x-> time_varying_as_func (value (x), sys), dvs)
103
99
p = map (x-> time_varying_as_func (value (x), sys), ps)
104
100
t = get_iv (sys)
105
101
106
- pre = has_difference ? (ex -> ex) : get_postprocess_fbody (sys)
102
+ if empty_substitutions (sys)
103
+ bf_states = Code. LazyState ()
104
+ pre = has_difference ? (ex -> ex) : get_postprocess_fbody (sys)
105
+ else
106
+ subs = get_substitutions (sys)
107
+ bf_states = Code. NameState (Dict (eq. lhs => Symbol (eq. lhs) for eq in subs))
108
+ if has_difference
109
+ pre = ex -> Let (Assignment[Assignment (eq. lhs, eq. rhs) for eq in subs], ex)
110
+ else
111
+ process = get_postprocess_fbody (sys)
112
+ pre = ex -> Let (Assignment[Assignment (eq. lhs, eq. rhs) for eq in subs], process (ex))
113
+ end
114
+ end
107
115
108
116
if implicit_dae
109
- build_function (rhss, ddvs, u, p, t; postprocess_fbody= pre, kwargs... )
117
+ build_function (rhss, ddvs, u, p, t; postprocess_fbody= pre, states = bf_states, kwargs... )
110
118
else
111
- build_function (rhss, u, p, t; postprocess_fbody= pre, kwargs... )
119
+ build_function (rhss, u, p, t; postprocess_fbody= pre, states = bf_states, kwargs... )
112
120
end
113
121
end
114
122
0 commit comments