Skip to content

Commit d6ab464

Browse files
committed
eq to var dependencies
1 parent c14933a commit d6ab464

File tree

4 files changed

+60
-10
lines changed

4 files changed

+60
-10
lines changed

src/ModelingToolkit.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export Differential, expand_derivatives, @derivatives
119119
export IntervalDomain, ProductDomain, , CircleDomain
120120
export Equation, ConstrainedEquation
121121
export Operation, Expression, Variable
122-
export independent_variable, states, parameters, equations
122+
export independent_variable, states, parameters, equations
123+
export numstates, numparameters, numequations
123124

124125
export calculate_jacobian, generate_jacobian, generate_function
125126
export calculate_tgrad, generate_tgrad

src/systems/abstractsystem.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ function parameters(sys::AbstractSystem,args...)
203203
rename(x,renamespace(sys.name,newname))()
204204
end
205205

206+
numstates(sys::AbstractSystem) = length(states(sys))
207+
numparameters(sys::AbstractSystem) = length(parameters(sys))
208+
numequations(sys::AbstractSystem) = length(equations(sys))
209+
206210
struct AbstractSysToExpr
207211
sys::AbstractSystem
208212
states::Vector{Variable}

src/systems/dependency_graphs.jl

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,58 @@
1-
21
# each system type should define extract_variables! for a single equation
32
function extract_variables(eqs, vars)
43
deps = Set{Variable}()
54
depeqs_to_vars = Vector{Vector{Variable}}(undef,length(eqs))
65

7-
for (i,eq) in enumerate(eqs)
6+
for (i,eq) in enumerate(eqs)
87
depeqs_to_vars[i] = collect(extract_variables!(deps, eq, vars))
98
empty!(deps)
109
end
10+
11+
depeqs_to_vars
12+
end
13+
14+
# variables equations depend on as a vector of vectors of variables
15+
equation_dependencies(sys::AbstractSystem; variables=states(sys)) = extract_variables(equations(sys), variables)
16+
17+
# modeled on LightGraphs SimpleGraph
18+
mutable struct BiPartiteGraph{T <: Integer}
19+
ne::Int
20+
fadjlist::Vector{Vector{T}} # fadjlist[src] = [dest1,dest2,...]
21+
badjlist::Vector{Vector{T}} # badjlist[dst] = [src1,src2,...]
22+
end
23+
24+
# convert equation-variable dependencies to a bipartite graph
25+
function asgraph(eqdeps, vtois)
26+
fadjlist = Vector{Vector{Int}}(undef, length(eqdeps))
27+
for (i,dep) in enumerate(eqdeps)
28+
fadjlist[i] = sort!([vtois[var] for var in dep])
29+
end
30+
31+
badjlist = [Vector{Int}() for i = 1:length(vtois)]
32+
ne = 0
33+
for (eqidx,vidxs) in enumerate(fadjlist)
34+
foreach(vidx -> push!(badjlist[vidx], eqidx), vidxs)
35+
ne += 1
36+
end
37+
38+
BiPartiteGraph(ne, fadjlist, badjlist)
1139
end
1240

13-
equation_dependencies(sys) = extract_variables(equations(sys), states(sys))
41+
# could be made to directly generate graph and save memory
42+
function asgraph(sys::AbstractSystem; variables=nothing, variablestoids=nothing)
43+
vs = isnothing(variables) ? states(sys) : variables
44+
eqdeps = extract_variables(equations(sys), vs)
45+
vtois = isnothing(variablestoids) ? Dict(convert(Variable, v) => i for (i,v) in enumerate(vs)) : variablestoids
46+
asgraph(eqdeps, vtois)
47+
end
1448

1549
# map each variable to the eqs depending on it
1650
function variables_to_depeqs(sys::AbstractSystem; equationdeps = nothing, statestoids = nothing)
1751
sts = states(sys)
1852
stoi = isnothing(statestoids) ? Dict(convert(Variable,state) => i for (i,state) in enumerate(sts)) : statestoids
1953

2054
# map from eqs to states they depend on
21-
eqdeps = isnothing(equationdeps) ? equation_dependencies(equations(sys), sts) : equationdeps
55+
eqdeps = isnothing(equationdeps) ? equation_dependencies(sys) : equationdeps
2256

2357
# reverse map and switch to integer indices of states
2458
dg = [Vector{Int}() for i = 1:length(sts)]

src/systems/jumps/jumpsystem.jl

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,25 @@ end
128128

129129

130130
### Functions to determine which states a jump depends on
131-
132-
function extract_variables!(dep, jump::Union{ConstantRateJump,VariableRateJump}, sts)
133-
foreach(st -> (convert(Variable,st) in sts) && push!(dep,st), vars(jump.rate))
131+
function extract_variables!(dep, jump::Union{ConstantRateJump,VariableRateJump}, variables)
132+
foreach(var -> (var in variables) && push!(dep, var), vars(jump.rate))
134133
dep
135134
end
136135

137-
function extract_variables!(dep, jump::MassActionJump, args...)
138-
foreach(st -> push!(dep,convert(Variable,st[1])), jump.reactant_stoch)
136+
function extract_variables!(dep, jump::MassActionJump, variables)
137+
jsr = jump.scaled_rates
138+
139+
if jsr isa Variable
140+
(jsr in variables) && push!(dep, jsr)
141+
elseif jsr isa Operation
142+
foreach(var -> (var in variables) && push!(dep, var), vars(jsr))
143+
end
144+
145+
for varasop in jump.reactant_stoch
146+
var = convert(Variable, varasop[1])
147+
(var in variables) && push!(dep, var)
148+
end
149+
139150
dep
140151
end
141152

0 commit comments

Comments
 (0)