|
1 |
| -using Catalyst, GraphMakie, CairoMakie, Graphs |
| 1 | +using Catalyst, GraphMakie, CairoMakie, Graphs, SparseArrays |
2 | 2 | include("../test_networks.jl")
|
3 | 3 |
|
4 | 4 | # Test that speciesreactiongraph is generated correctly
|
|
77 | 77 | srg = CGME.MultiGraphWrap(rn)
|
78 | 78 | s = length(species(rn))
|
79 | 79 | @test ne(srg) == 8
|
80 |
| - @test Graphs.Edge(3, s+2) ∈ srg.rateedges |
81 |
| - @test Graphs.Edge(2, s+3) ∈ srg.rateedges |
| 80 | + @test Graphs.Edge(3, s+2) ∈ srg.multiedges |
| 81 | + @test Graphs.Edge(2, s+3) ∈ srg.multiedges |
82 | 82 | # Since B is both a dep and a reactant
|
83 | 83 | @test count(==(Graphs.Edge(2, s+3)), edges(srg)) == 2
|
84 | 84 |
|
|
103 | 103 | @test count(==(Graphs.Edge(1, s+2)), edges(srg)) == 2
|
104 | 104 | @test count(==(Graphs.Edge(2, s+3)), edges(srg)) == 2
|
105 | 105 | end
|
| 106 | + |
| 107 | +function test_edgeorder(rn) |
| 108 | + # The initial edgelabels in `plot_complexes` is given by the order of reactions in reactions(rn). |
| 109 | + D = incidencemat(rn; sparse=true); img = incidencematgraph(rn) |
| 110 | + rxs = reactions(rn) |
| 111 | + edgelist = Vector{Graphs.SimpleEdge{Int}}() |
| 112 | + rows = rowvals(D) |
| 113 | + vals = nonzeros(D) |
| 114 | + |
| 115 | + for (i, rx) in enumerate(rxs) |
| 116 | + inds = nzrange(D, i) |
| 117 | + val = vals[inds] |
| 118 | + row = rows[inds] |
| 119 | + (sub, prod) = val[1] == -1 ? (row[1], row[2]) : (row[2], row[1]) |
| 120 | + push!(edgelist, Graphs.SimpleEdge(sub, prod)) |
| 121 | + end |
| 122 | + |
| 123 | + rxorder = sortperm(edgelist); sortededgelist = edgelist[rxorder] |
| 124 | + multiedges = Vector{Graphs.SimpleEdge{Int}}() |
| 125 | + for i in 2:length(sortededgelist) |
| 126 | + isequal(sortededgelist[i], sortededgelist[i-1]) && push!(multiedges, sortededgelist[i]) |
| 127 | + end |
| 128 | + img_ = CGME.MultiGraphWrap(img, multiedges) |
| 129 | + |
| 130 | + # Label iteration order is given by edgelist[rxorder. Actual edge drawing iteration order is given by edges(g) |
| 131 | + @test edgelist[rxorder] == Graphs.edges(img_) |
| 132 | + return rxorder |
| 133 | +end |
| 134 | + |
| 135 | +# Test edge order for complexes. |
| 136 | +let |
| 137 | + # Multiple edges |
| 138 | + rn = @reaction_network begin |
| 139 | + k1, A --> B |
| 140 | + (k2, k3), C <--> D |
| 141 | + k4, A --> B |
| 142 | + end |
| 143 | + rxorder = test_edgeorder(rn) |
| 144 | + edgelabels = [repr(rx.rate) for rx in reactions(rn)] |
| 145 | + # Test internal order of labels is preserved |
| 146 | + @test edgelabels[rxorder][1] == "k1" |
| 147 | + @test edgelabels[rxorder][2] == "k4" |
| 148 | + |
| 149 | + # Multiple edges with species dependencies |
| 150 | + rn = @reaction_network begin |
| 151 | + k1, A --> B |
| 152 | + (k2, k3), C <--> D |
| 153 | + k4, A --> B |
| 154 | + hillr(D, α, K, n), C --> D |
| 155 | + k5*B, A --> B |
| 156 | + end |
| 157 | + rxorder = test_edgeorder(rn) |
| 158 | + edgelabels = [repr(rx.rate) for rx in reactions(rn)] |
| 159 | + labels = ["k1", "k4", "k5*B(t)", "k2", "Catalyst.hillr(D(t), α, K, n)", "k3"] |
| 160 | + @test edgelabels[rxorder] == labels |
| 161 | + |
| 162 | + rs = @reaction_network begin |
| 163 | + ka, Depot --> Central |
| 164 | + (k12, k21), Central <--> Peripheral |
| 165 | + ke, Central --> 0 |
| 166 | + end |
| 167 | + test_edgeorder(rs) |
| 168 | + |
| 169 | + rn = @reaction_network begin |
| 170 | + (k1, k2), A <--> B |
| 171 | + k3, C --> B |
| 172 | + (α, β), (A, B) --> C |
| 173 | + k4, B --> A |
| 174 | + (k5, k6), B <--> A |
| 175 | + k7, B --> C |
| 176 | + (k8, k9), C <--> A |
| 177 | + (k10, k11), (A, C) --> B |
| 178 | + (k12, k13), (C, B) --> A |
| 179 | + end |
| 180 | + rxorder = test_edgeorder(rn) |
| 181 | + edgelabels = [repr(rx.rate) for rx in reactions(rn)] |
| 182 | + @test edgelabels[rxorder][1:3] == ["k1", "k6", "k10"] |
| 183 | +end |
0 commit comments