class_docstr: Base class to represent the So2 group.
  
  The SO(2) is the group of all rotations about the origin of two-dimensional Euclidean space
  :math:`R^2` under the operation of composition.
  See more: https://en.wikipedia.org/wiki/Orthogonal_group#Special_orthogonal_group
  
  We internally represent the rotation by a complex number.
  
  Example:
      >>> real = torch.tensor([1.0])
      >>> imag = torch.tensor([2.0])
      >>> So2(torch.complex(real, imag))
      Parameter containing:
      tensor([1.+2.j], requires_grad=True)
docstr: Performs a left-multiplication either rotation concatenation or point-transform.
  
  Args:
      right: the other So2 transformation.
  
  Return:
      The resulting So2 transformation.
docstr_tok: ["Performs","a","left-multiplication","either","rotation","concatenation","or","point-transform",".","Args",":","right",":","the","other","So2","transformation",".","Return",":","The","resulting","So2","transformation","."]
code: def __mul__(self, right: So2 | Tensor) -> So2 | Tensor:
      """Performs a left-multiplication either rotation concatenation or point-transform.
  
      Args:
          right: the other So2 transformation.
  
      Return:
          The resulting So2 transformation.
      """
      z = self.z
      if isinstance(right, So2):
          return So2(z * right.z)
      elif isinstance(right, (Vector2, Tensor)):
          # TODO change to KORNIA_CHECK_SHAPE once there is multiple shape support
          if isinstance(right, Tensor):
              check_so2_t_shape(right)
          x = right.data[..., 0]
          y = right.data[..., 1]
          real = z.real
          imag = z.imag
          out = stack((real * x - imag * y, imag * x + real * y), -1)
          if isinstance(right, Tensor):
              return out
          else:
              return Vector2(out)
      else:
          raise TypeError(f"Not So2 or Tensor type. Got: {type(right)}")
  
imports: from __future__ import annotations
  from typing import Optional, overload
  from kornia.core import Device, Dtype, Module, Parameter, Tensor, complex, rand, stack, tensor, zeros_like
  from kornia.core.check import KORNIA_CHECK, KORNIA_CHECK_IS_TENSOR
  from kornia.geometry.liegroup._utils import check_so2_matrix, check_so2_matrix_shape, check_so2_t_shape, check_so2_theta_shape, check_so2_z_shape
  from kornia.geometry.vector import Vector2
label_desc: Use image node_id 6 for calling the So2 obj's underlying member method code with example usage: obj.__mul__(right) and returns: So2, out, Vector2