docs: def from_hyperplane(basis, origin, point, internal = True):
          """
          Returns a Halfspace defined by a list of vectors parallel to the
          bounding hyperplane.
  
          Args:
              basis: basis for the hyperplane (array with vector rows)
              origin: point on the hyperplane
              point: point not on the hyperplane
              internal: whether point is inside the halfspace
          """
          basis = np.array(basis)
          assert basis.shape[0] + 1 == basis.shape[1]
  
          big_basis = np.zeros((basis.shape[1], basis.shape[1]))
          big_basis[:basis.shape[0],:basis.shape[1]] = basis
  
          u, s, vh = np.linalg.svd(big_basis)
          null_mask = (s <= 1e-8)
          normal = np.compress(null_mask, vh, axis=0)[0]
  
          if np.inner(np.array(point)-np.array(origin), normal) > 0:
              if internal:
                  normal *= -1
          else:
              if not internal:
                  normal *= -1
          offset = -np.dot(origin, normal)
          return Halfspace(normal, offset)