docs: def _to_torch(Z, dtype=None):
          """Converts a None, list, np.ndarray, or torch.Tensor to torch.Tensor;
          also handles converting sparse input to dense."""
          if Z is None:
              return None
          elif issparse(Z):
              Z = torch.from_numpy(Z.toarray())
          elif isinstance(Z, torch.Tensor):
              pass
          elif isinstance(Z, list):
              Z = torch.from_numpy(np.array(Z))
          elif isinstance(Z, np.ndarray):
              Z = torch.from_numpy(Z)
          else:
              msg = (
                  f"Expected list, numpy.ndarray or torch.Tensor, "
                  f"got {type(Z)} instead."
              )
              raise Exception(msg)
  
          return Z.type(dtype) if dtype else Z