@@ -117,7 +117,8 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
117
117
obs = observed (sys)
118
118
119
119
_, u0, p = process_SciMLProblem (
120
- EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, u0_constructor, kwargs... )
120
+ EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, u0_constructor,
121
+ symbolic_u0 = true , kwargs... )
121
122
122
123
explicitfuns = []
123
124
nlfuns = []
@@ -246,16 +247,31 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
246
247
p = rebuild_with_caches (p, templates... )
247
248
end
248
249
250
+ u0_eltype = Union{}
251
+ for x in u0
252
+ symbolic_type (x) == NotSymbolic () || continue
253
+ u0_eltype = typeof (x)
254
+ break
255
+ end
256
+ if u0_eltype == Union{}
257
+ u0_eltype = Float64
258
+ end
249
259
subprobs = []
250
- for (f, vscc) in zip (nlfuns, var_sccs)
260
+ for (i, ( f, vscc)) in enumerate ( zip (nlfuns, var_sccs) )
251
261
_u0 = SymbolicUtils. Code. create_array (
252
262
typeof (u0), eltype (u0), Val (1 ), Val (length (vscc)), u0[vscc]. .. )
263
+ symbolic_idxs = findall (x -> symbolic_type (x) != NotSymbolic (), _u0)
264
+ explicitfuns[i](p, subprobs)
253
265
if f isa LinearFunction
266
+ _u0 = isempty (symbolic_idxs) ? _u0 : zeros (u0_eltype, length (_u0))
267
+ _u0 = u0_eltype .(_u0)
254
268
symbolic_interface = f. interface
255
269
A, b = get_A_b_from_LinearFunction (
256
270
sys, f, p; eval_expression, eval_module, u0_constructor)
257
- prob = LinearProblem (A, b, p; u0 = _u0, f = symbolic_interface )
271
+ prob = LinearProblem (A, b, p; f = symbolic_interface, u0 = _u0 )
258
272
else
273
+ isempty (symbolic_idxs) || throw (MissingGuessError (dvs[vscc], _u0))
274
+ _u0 = u0_eltype .(_u0)
259
275
prob = NonlinearProblem (f, _u0, p)
260
276
end
261
277
push! (subprobs, prob)
0 commit comments