Uniformization with Sparse Updates
For a finite-state continuous-time Markov chain, uniformization expresses the transition distribution at time \(t\) as a Poisson-weighted sum of discrete-time updates. When the generator is sparse, the key computational step is not to form powers of a transition matrix: it is to multiply a row vector by the matrix one sparse update at a time. This preserves the local structure of the generator and makes it possible to check probability mass throughout the computation.
Let \((X_t)_{t\ge0}\) be a continuous-time Markov chain on a finite state space \(S=\{1,\ldots,d\}\), defined on a probability space \((\Omega,\mathcal{F},\mathbb{P})\). Its generator is \(Q=(q_{ij})\): for \(i\ne j\), \(q_{ij}\ge0\), and every row sums to zero. Write \(q_i=-q_{ii}=\sum_{j\ne i}q_{ij}\) for the exit rate from state \(i\). Suppose the initial distribution is the row vector \(\mu\), so that \(\mu_i=\mathbb{P}(X_0=i)\). We seek the row vector \(\mu(t)=\mu P(t)\), where \(P(t)=e^{tQ}\).
The choice \(\nu>0\) is required even if all exit rates are zero; in that case any positive \(\nu\) works and \(R=I\). For every allowed \(\nu\), the diagonal entry \(R_{ii}=1-q_i/\nu\) is nonnegative, and the off-diagonal entries are \(R_{ij}=q_{ij}/\nu\). The row sum is \(1-q_i/\nu+\sum_{j\ne i}q_{ij}/\nu=1\). The diagonal entries represent steps at which the discrete-time chain stays in its current state.
Here is the sparse calculation. Store the nonzero entries \(R_{ij}\), including any nonzero diagonal entries. Given a row vector \(\alpha_k\), initialize a zero row vector \(\alpha_{k+1}\), and for each nonzero \(R_{ij}\), add \(\alpha_k(i)R_{ij}\) to coordinate \(j\). Separately generate the weights using \(w_0=e^{-\theta}\) and \(w_{k+1}=w_k\theta/(k+1)\). This requires no dense matrix powers. If \(R\) has \(m\) nonzero entries, each vector update takes \(O(m)\) arithmetic operations, rather than the \(O(d^2)\) operations of a dense matrix-vector multiplication.
Why the Updates and Mass Checks Work
The two facts that support the algorithm are that each update remains a probability distribution and that omitting Poisson terms has a directly measurable mass cost. The first fact makes mass checks useful during implementation; the second makes truncation a controlled approximation rather than an unexplained loss of probability.
Proof. First, \(R\) is row-stochastic by the entry and row-sum calculation above. Since \(\alpha_0=\mu\) is a probability row vector, multiplication by \(R\) preserves nonnegativity and total mass: if \(\alpha_k\) is a probability row vector, then \((\alpha_kR)_j=\sum_i\alpha_k(i)R_{ij}\ge0\), and \(\sum_j(\alpha_kR)_j=\sum_i\alpha_k(i)\sum_jR_{ij}=\sum_i\alpha_k(i)=1\). Induction proves the claim for every \(k\).
For the evolution identity, \(Q=\nu(R-I)\), and \(R\) commutes with \(I\). The matrix exponential therefore factors as \(e^{tQ}=e^{-\nu t}e^{\nu tR}\). Expanding the second exponential in its convergent power series gives \(e^{tQ}=e^{-\nu t}\sum_{k=0}^{\infty}(\nu t)^kR^k/k!=\sum_{k=0}^{\infty}w_kR^k\). Multiplying on the left by \(\mu\) gives the asserted sum because \(\alpha_k=\mu R^k\), which follows by induction from the update rule. Finally, \(\widetilde{\mu}_K(t)\) has mass \(\sum_{k=0}^K w_k\), since each \(\alpha_k\) has mass one. The difference from the full sum is the nonnegative row vector \(\sum_{k>K}w_k\alpha_k\). Its \(L^1\) norm, defined as the sum of the absolute values of its coordinates, is its total mass, \(\sum_{k>K}w_k\sum_j\alpha_k(j)=\sum_{k>K}w_k\). \(\square\)
In particular, the truncated vector is generally a subprobability vector, not a probability vector. Its missing mass is exactly the omitted Poisson tail. To choose \(K\), use a Poisson tail bound or compute the tail to the desired tolerance. Do not silently interpret a small mass deficit as an error in the Markov-chain updates: the update vectors should each have mass one, while the truncated weighted sum should have mass equal to the included Poisson weights.
Worked Sparse Calculations
Worked Example: A Three-State Chain and an Explicit Truncation Check
Consider \(S=\{0,1,2\}\) and the generator
The row sums are \(-2+2+0=0\), \(1-2+1=0\), and \(0+3-3=0\), so this is a generator. The exit rates are \(2,2,3\); choose \(\nu=3\), and start in state \(0\), so \(\mu=\alpha_0=(1,0,0)\). The uniformized matrix is
Its row sums are \(\tfrac13+\tfrac23=1\), \(\tfrac13+\tfrac13+\tfrac13=1\), and \(1=1\). Take \(t=\tfrac13\), so \(\theta=\nu t=1\). The sparse updates are
For example, the first coordinate of \(\alpha_2\) receives \(\tfrac13\cdot\tfrac13\) from state \(0\) and \(\tfrac23\cdot\tfrac13\) from state \(1\). The coordinates of \(\alpha_1,\alpha_2,\alpha_3\) sum respectively to \(1\), \(1\), and \((7+16+4)/27=1\). Truncate at \(K=3\). The weights are \(e^{-1},e^{-1},e^{-1}/2,e^{-1}/6\). The resulting vector is
For instance, the first coefficient inside the parentheses is \(1+\tfrac13+\tfrac12\cdot\tfrac13+\tfrac16\cdot\tfrac7{27}=\tfrac{125}{81}\); the second is \(\tfrac23+\tfrac12\cdot\tfrac49+\tfrac16\cdot\tfrac{16}{27}=\tfrac{80}{81}\); the third is \(\tfrac12\cdot\tfrac29+\tfrac16\cdot\tfrac4{27}=\tfrac{11}{81}\). The coefficient sum is \((125+80+11)/81=216/81=8/3\), exactly the included Poisson-weight sum \(1+1+\tfrac12+\tfrac16=8/3\). Thus the truncated mass is \(8/(3e)\), and the omitted mass is \(1-8/(3e)\). This checks the computation without treating the truncated vector as fully normalized.
Worked Example: Sparse Scatter Updates on a Four-State Cycle
Let the states be \(S=\{0,1,2,3\}\). From state \(0\) the chain jumps to \(1\) at rate \(2\); from \(1\) it jumps to \(2\) at rate \(1\); from \(2\) it jumps to \(3\) at rate \(2\); and from \(3\) it jumps to \(0\) at rate \(1\). The generator is
The row sums are \(-2+2=0\), \(-1+1=0\), \(-2+2=0\), and \(1-1=0\). Choose \(\nu=2\), the largest exit rate. Then
The row sums are \(1\), \(\tfrac12+\tfrac12=1\), \(1\), and \(\tfrac12+\tfrac12=1\). Starting with \(\alpha_0=(1,0,0,0)\), the successive updates are \(\alpha_1=(0,1,0,0)\) and \(\alpha_2=(0,\tfrac12,\tfrac12,0)\). For the second update, the mass at state \(1\) splits equally between states \(1\) and \(2\). Both vectors have mass one.
At \(t=\tfrac12\), \(\theta=1\). Truncating at \(K=2\) gives weights \(e^{-1},e^{-1},e^{-1}/2\), hence
The coordinates come from \(\alpha_0+\alpha_1+\tfrac12\alpha_2\): state \(0\) receives \(1\); state \(1\) receives \(1+\tfrac14=\tfrac54\); and state \(2\) receives \(\tfrac14\). Their sum is \(1+\tfrac54+\tfrac14=\tfrac52\), equal to the included weight sum \(1+1+\tfrac12=\tfrac52\). The truncated mass is \(5/(2e)\), so the omitted Poisson mass is \(1-5/(2e)\).
Worked Example: A Larger Uniformization Rate Creates Self-Loops
Consider \(S=\{0,1,2\}\), where the rate from \(0\) to \(1\) is \(1\), the rate from \(1\) to \(2\) is \(2\), and state \(2\) is absorbing. Thus
The row sums are \(-1+1=0\), \(-2+2=0\), and \(0\). The largest exit rate is \(2\); choose the larger valid rate \(\nu=4\). Then
The row sums are \(\tfrac34+\tfrac14=1\), \(\tfrac12+\tfrac12=1\), and \(1\). From \(\mu=\alpha_0=(1,0,0)\), the first two updates are \(\alpha_1=(\tfrac34,\tfrac14,0)\) and \(\alpha_2=(\tfrac9{16},\tfrac5{16},\tfrac18)\). In the second update, state \(0\) contributes \(\tfrac9{16}\) to state \(0\) and \(\tfrac3{16}\) to state \(1\); the mass \(\tfrac14\) at state \(1\) contributes \(\tfrac18\) to state \(1\) and \(\tfrac18\) to state \(2\). The resulting coordinates sum to \((9+5+2)/16=1\).
At \(t=\tfrac14\), \(\theta=1\). Truncating at \(K=2\) gives
Indeed, the three coordinates inside the parentheses are \(1+\tfrac34+\tfrac12\cdot\tfrac9{16}=\tfrac{65}{32}\), \(\tfrac14+\tfrac12\cdot\tfrac5{16}=\tfrac{13}{32}\), and \(\tfrac12\cdot\tfrac18=\tfrac2{32}\). The coefficient sum is \(80/32=5/2\), matching \(1+1+\tfrac12\), the included Poisson weights. The larger rate has added self-loops, but the update remains sparse and its probability-mass check is unchanged.
Implementation Checks and a Common Mistake
At every iteration, check that the update vector has nonnegative entries and sums to one, allowing for small floating-point roundoff in numerical implementations. Check separately that the accumulated truncated vector has mass equal to the sum of the weights included so far. These are different checks: normalizing the truncated vector to mass one conceals the omitted Poisson tail and changes the approximation.
Common mistake: using a column-vector update with a row-stochastic matrix. In the four-state cycle example, the initial row vector is \((1,0,0,0)\), and the correct update is \(\alpha_1=\alpha_0R=(0,1,0,0)\). If one instead applies \(R\) to the column vector \((1,0,0,0)^{\mathsf T}\), the result is \((0,0,0,\tfrac12)^{\mathsf T}\), which is not even a probability vector. The convention here is that distributions are row vectors and update by right multiplication. A separate common error is to renormalize a truncated sum: in the same example its mass at \(K=2\) is \(5/(2e)\), not one. That deficit is the exact omitted Poisson mass, not a failure of the individual sparse updates.
Uniformization is useful when the generator has few transitions out of each state, as in network models and large sparse state-space approximations. Its computational advantage depends on exploiting that sparsity in each update; explicitly forming \(R^k\) defeats that purpose. The mass identities also provide a practical diagnostic: an update vector whose mass differs materially from one indicates an indexing, orientation, or accumulation error, whereas a truncated sum has a predictable deficit determined by the Poisson weights.
Check Your Understanding
Use row vectors throughout, and distinguish the mass of each update from the mass of a truncated Poisson sum.
- For a finite generator with maximum exit rate \(q_{\max}\), state the conditions on \(\nu\) that make \(R=I+Q/\nu\) row-stochastic, including the case \(q_{\max}=0\).
- Why does the recurrence \(\alpha_{k+1}=\alpha_kR\) preserve total probability mass?
- If the Poisson sum is truncated at \(K\), what is the total mass of the resulting vector, and what is its \(L^1\) error from the full vector?
- For the four-state cycle, calculate the first update from the initial distribution concentrated at state \(0\). Explain why multiplying a column vector by \(R\) is not the prescribed update.
- In the three-state larger-rate example, identify the self-loop probabilities introduced by \(\nu=4\), and verify that each row of \(R\) still sums to one.