Tips and Tricks

The FSP approximates an infinite-dimensional system of equations by truncating it to a finite number of variables. The accuracy of the FSP therefore depends on how many variables are retained, ie.~what portion of the state space is modelled. While simple reaction networks with 1 or 2 species are not too difficult to handle using the FSP, a naive approach will require unfeasibly large truncations for systems of even moderate complexity.

Solving Linear Equations

The Chemical Master Equation is a set of linear ODEs, and there is a vast literature on efficiently solving these. FiniteStateProjection.jl currently offers two main approaches:

  • Convert a reaction system into an ODEFunction for use with DifferentialEquations.jl
  • Convert a reaction system into a sparse matrix for use with any linear ODE solver

While there are no official benchmarks yet the first method is likely going to be more efficient for systems with time-dependent reaction rates, while the second is recommended for time-homogeneous systems.

Picking a Solver

The FSP generally results in stiff equations, so using a stiff solver in generally is recommended. At the time of writing it seems like the best all-round solver is CVODE_BDF with the GMRES linear solver (requires Sundials.jl):

using Sundials


sol = solve(prob, CVODE_BDF(linear_solver=:GMRES), atol=1e-6) # very fast

For time-homogeneous systems where the right-hand side of the CME does not depend on t, solving the FSP is equivalent to computing the exponential-vector product exp(A .* t) * vec(u0), where A is the evolution operator. Here we use the vec function to flatten the state space into a vector that can be multiplied by the matrix A. We can compute the solution very efficiently using the expmv function provided by Expokit.jl:

using Expokit


ut = similar(u0)
expmv!(vec(ut), t, A, vec(u0), tol=1e-6)  # really fast

Further Comments

Choosing the right solver for large systems of ODEs can result in time savings on the order of 10-100x, and it is recommended that you experiment with a few solvers to see which works best in your case. This section is still work in progress and there has been a lot of research on accelerating the FSP and extending it to larger reaction networks which will hopefully be reviewed here soon. Feel free to share any comments or suggestions in this direction at the Github repository!