Skip to content

Commit c14933a

Browse files
committed
start depgraphs for AbstractSys
1 parent 5bbda08 commit c14933a

File tree

4 files changed

+48
-37
lines changed

4 files changed

+48
-37
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
1212
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
1313
GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb"
1414
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
15+
LightGraphs = "093fc24a-ae57-5d10-9952-331d41423f4d"
1516
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1617
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
1718
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"

src/ModelingToolkit.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ include("systems/optimization/optimizationsystem.jl")
101101
include("systems/pde/pdesystem.jl")
102102

103103
include("systems/reaction/reactionsystem.jl")
104+
include("systems/dependency_graphs.jl")
104105

105106
include("latexify_recipes.jl")
106107
include("build_function.jl")

src/systems/dependency_graphs.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
# each system type should define extract_variables! for a single equation
3+
function extract_variables(eqs, vars)
4+
deps = Set{Variable}()
5+
depeqs_to_vars = Vector{Vector{Variable}}(undef,length(eqs))
6+
7+
for (i,eq) in enumerate(eqs)
8+
depeqs_to_vars[i] = collect(extract_variables!(deps, eq, vars))
9+
empty!(deps)
10+
end
11+
end
12+
13+
equation_dependencies(sys) = extract_variables(equations(sys), states(sys))
14+
15+
# map each variable to the eqs depending on it
16+
function variables_to_depeqs(sys::AbstractSystem; equationdeps = nothing, statestoids = nothing)
17+
sts = states(sys)
18+
stoi = isnothing(statestoids) ? Dict(convert(Variable,state) => i for (i,state) in enumerate(sts)) : statestoids
19+
20+
# map from eqs to states they depend on
21+
eqdeps = isnothing(equationdeps) ? equation_dependencies(equations(sys), sts) : equationdeps
22+
23+
# reverse map and switch to integer indices of states
24+
dg = [Vector{Int}() for i = 1:length(sts)]
25+
for (k,dep) in enumerate(eqdeps)
26+
for state in dep
27+
push!(dg[stoi[state]],k)
28+
end
29+
end
30+
foreach(dep -> sort!(dep), dg)
31+
32+
dg
33+
end

src/systems/jumps/jumpsystem.jl

Lines changed: 13 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ function DiffEqBase.DiscreteProblem(sys::AbstractSystem, u0map, tspan::Tuple,
103103
DiscreteProblem(df, u0, tspan, p; kwargs...)
104104
end
105105

106+
106107
"""
107108
```julia
108109
function DiffEqBase.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
@@ -111,59 +112,34 @@ function DiffEqBase.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
111112
Generates a JumpProblem from a JumpSystem.
112113
"""
113114
function DiffEqJump.JumpProblem(js::JumpSystem, prob, aggregator; kwargs...)
114-
vrjs = Vector{VariableRateJump}()
115-
crjs = Vector{ConstantRateJump}()
116-
majs = Vector{MassActionJump}()
117-
pvars = parameters(js)
118-
statetoid = Dict(convert(Variable,state) => i for (i,state) in enumerate(states(js)))
119-
parammap = map((x,y)->Pair(x(),y),pvars,prob.p)
120-
eqs = equations(js)
121115

122-
foreach(j -> push!(majs, assemble_maj(js, j, statetoid, parammap)), eqs.x[1])
123-
foreach(j -> push!(crjs, assemble_crj(js, j, statetoid)), eqs.x[2])
124-
foreach(j -> push!(vrjs, assemble_vrj(js, j, statetoid)), eqs.x[3])
116+
statetoid = Dict(convert(Variable,state) => i for (i,state) in enumerate(states(js)))
117+
parammap = map((x,y)->Pair(x(),y), parameters(js), prob.p)
118+
eqs = equations(js)
125119

120+
majs = MassActionJump[assemble_maj(js, j, statetoid, parammap) for j in eqs.x[1]]
121+
crjs = ConstantRateJump[assemble_crj(js, j, statetoid) for j in eqs.x[2]]
122+
vrjs = VariableRateJump[assemble_vrj(js, j, statetoid) for j in eqs.x[3]]
126123
((prob isa DiscreteProblem) && !isempty(vrjs)) && error("Use continuous problems such as an ODEProblem or a SDEProblem with VariableRateJumps")
124+
127125
jset = JumpSet(Tuple(vrjs), Tuple(crjs), nothing, isempty(majs) ? nothing : majs)
128126
JumpProblem(prob, aggregator, jset)
129127
end
130128

131129

132-
### Functions to determine which jumps depend on a given state
130+
### Functions to determine which states a jump depends on
133131

134-
function ratevars!(dep, jump::Union{ConstantRateJump,VariableRateJump}, sts)
132+
function extract_variables!(dep, jump::Union{ConstantRateJump,VariableRateJump}, sts)
135133
foreach(st -> (convert(Variable,st) in sts) && push!(dep,st), vars(jump.rate))
134+
dep
136135
end
137136

138-
function ratevars!(dep, jump::MassActionJump, args...)
139-
foreach(st -> push!(dep,convert(Variable,st[1])), jump.reactant_stoch)
140-
end
141-
142-
function ratevars(jump, sts)
143-
dep = Set{Variable}()
144-
ratevars!(dep,jump,sts)
137+
function extract_variables!(dep, jump::MassActionJump, args...)
138+
foreach(st -> push!(dep,convert(Variable,st[1])), jump.reactant_stoch)
145139
dep
146140
end
147141

148-
# map each state (as an Int index) to the jumps with a rate that depend on it
149-
function statetojump_depgraph(js::JumpSystem, statestoids = nothing)
150-
sts = states(js)
151-
stoi = isnothing(statestoids) ? Dict(convert(Variable,state) => i for (i,state) in enumerate(sts)) : statestoids
152142

153-
# map from jump to states (as Variables) it depends on through the rate
154-
deps = [ratevars(eq,sts) for eq in equations(js)]
155-
156-
# reverse map and switch to integer indices of states
157-
dg = [Vector{Int}() for i = 1:length(sts)]
158-
for (k,dep) in enumerate(deps)
159-
for state in dep
160-
push!(dg[stoi[state]],k)
161-
end
162-
end
163-
foreach(dep -> sort!(dep), dg)
164-
165-
dg
166-
end
167143

168144
### Functions to determine which states are modified by a given jump
169145

0 commit comments

Comments
 (0)