code: def rotate_zonal_harmonics(
      zonal_coeffs: TensorLike,
      theta: TensorLike,
      phi: TensorLike,
      name: str = "spherical_harmonics_rotate_zonal_harmonics",
  ) -> TensorLike:
      """Rotates zonal harmonics.
  
      Note:
        In the following, A1 to An are optional batch dimensions.
  
      Args:
        zonal_coeffs: A tensor of shape `[C]` storing zonal harmonics coefficients.
        theta: A tensor of shape `[A1, ..., An, 1]` storing polar angles.
        phi: A tensor of shape `[A1, ..., An, 1]` storing azimuthal angles.
        name: A name for this op. Defaults to
          "spherical_harmonics_rotate_zonal_harmonics".
  
      Returns:
        A tensor of shape `[A1, ..., An, C*C]` storing coefficients of the rotated
        harmonics.
  
      Raises:
        ValueError: If the shape of `zonal_coeffs`, `theta` or `phi` is not
          supported.
      """
      with tf.name_scope(name):
          zonal_coeffs = tf.convert_to_tensor(value=zonal_coeffs)
          theta = tf.convert_to_tensor(value=theta)
          phi = tf.convert_to_tensor(value=phi)
  
          shape.check_static(
              tensor=zonal_coeffs,
              tensor_name="zonal_coeffs",
              has_rank=1,
          )
          shape.check_static(
              tensor=phi, tensor_name="phi", has_dim_equals=(-1, 1)
          )
          shape.check_static(
              tensor=theta, tensor_name="theta", has_dim_equals=(-1, 1)
          )
          shape.compare_batch_dimensions(
              tensors=(theta, phi),
              last_axes=-2,
              tensor_names=("theta", "phi"),
              broadcast_compatible=False,
          )
  
          tiled_zonal_coeffs = tile_zonal_coefficients(zonal_coeffs)
          max_band = zonal_coeffs.shape.as_list()[-1]
          l, m = generate_l_m_permutations(max_band - 1)
          broadcast_shape = (
              theta.shape.as_list()[:-1] + l.shape.as_list()
          )
          l_broadcasted = tf.broadcast_to(l, broadcast_shape)
          m_broadcasted = tf.broadcast_to(m, broadcast_shape)
          n_star = tf.sqrt(
              4.0 * np.pi / (2.0 * tf.cast(l, dtype=theta.dtype) + 1.0)
          )
          return (
              n_star
              * tiled_zonal_coeffs
              * evaluate_spherical_harmonics(
                  l_broadcasted, m_broadcasted, theta, phi
              )
          )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from typing import Tuple
  import numpy
  from six.moves import range
  import tensorflow
  from tensorflow_graphics.math import math_helpers
  from tensorflow_graphics.math import vector
  from tensorflow_graphics.util import asserts
  from tensorflow_graphics.util import export_api
  from tensorflow_graphics.util import shape
  from tensorflow_graphics.util.type_alias import TensorLike
label_desc: Use image node_id 13 for calling a global function with example usage: rotate_zonal_harmonics(zonal_coeffs, theta, phi, name) and returns: unknown