Skip to content

Commit e9d1ab8

Browse files
feat: subset system and pass to SCC problems
1 parent 71bfd7a commit e9d1ab8

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/systems/index_cache.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,3 +594,28 @@ function reorder_dimension_by_tunables(
594594
reorder_dimension_by_tunables!(buffer, sys, arr, syms; dim)
595595
return buffer
596596
end
597+
598+
function subset_unknowns_observed(
599+
ic::IndexCache, sys::AbstractSystem, newunknowns, newobsvars)
600+
unknown_idx = copy(ic.unknown_idx)
601+
empty!(unknown_idx)
602+
for (i, sym) in enumerate(newunknowns)
603+
ttsym = default_toterm(sym)
604+
rsym = renamespace(sys, sym)
605+
rttsym = renamespace(sys, ttsym)
606+
unknown_idx[sym] = unknown_idx[ttsym] = unknown_idx[rsym] = unknown_idx[rttsym] = i
607+
end
608+
observed_syms_to_timeseries = copy(ic.observed_syms_to_timeseries)
609+
empty!(observed_syms_to_timeseries)
610+
for sym in newobsvars
611+
ttsym = default_toterm(sym)
612+
rsym = renamespace(sys, sym)
613+
rttsym = renamespace(sys, ttsym)
614+
for s in (sym, ttsym, rsym, rttsym)
615+
observed_syms_to_timeseries[s] = ic.observed_syms_to_timeseries[sym]
616+
end
617+
end
618+
ic = @set ic.unknown_idx = unknown_idx
619+
@set! ic.observed_syms_to_timeseries = observed_syms_to_timeseries
620+
return ic
621+
end

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,13 @@ function SCCNonlinearFunction{iip}(
579579
f(resid, u, p) = f_iip(resid, u, p)
580580
f(resid, u, p::MTKParameters) = f_iip(resid, u, p...)
581581

582-
return NonlinearFunction{iip}(f)
582+
subsys = NonlinearSystem(_eqs, _dvs, ps; observed = _obs, parameter_dependencies = parameter_dependencies(sys), name = nameof(sys))
583+
if get_index_cache(sys) !== nothing
584+
@set! subsys.index_cache = subset_unknowns_observed(get_index_cache(sys), sys, _dvs, getproperty.(_obs, (:lhs,)))
585+
@set! subsys.complete = true
586+
end
587+
588+
return NonlinearFunction{iip}(f; sys = subsys)
583589
end
584590

585591
function SciMLBase.SCCNonlinearProblem(sys::NonlinearSystem, args...; kwargs...)

0 commit comments

Comments
 (0)