code: def normalize(
      quaternion: type_alias.TensorLike,
      eps: type_alias.Float = 1e-12,
      name: str = "quaternion_normalize",
  ) -> tf.Tensor:
      """Normalizes a quaternion.
  
      Note:
        In the following, A1 to An are optional batch dimensions.
  
      Args:
        quaternion:  A tensor of shape `[A1, ..., An, 4]`, where the last dimension
          represents a quaternion.
        eps: A lower bound value for the norm that defaults to 1e-12.
        name: A name for this op that defaults to "quaternion_normalize".
  
      Returns:
        A N-D tensor of shape `[?, ..., ?, 1]` where the quaternion elements have
        been normalized.
  
      Raises:
        ValueError: If the shape of `quaternion` is not supported.
      """
      with tf.name_scope(name):
          quaternion = tf.convert_to_tensor(value=quaternion)
  
          shape.check_static(
              tensor=quaternion,
              tensor_name="quaternion",
              has_dim_equals=(-1, 4),
          )
  
          return tf.math.l2_normalize(quaternion, axis=-1, epsilon=eps)
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from typing import List
  from six.moves import range
  import tensorflow
  from tensorflow_graphics.geometry.transformation import rotation_matrix_3d
  from tensorflow_graphics.math import vector
  from tensorflow_graphics.util import asserts
  from tensorflow_graphics.util import export_api
  from tensorflow_graphics.util import safe_ops
  from tensorflow_graphics.util import shape
  from tensorflow_graphics.util import type_alias
label_desc: Use image node_id 10 for calling a global function with example usage: normalize(quaternion, eps, name) and returns: tf