Skip to content

Commit 9e1a47d

Browse files
authored
Merge pull request #534 from isaacsas/fix_symbol_to_var
Fix symbol to variable mappings
2 parents 65c1e6d + 4a19b89 commit 9e1a47d

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

src/networkapi.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ function setdefaults!(rn, newdefs)
408408
defs = eltype(newdefs) <: Pair{Symbol} ? symmap_to_varmap(rn, newdefs) : newdefs
409409
rndefs = MT.get_defaults(rn)
410410
for (var, val) in defs
411-
rndefs[var] = value(val)
411+
rndefs[value(var)] = value(val)
412412
end
413413
nothing
414414
end

src/reactionsystem.jl

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,29 @@ 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) &&
711+
append!(names, propertynames(get_constraints(sys)))
712+
return unique!(names)
713+
end
714+
end
715+
693716
function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
694717
if isdefined(sys, name)
695718
Base.depwarn("`sys.name` like `sys.$name` is deprecated. Use getters like `get_$name` instead.",
@@ -702,11 +725,6 @@ function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
702725
i === nothing ||
703726
return namespace ? rename(systems[i], renamespace(sys, name)) : systems[i]
704727

705-
constraints = get_constraints(sys)
706-
if constraints !== nothing && nameof(constraints) == name
707-
return namespace ? rename(constraints, renamespace(sys, name)) : constraints
708-
end
709-
710728
avs = get_var_to_name(sys)
711729
v = get(avs, name, nothing)
712730
v === nothing || return namespace ? renamespace(sys, v) : v
@@ -723,6 +741,7 @@ function MT.getvar(sys::ReactionSystem, name::Symbol; namespace = false)
723741
i = findfirst(x -> getname(x.lhs) == name, obs)
724742
i === nothing || return namespace ? renamespace(sys, obs[i]) : obs[i]
725743

744+
constraints = get_constraints(sys)
726745
if constraints !== nothing
727746
return getvar(rename(constraints, nameof(sys)), name; namespace = namespace)
728747
end

test/api.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,7 @@ setdefaults!(rn, [:S => 999.0, :I => 1.0, :R => 0.0, :α => 1e-4, :β => 0.01])
586586
op = ODEProblem(rn, [], tspan, [])
587587
sol2 = solve(op, Tsit5())
588588
@test norm(sol.u - sol2.u) 0
589+
@test all(p -> p[1] isa Symbolics.Symbolic, collect(ModelingToolkit.defaults(rn)))
589590

590591
rn = @reaction_network begin
591592
α, S + I --> 2I

test/reactionsystem_components.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#! format: off
12
using ModelingToolkit, Catalyst, LinearAlgebra, OrdinaryDiffEq, Test
23
using SciMLNLSolve
34

@@ -262,6 +263,13 @@ u₀ = [A => 1.0, B => 2.0, C => 0.0]
262263
oprob = ODEProblem(structural_simplify(osys), u₀, (0.0, 10.0), p)
263264
sol = solve(oprob, Tsit5())
264265
@test isapprox(0, norm(sol[ns.D] .- 2 * sol[A] - 3 * sol[B]), atol = (100 * eps()))
266+
psyms = [:r₊ => 1.0, :r₋ => 2.0, :ns₊β => 3.0]
267+
u₀syms = [:A => 1.0, :B => 2.0, :C => 0.0]
268+
p = symmap_to_varmap(osys, psyms)
269+
u₀ = symmap_to_varmap(osys, u₀syms)
270+
oprob = ODEProblem(structural_simplify(osys), u₀, (0.0, 10.0), p)
271+
sol = solve(oprob, Tsit5())
272+
@test isapprox(0, norm(sol[ns.D] .- 2 * sol[A] - 3 * sol[B]), atol = (100 * eps()))
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)