10
10
11
11
function CacheWriter (sys:: AbstractSystem , buffer_types:: Vector{TypeT} ,
12
12
exprs:: Dict{TypeT, Vector{Any}} , solsyms, obseqs:: Vector{Equation} ;
13
- eval_expression = false , eval_module = @__MODULE__ , cse = true )
13
+ eval_expression = false , eval_module = @__MODULE__ , cse = true , sparse = false )
14
14
ps = parameters (sys; initial_parameters = true )
15
15
rps = reorder_parameters (sys, ps)
16
16
obs_assigns = [eq. lhs ← eq. rhs for eq in obseqs]
39
39
struct SCCNonlinearFunction{iip} end
40
40
41
41
function SCCNonlinearFunction {iip} (
42
- sys:: System , _eqs, _dvs, _obs, cachesyms; eval_expression = false ,
42
+ sys:: System , _eqs, _dvs, _obs, cachesyms, op ; eval_expression = false ,
43
43
eval_module = @__MODULE__ , cse = true , kwargs... ) where {iip}
44
44
ps = parameters (sys; initial_parameters = true )
45
+ subsys = System (
46
+ _eqs, _dvs, ps; observed = _obs, name = nameof (sys), defaults = defaults (sys))
47
+ @set! subsys. parameter_dependencies = parameter_dependencies (sys)
48
+ if get_index_cache (sys) != = nothing
49
+ @set! subsys. index_cache = subset_unknowns_observed (
50
+ get_index_cache (sys), sys, _dvs, getproperty .(_obs, (:lhs ,)))
51
+ @set! subsys. complete = true
52
+ end
53
+ # generate linear problem instead
54
+ if isaffine (subsys)
55
+ return LinearFunction {iip} (
56
+ subsys; eval_expression, eval_module, cse, cachesyms, kwargs... )
57
+ end
45
58
rps = reorder_parameters (sys, ps)
46
59
47
60
obs_assignments = [eq. lhs ← eq. rhs for eq in _obs]
@@ -54,14 +67,6 @@ function SCCNonlinearFunction{iip}(
54
67
f_oop, f_iip = eval_or_rgf .(f_gen; eval_expression, eval_module)
55
68
f = GeneratedFunctionWrapper {(2, 2, is_split(sys))} (f_oop, f_iip)
56
69
57
- subsys = System (_eqs, _dvs, ps; observed = _obs,
58
- parameter_dependencies = parameter_dependencies (sys), name = nameof (sys))
59
- if get_index_cache (sys) != = nothing
60
- @set! subsys. index_cache = subset_unknowns_observed (
61
- get_index_cache (sys), sys, _dvs, getproperty .(_obs, (:lhs ,)))
62
- @set! subsys. complete = true
63
- end
64
-
65
70
return NonlinearFunction {iip} (f; sys = subsys)
66
71
end
67
72
@@ -70,7 +75,7 @@ function SciMLBase.SCCNonlinearProblem(sys::System, args...; kwargs...)
70
75
end
71
76
72
77
function SciMLBase. SCCNonlinearProblem {iip} (sys:: System , op; eval_expression = false ,
73
- eval_module = @__MODULE__ , cse = true , kwargs... ) where {iip}
78
+ eval_module = @__MODULE__ , cse = true , u0_constructor = identity, kwargs... ) where {iip}
74
79
if ! iscomplete (sys) || get_tearing_state (sys) === nothing
75
80
error (" A simplified `System` is required. Call `mtkcompile` on the system before creating an `SCCNonlinearProblem`." )
76
81
end
@@ -112,7 +117,7 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
112
117
obs = observed (sys)
113
118
114
119
_, u0, p = process_SciMLProblem (
115
- EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, kwargs... )
120
+ EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, u0_constructor, kwargs... )
116
121
117
122
explicitfuns = []
118
123
nlfuns = []
@@ -223,7 +228,8 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
223
228
get (cachevars, T, [])
224
229
end )
225
230
f = SCCNonlinearFunction {iip} (
226
- sys, _eqs, _dvs, _obs, cachebufsyms; eval_expression, eval_module, cse, kwargs... )
231
+ sys, _eqs, _dvs, _obs, cachebufsyms, op;
232
+ eval_expression, eval_module, cse, kwargs... )
227
233
push! (nlfuns, f)
228
234
end
229
235
@@ -244,7 +250,14 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
244
250
for (f, vscc) in zip (nlfuns, var_sccs)
245
251
_u0 = SymbolicUtils. Code. create_array (
246
252
typeof (u0), eltype (u0), Val (1 ), Val (length (vscc)), u0[vscc]. .. )
247
- prob = NonlinearProblem (f, _u0, p)
253
+ if f isa LinearFunction
254
+ symbolic_interface = f. interface
255
+ A, b = get_A_b_from_LinearFunction (
256
+ sys, f, p; eval_expression, eval_module, u0_constructor)
257
+ prob = LinearProblem (A, b, p; u0 = _u0, f = symbolic_interface)
258
+ else
259
+ prob = NonlinearProblem (f, _u0, p)
260
+ end
248
261
push! (subprobs, prob)
249
262
end
250
263
0 commit comments