@@ -161,7 +161,8 @@ time-independent systems. If `split=true` (the default) was passed to [`complete
161
161
object.
162
162
"""
163
163
function generate_custom_function (sys:: AbstractSystem , exprs, dvs = unknowns (sys),
164
- ps = parameters (sys); wrap_code = nothing , postprocess_fbody = nothing , states = nothing , kwargs... )
164
+ ps = parameters (sys); wrap_code = nothing , postprocess_fbody = nothing , states = nothing ,
165
+ expression = Val{true }, eval_expression = false , eval_module = @__MODULE__ , kwargs... )
165
166
if ! iscomplete (sys)
166
167
error (" A completed system is required. Call `complete` or `structural_simplify` on the system." )
167
168
end
@@ -177,28 +178,38 @@ function generate_custom_function(sys::AbstractSystem, exprs, dvs = unknowns(sys
177
178
if states === nothing
178
179
states = sol_states
179
180
end
180
- if is_time_dependent (sys)
181
- return build_function (exprs,
181
+ fnexpr = if is_time_dependent (sys)
182
+ build_function (exprs,
182
183
dvs,
183
184
p... ,
184
185
get_iv (sys);
185
186
kwargs... ,
186
187
postprocess_fbody,
187
188
states,
188
189
wrap_code = wrap_code .∘ wrap_mtkparameters (sys, isscalar) .∘
189
- wrap_array_vars (sys, exprs; dvs)
190
+ wrap_array_vars (sys, exprs; dvs),
191
+ expression = Val{true }
190
192
)
191
193
else
192
- return build_function (exprs,
194
+ build_function (exprs,
193
195
dvs,
194
196
p... ;
195
197
kwargs... ,
196
198
postprocess_fbody,
197
199
states,
198
200
wrap_code = wrap_code .∘ wrap_mtkparameters (sys, isscalar) .∘
199
- wrap_array_vars (sys, exprs; dvs)
201
+ wrap_array_vars (sys, exprs; dvs),
202
+ expression = Val{true }
200
203
)
201
204
end
205
+ if expression == Val{true }
206
+ return fnexpr
207
+ end
208
+ if fnexpr isa Tuple
209
+ return eval_or_rgf .(fnexpr; eval_expression, eval_module)
210
+ else
211
+ return eval_or_rgf (fnexpr; eval_expression, eval_module)
212
+ end
202
213
end
203
214
204
215
function wrap_assignments (isscalar, assignments; let_block = false )
@@ -509,7 +520,8 @@ function SymbolicIndexingInterface.is_observed(sys::AbstractSystem, sym)
509
520
! is_independent_variable (sys, sym) && symbolic_type (sym) != NotSymbolic ()
510
521
end
511
522
512
- function SymbolicIndexingInterface. observed (sys:: AbstractSystem , sym)
523
+ function SymbolicIndexingInterface. observed (
524
+ sys:: AbstractSystem , sym; eval_expression = false , eval_module = @__MODULE__ )
513
525
if has_index_cache (sys) && (ic = get_index_cache (sys)) != = nothing
514
526
if sym isa Symbol
515
527
_sym = get (ic. symbol_to_variable, sym, nothing )
@@ -531,7 +543,8 @@ function SymbolicIndexingInterface.observed(sys::AbstractSystem, sym)
531
543
end
532
544
end
533
545
end
534
- _fn = build_explicit_observed_function (sys, sym)
546
+ _fn = build_explicit_observed_function (sys, sym; eval_expression, eval_module)
547
+
535
548
if is_time_dependent (sys)
536
549
return let _fn = _fn
537
550
fn1 (u, p, t) = _fn (u, p, t)
@@ -1210,19 +1223,30 @@ end
1210
1223
struct ObservedFunctionCache{S}
1211
1224
sys:: S
1212
1225
dict:: Dict{Any, Any}
1226
+ eval_expression:: Bool
1227
+ eval_module:: Module
1213
1228
end
1214
1229
1215
- function ObservedFunctionCache (sys)
1216
- return ObservedFunctionCache (sys, Dict ())
1217
- let sys = sys, dict = Dict ()
1218
- function generated_observed (obsvar, args... )
1219
- end
1220
- end
1230
+ function ObservedFunctionCache (sys; eval_expression = false , eval_module = @__MODULE__ )
1231
+ return ObservedFunctionCache (sys, Dict (), eval_expression, eval_module)
1232
+ end
1233
+
1234
+ # This is hit because ensemble problems do a deepcopy
1235
+ function Base. deepcopy_internal (ofc:: ObservedFunctionCache , stackdict:: IdDict )
1236
+ sys = deepcopy (ofc. sys)
1237
+ dict = deepcopy (ofc. dict)
1238
+ eval_expression = ofc. eval_expression
1239
+ eval_module = ofc. eval_module
1240
+ newofc = ObservedFunctionCache (sys, dict, eval_expression, eval_module)
1241
+ stackdict[ofc] = newofc
1242
+ return newofc
1221
1243
end
1222
1244
1223
1245
function (ofc:: ObservedFunctionCache )(obsvar, args... )
1224
1246
obs = get! (ofc. dict, value (obsvar)) do
1225
- SymbolicIndexingInterface. observed (ofc. sys, obsvar)
1247
+ SymbolicIndexingInterface. observed (
1248
+ ofc. sys, obsvar; eval_expression = ofc. eval_expression,
1249
+ eval_module = ofc. eval_module)
1226
1250
end
1227
1251
if args === ()
1228
1252
return obs
@@ -1871,6 +1895,7 @@ function linearization_function(sys::AbstractSystem, inputs,
1871
1895
p = DiffEqBase. NullParameters (),
1872
1896
zero_dummy_der = false ,
1873
1897
initialization_solver_alg = TrustRegion (),
1898
+ eval_expression = false , eval_module = @__MODULE__ ,
1874
1899
kwargs... )
1875
1900
inputs isa AbstractVector || (inputs = [inputs])
1876
1901
outputs isa AbstractVector || (outputs = [outputs])
@@ -1895,85 +1920,58 @@ function linearization_function(sys::AbstractSystem, inputs,
1895
1920
end
1896
1921
x0 = merge (defaults_and_guesses (sys), op)
1897
1922
if has_index_cache (sys) && get_index_cache (sys) != = nothing
1898
- sys_ps = MTKParameters (sys, p, x0)
1923
+ sys_ps = MTKParameters (sys, p, x0; eval_expression, eval_module )
1899
1924
else
1900
1925
sys_ps = varmap_to_vars (p, parameters (sys); defaults = x0)
1901
1926
end
1902
1927
p[get_iv (sys)] = NaN
1903
1928
if has_index_cache (initsys) && get_index_cache (initsys) != = nothing
1904
- oldps = MTKParameters (initsys, p, merge (guesses (sys), defaults (sys), op))
1929
+ oldps = MTKParameters (initsys, p, merge (guesses (sys), defaults (sys), op);
1930
+ eval_expression, eval_module)
1905
1931
initsys_ps = parameters (initsys)
1906
- initsys_idxs = [parameter_index (initsys, param) for param in initsys_ps]
1907
- tunable_ps = [initsys_ps[i]
1908
- for i in eachindex (initsys_ps)
1909
- if initsys_idxs[i]. portion == SciMLStructures. Tunable ()]
1910
- tunable_getter = isempty (tunable_ps) ? nothing : getu (sys, tunable_ps)
1911
- discrete_ps = [initsys_ps[i]
1912
- for i in eachindex (initsys_ps)
1913
- if initsys_idxs[i]. portion == SciMLStructures. Discrete ()]
1914
- disc_getter = isempty (discrete_ps) ? nothing : getu (sys, discrete_ps)
1915
- constant_ps = [initsys_ps[i]
1916
- for i in eachindex (initsys_ps)
1917
- if initsys_idxs[i]. portion == SciMLStructures. Constants ()]
1918
- const_getter = isempty (constant_ps) ? nothing : getu (sys, constant_ps)
1919
- nonnum_ps = [initsys_ps[i]
1920
- for i in eachindex (initsys_ps)
1921
- if initsys_idxs[i]. portion == NONNUMERIC_PORTION]
1922
- nonnum_getter = isempty (nonnum_ps) ? nothing : getu (sys, nonnum_ps)
1932
+ p_getter = build_explicit_observed_function (
1933
+ sys, initsys_ps; eval_expression, eval_module)
1934
+
1923
1935
u_getter = isempty (unknowns (initsys)) ? (_... ) -> nothing :
1924
- getu (sys, unknowns (initsys))
1925
- get_initprob_u_p = let tunable_getter = tunable_getter,
1926
- disc_getter = disc_getter,
1927
- const_getter = const_getter,
1928
- nonnum_getter = nonnum_getter,
1929
- oldps = oldps,
1936
+ build_explicit_observed_function (
1937
+ sys, unknowns (initsys); eval_expression, eval_module)
1938
+ get_initprob_u_p = let p_getter,
1939
+ p_setter! = setp (initsys, initsys_ps),
1930
1940
u_getter = u_getter
1931
1941
1932
1942
function (u, p, t)
1933
1943
state = ProblemState (; u, p, t)
1934
- if tunable_getter != = nothing
1935
- SciMLStructures. replace! (
1936
- SciMLStructures. Tunable (), oldps, tunable_getter (state))
1937
- end
1938
- if disc_getter != = nothing
1939
- SciMLStructures. replace! (
1940
- SciMLStructures. Discrete (), oldps, disc_getter (state))
1941
- end
1942
- if const_getter != = nothing
1943
- SciMLStructures. replace! (
1944
- SciMLStructures. Constants (), oldps, const_getter (state))
1945
- end
1946
- if nonnum_getter != = nothing
1947
- SciMLStructures. replace! (
1948
- NONNUMERIC_PORTION, oldps, nonnum_getter (state))
1949
- end
1944
+ p_setter! (oldps, p_getter (state))
1950
1945
newu = u_getter (state)
1951
1946
return newu, oldps
1952
1947
end
1953
1948
end
1954
1949
else
1955
1950
get_initprob_u_p = let p_getter = getu (sys, parameters (initsys)),
1956
- u_getter = getu (sys, unknowns (initsys))
1951
+ u_getter = build_explicit_observed_function (
1952
+ sys, unknowns (initsys); eval_expression, eval_module)
1957
1953
1958
1954
function (u, p, t)
1959
1955
state = ProblemState (; u, p, t)
1960
1956
return u_getter (state), p_getter (state)
1961
1957
end
1962
1958
end
1963
1959
end
1964
- initfn = NonlinearFunction (initsys)
1965
- initprobmap = getu (initsys, unknowns (sys))
1960
+ initfn = NonlinearFunction (initsys; eval_expression, eval_module)
1961
+ initprobmap = build_explicit_observed_function (
1962
+ initsys, unknowns (sys); eval_expression, eval_module)
1966
1963
ps = full_parameters (sys)
1964
+ h = build_explicit_observed_function (sys, outputs; eval_expression, eval_module)
1967
1965
lin_fun = let diff_idxs = diff_idxs,
1968
1966
alge_idxs = alge_idxs,
1969
1967
input_idxs = input_idxs,
1970
1968
sts = unknowns (sys),
1971
1969
get_initprob_u_p = get_initprob_u_p,
1972
1970
fun = ODEFunction {true, SciMLBase.FullSpecialize} (
1973
- sys, unknowns (sys), ps),
1971
+ sys, unknowns (sys), ps; eval_expression, eval_module ),
1974
1972
initfn = initfn,
1975
1973
initprobmap = initprobmap,
1976
- h = build_explicit_observed_function (sys, outputs) ,
1974
+ h = h ,
1977
1975
chunk = ForwardDiff. Chunk (input_idxs),
1978
1976
sys_ps = sys_ps,
1979
1977
initialize = initialize,
@@ -2056,6 +2054,7 @@ where `x` are differential unknown variables, `z` algebraic variables, `u` input
2056
2054
"""
2057
2055
function linearize_symbolic (sys:: AbstractSystem , inputs,
2058
2056
outputs; simplify = false , allow_input_derivatives = false ,
2057
+ eval_expression = false , eval_module = @__MODULE__ ,
2059
2058
kwargs... )
2060
2059
sys, diff_idxs, alge_idxs, input_idxs = io_preprocessing (
2061
2060
sys, inputs, outputs; simplify,
@@ -2065,10 +2064,11 @@ function linearize_symbolic(sys::AbstractSystem, inputs,
2065
2064
ps = full_parameters (sys)
2066
2065
p = reorder_parameters (sys, ps)
2067
2066
2068
- fun = generate_function (sys, sts, ps; expression = Val{false })[1 ]
2067
+ fun_expr = generate_function (sys, sts, ps; expression = Val{true })[1 ]
2068
+ fun = eval_or_rgf (fun_expr; eval_expression, eval_module)
2069
2069
dx = fun (sts, p... , t)
2070
2070
2071
- h = build_explicit_observed_function (sys, outputs)
2071
+ h = build_explicit_observed_function (sys, outputs; eval_expression, eval_module )
2072
2072
y = h (sts, p... , t)
2073
2073
2074
2074
fg_xz = Symbolics. jacobian (dx, sts)
0 commit comments