docs: def _compute_period(self):
          """
          Set ``self._period`` and ``self._cyclic_components_proj``.
  
          Use the algorithm described in:
          J. P. Jarvis and D. R. Shier,
          "Graph-Theoretic Analysis of Finite Markov Chains," 1996.
  
          """
          # Degenerate graph with a single node (which is strongly connected)
          # csgraph.reconstruct_path would raise an exception
          # github.com/scipy/scipy/issues/4018
          if self.n == 1:
              if self.csgraph[0, 0] == 0:  # No edge: "trivial graph"
                  self._period = 1  # Any universally accepted definition?
                  self._cyclic_components_proj = np.zeros(self.n, dtype=int)
                  return None
              else:  # Self loop
                  self._period = 1
                  self._cyclic_components_proj = np.zeros(self.n, dtype=int)
                  return None
  
          if not self.is_strongly_connected:
              raise NotImplementedError(
                  'Not defined for a non strongly-connected digraph'
              )
  
          if np.any(self.csgraph.diagonal() > 0):
              self._period = 1
              self._cyclic_components_proj = np.zeros(self.n, dtype=int)
              return None
  
          # Construct a breadth-first search tree rooted at 0
          node_order, predecessors = \
              csgraph.breadth_first_order(self.csgraph, i_start=0)
          bfs_tree_csr = \
              csgraph.reconstruct_path(self.csgraph, predecessors)
  
          # Edges not belonging to tree_csr
          non_bfs_tree_csr = self.csgraph - bfs_tree_csr
          non_bfs_tree_csr.eliminate_zeros()
  
          # Distance to 0
          level = np.zeros(self.n, dtype=int)
          for i in range(1, self.n):
              level[node_order[i]] = level[predecessors[node_order[i]]] + 1
  
          # Determine the period
          d = 0
          for node_from, node_to in _csr_matrix_indices(non_bfs_tree_csr):
              value = level[node_from] - level[node_to] + 1
              d = gcd(d, value)
              if d == 1:
                  self._period = 1
                  self._cyclic_components_proj = np.zeros(self.n, dtype=int)
                  return None
  
          self._period = d
          self._cyclic_components_proj = level % d