|
3 | 3 | # stochiometric coefficient.
|
4 | 4 | ###############################################################################
|
5 | 5 |
|
6 |
| -@inline function num_substrate_combos(speciesvec::AbstractVector{T}, rxidx, |
7 |
| - majump::MassActionJump) where {T} |
| 6 | +@inline function evalrxrate(speciesvec::AbstractVector{T}, rxidx, |
| 7 | + majump::MassActionJump{U})::R where {T <: Integer, R, U <: AbstractVector{R}} |
8 | 8 | val = one(T)
|
9 | 9 | @inbounds for specstoch in majump.reactant_stoch[rxidx]
|
10 | 10 | specpop = speciesvec[specstoch[1]]
|
|
14 | 14 | val *= specpop
|
15 | 15 | end
|
16 | 16 | end
|
17 |
| - |
18 |
| - return val |
19 |
| -end |
20 | 17 |
|
21 |
| -@inline function evalrxrate(speciesvec::AbstractVector{T}, rxidx, |
22 |
| - majump::MassActionJump{U})::R where {T <: Integer, R, U <: AbstractVector{R}} |
23 |
| - val = num_substrate_combos(speciesvec, rxidx, majump) |
24 | 18 | @inbounds return val * majump.scaled_rates[rxidx]
|
25 | 19 | end
|
26 | 20 |
|
27 | 21 | @inline function evalrxrate(speciesvec::AbstractVector{T}, rxidx,
|
28 | 22 | majump::MassActionJump{U})::R where {T <: Real, R, U <: AbstractVector{R}}
|
29 |
| - val = num_substrate_combos(speciesvec, rxidx, majump) |
30 |
| - @inbounds return abs(val) * majump.scaled_rates[rxidx] |
| 23 | + val = one(T) |
| 24 | + @inbounds for specstoch in majump.reactant_stoch[rxidx] |
| 25 | + specpop = speciesvec[specstoch[1]] |
| 26 | + val *= specpop |
| 27 | + @inbounds for k in 2:specstoch[2] |
| 28 | + specpop -= one(specpop) |
| 29 | + val *= specpop |
| 30 | + end |
| 31 | + # we need to check the smallest rate law term is positive |
| 32 | + # i.e. for an order k reaction: x - k + 1 > 0 |
| 33 | + (specpop <= 0) && return zero(R) |
| 34 | + end |
| 35 | + |
| 36 | + @inbounds return val * majump.scaled_rates[rxidx] |
31 | 37 | end
|
32 | 38 |
|
33 | 39 |
|
|
0 commit comments