code: def committor_forward(self, a, b):
          r
          u = np.zeros(self.dim)
          g = np.zeros(self.dim - 1)
          g[0] = 1.0
          g[1:] = np.cumprod(self.q[1:-1] / self.p[1:-1])
  
          """If a and b are equal the event T_b<T_a is impossible
             for any starting state x so that the committor is
             zero everywhere"""
          if a == b:
              return u
          elif a < b:
              """Birth-death chain has to hit a before it can hit b"""
              u[0:a + 1] = 0.0
              """Birth-death chain has to hit b before it can hit a"""
              u[b:] = 1.0
              """Intermediate states are given in terms of sums of g"""
              u[a + 1:b] = np.cumsum(g[a:b])[0:-1] / np.sum(g[a:b])
              return u
          else:
              u[0:b + 1] = 1.0
              u[a:] = 0.0
              u[b + 1:a] = (np.cumsum(g[b:a])[0:-1] / np.sum(g[b:a]))[::-1]
              return u
docs: r"""Forward committor for birth-and-death-chain.
  
          The forward committor is the probability to hit
          state b before hitting state a starting in state x,
  
              u_x=P_x(T_b<T_a)
  
          T_i is the first arrival time of the chain to state i,
  
              T_i = inf( t>0 | X_t=i )
  
          Parameters
          ----------
          a : int
              State index
          b : int
              State index
  
          Returns
          -------
          u : (M,) ndarray
              Vector of committor probabilities.