Skip to content

Commit 11bd52f

Browse files
committed
allow setdefaults on constraint sys variables
1 parent d9ac8f8 commit 11bd52f

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

src/reactionsystem.jl

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,28 @@ function MT.observed(sys::ReactionSystem)
690690
init = obs)
691691
end
692692

693+
function Base.propertynames(sys::ReactionSystem; private = false)
694+
if private
695+
return fieldnames(typeof(sys))
696+
else
697+
names = Symbol[]
698+
for s in get_systems(sys)
699+
push!(names, getname(s))
700+
end
701+
MT.has_states(sys) && for s in get_states(sys)
702+
push!(names, getname(s))
703+
end
704+
MT.has_ps(sys) && for s in get_ps(sys)
705+
push!(names, getname(s))
706+
end
707+
MT.has_observed(sys) && for s in get_observed(sys)
708+
push!(names, getname(s.lhs))
709+
end
710+
(get_constraints(sys) !== nothing) && append!(names, propertynames(get_constraints(sys)))
711+
return unique!(names)
712+
end
713+
end
714+
693715
function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
694716
if isdefined(sys, name)
695717
Base.depwarn("`sys.name` like `sys.$name` is deprecated. Use getters like `get_$name` instead.",
@@ -702,11 +724,6 @@ function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
702724
i === nothing ||
703725
return namespace ? rename(systems[i], renamespace(sys, name)) : systems[i]
704726

705-
constraints = get_constraints(sys)
706-
if constraints !== nothing && nameof(constraints) == name
707-
return namespace ? rename(constraints, renamespace(sys, name)) : constraints
708-
end
709-
710727
avs = get_var_to_name(sys)
711728
v = get(avs, name, nothing)
712729
v === nothing || return namespace ? renamespace(sys, v) : v
@@ -723,6 +740,7 @@ function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
723740
i = findfirst(x -> getname(x.lhs) == name, obs)
724741
i === nothing || return namespace ? renamespace(sys, obs[i]) : obs[i]
725742

743+
constraints = get_constraints(sys)
726744
if constraints !== nothing
727745
return getvar(rename(constraints, nameof(sys)), name; namespace = namespace)
728746
end

test/reactionsystem_components.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,14 @@ u₀ = [A => 1.0, B => 2.0, C => 0.0]
262262
oprob = ODEProblem(structural_simplify(osys), u₀, (0.0, 10.0), p)
263263
sol = solve(oprob, Tsit5())
264264
@test isapprox(0, norm(sol[ns.D] .- 2 * sol[A] - 3 * sol[B]), atol = (100 * eps()))
265+
psyms = [:r₊ => 1.0, :r₋ => 2.0, :ns₊β => 3.0]
266+
u₀syms = [:A => 1.0, :B => 2.0, :C => 0.0]
267+
p = symmap_to_varmap(osys, psyms)
268+
u₀ = symmap_to_varmap(osys, u₀syms)
269+
oprob = ODEProblem(structural_simplify(osys), u₀, (0.0, 10.0), p)
270+
sol = solve(oprob, Tsit5())
271+
@test isapprox(0, norm(sol[ns.D] .- 2 * sol[A] - 3 * sol[B]), atol = (100 * eps()))
272+
265273

266274
# test API functions for composed model
267275
@test issetequal(species(rs), [A, B, C])
@@ -354,3 +362,19 @@ rxs2 = [Reaction(p2, [ParentScope(A)], nothing)]
354362
rsc = compose(rs1, [rs2])
355363
orsc = convert(ODESystem, rsc)
356364
@test length(equations(orsc)) == 1
365+
366+
# test constraint system symbols can be set via setdefaults!
367+
let
368+
@parameters b
369+
@variables t V(t) [isbcspecies=true]
370+
rn = @reaction_network begin
371+
k/$V, A + B --> C
372+
end k
373+
Dt = Differential(t)
374+
@named csys = ODESystem([Dt(V) ~ -b*V], t)
375+
@named fullrn = extend(csys, rn)
376+
setdefaults!(fullrn, [:b => 2.0])
377+
@unpack b = fullrn
378+
@test haskey(ModelingToolkit.defaults(fullrn), b)
379+
@test ModelingToolkit.defaults(fullrn)[b] == 2.0
380+
end

0 commit comments

Comments
 (0)