|
1 |
| - |
2 | 1 | # each system type should define extract_variables! for a single equation
|
3 | 2 | function extract_variables(eqs, vars)
|
4 | 3 | deps = Set{Variable}()
|
5 | 4 | depeqs_to_vars = Vector{Vector{Variable}}(undef,length(eqs))
|
6 | 5 |
|
7 |
| - for (i,eq) in enumerate(eqs) |
| 6 | + for (i,eq) in enumerate(eqs) |
8 | 7 | depeqs_to_vars[i] = collect(extract_variables!(deps, eq, vars))
|
9 | 8 | empty!(deps)
|
10 | 9 | 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) |
11 | 39 | end
|
12 | 40 |
|
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 |
14 | 48 |
|
15 | 49 | # map each variable to the eqs depending on it
|
16 | 50 | function variables_to_depeqs(sys::AbstractSystem; equationdeps = nothing, statestoids = nothing)
|
17 | 51 | sts = states(sys)
|
18 | 52 | stoi = isnothing(statestoids) ? Dict(convert(Variable,state) => i for (i,state) in enumerate(sts)) : statestoids
|
19 | 53 |
|
20 | 54 | # 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 |
22 | 56 |
|
23 | 57 | # reverse map and switch to integer indices of states
|
24 | 58 | dg = [Vector{Int}() for i = 1:length(sts)]
|
|
0 commit comments