code: def kuiper(data, dtype=np.float64):  # noqa: D401
      """Kuiper's test of uniform distribution.
  
      Parameters
      ----------
      data : ndarray, shape (n_sources,) | (n_sources, n_times)
             Empirical distribution.
      dtype : str | obj
          The data type to be used.
  
      Returns
      -------
      ks : ndarray
          Kuiper's statistic.
      pk : ndarray
          Normalized probability of Kuiper's statistic [0, 1].
      """
      # if data not numpy array, implicitly convert and make to use copied data
      # ! sort data array along first axis !
      data = np.sort(data, axis=0).astype(dtype)
      shape = data.shape
      n_dim = len(shape)
      n_trials = shape[0]
  
      # create uniform cdf
      j1 = (np.arange(n_trials, dtype=dtype) + 1.0) / float(n_trials)
      j2 = np.arange(n_trials, dtype=dtype) / float(n_trials)
      if n_dim > 1:  # single phase vector (n_trials)
          j1 = j1[:, np.newaxis]
          j2 = j2[:, np.newaxis]
      d1 = (j1 - data).max(axis=0)
      d2 = (data - j2).max(axis=0)
      n_eff = n_trials
  
      d = d1 + d2  # Kuiper's statistic [n_time_slices]
  
      return d, _prob_kuiper(d, n_eff, dtype=dtype)
  
imports: import math
  import numpy
  from scipy.signal import hilbert
  from scipy.special import logsumexp
label_desc: Use image node_id 3 for calling a global function with example usage: kuiper(data, dtype) and returns: d,  _prob_kuiper