docs: def get_variable_errors(X, L, LX, Z, U, step_g, e_rel, e_abs=0):
      """Get the errors in a single multiplier method step
  
      For a given linear operator A, (and its dot product with X to save time),
      calculate the errors in the prime and dual variables, used by the
      Boyd 2011 Section 3 stopping criteria.
      """
      n = X.size
      p = Z.size
      e_pri2 = np.sqrt(p)*e_abs/L.spectral_norm + e_rel*np.max([l2(LX), l2(Z)])
      if step_g is not None:
          e_dual2 = np.sqrt(n)*e_abs/L.spectral_norm + e_rel*l2(L.T.dot(U)/step_g)
      else:
          e_dual2 = np.sqrt(n)*e_abs/L.spectral_norm + e_rel*l2(L.T.dot(U))
      return e_pri2, e_dual2