Skip to content

Commit 65e4703

Browse files
committed
fix: check if observed is in affect equations
1 parent ab16c85 commit 65e4703

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/systems/abstractsystem.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,16 +646,16 @@ function complete(
646646
sys = add_initialization_parameters(sys; split)
647647
end
648648
alg_eqs = alg_equations(sys)
649-
alg_eqs = isempty(alg_eqs) ? alg_eqs : [alg_eqs; observed(sys)]
649+
obs_eqs = observed(sys)
650650
if has_continuous_events(sys) && is_time_dependent(sys)
651651
@set! sys.continuous_events = complete.(
652652
get_continuous_events(sys); iv = get_iv(sys),
653-
alg_eqs)
653+
alg_eqs, obs_eqs)
654654
end
655655
if has_discrete_events(sys) && is_time_dependent(sys)
656656
@set! sys.discrete_events = complete.(
657657
get_discrete_events(sys); iv = get_iv(sys),
658-
alg_eqs)
658+
alg_eqs, obs_eqs)
659659
end
660660
end
661661
if split && has_index_cache(sys)

src/systems/callbacks.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function AffectSystem(spec::SymbolicAffect; iv = nothing, alg_eqs = Equation[],
6161
end
6262

6363
function AffectSystem(affect::Vector{Equation}; discrete_parameters = Any[],
64-
iv = nothing, alg_eqs::Vector{Equation} = Equation[], warn_no_algebraic = true, kwargs...)
64+
iv = nothing, alg_eqs::Vector{Equation} = Equation[], obs_eqs::Vector{Equation} = Equation[], warn_no_algebraic = true, kwargs...)
6565
isempty(affect) && return nothing
6666
if isnothing(iv)
6767
iv = t_nounits
@@ -70,6 +70,7 @@ function AffectSystem(affect::Vector{Equation}; discrete_parameters = Any[],
7070

7171
discrete_parameters isa AbstractVector || (discrete_parameters = [discrete_parameters])
7272
discrete_parameters = unwrap.(discrete_parameters)
73+
obs_vars = [unwrap(eq.lhs) for eq in obs_eqs]
7374

7475
for p in discrete_parameters
7576
occursin(unwrap(iv), unwrap(p)) ||
@@ -79,6 +80,7 @@ function AffectSystem(affect::Vector{Equation}; discrete_parameters = Any[],
7980
dvs = OrderedSet()
8081
params = OrderedSet()
8182
_varsbuf = Set()
83+
eqs_contain_obs = false
8284
for eq in affect
8385
if !haspre(eq) && !(symbolic_type(eq.rhs) === NotSymbolic() ||
8486
symbolic_type(eq.lhs) === NotSymbolic())
@@ -91,6 +93,16 @@ function AffectSystem(affect::Vector{Equation}; discrete_parameters = Any[],
9193
union!(params, _varsbuf)
9294
diffvs = collect_applied_operators(eq, Differential)
9395
union!(dvs, diffvs)
96+
97+
for var in obs_vars
98+
if occursin(var, unwrap(eq.rhs))
99+
eqs_contain_obs = true
100+
end
101+
end
102+
end
103+
104+
if eqs_contain_obs
105+
alg_eqs = [alg_eqs; obs_eqs]
94106
end
95107
for eq in alg_eqs
96108
collect_vars!(dvs, params, eq, iv)

0 commit comments

Comments
 (0)