class_docstr: Base class to represent the So3 group.
  
  The SO(3) is the group of all rotations about the origin of three-dimensional Euclidean space
  :math:`R^3` under the operation of composition.
  See more: https://en.wikipedia.org/wiki/3D_rotation_group
  
  We internally represent the rotation by a unit quaternion.
  
  Example:
      >>> q = Quaternion.identity()
      >>> s = So3(q)
      >>> s.q
      Parameter containing:
      tensor([1., 0., 0., 0.], requires_grad=True)
class_docstr_tok: ["Base","class","to","represent","the","So3","group",".","The","SO","(","3",")","is","the","group","of","all","rotations","about","the","origin","of","three-dimensional","Euclidean","space",":","math",":","`","R^3","`","under","the","operation","of","composition",".","See","more",":","https",":","\/\/en.wikipedia.org\/wiki\/3D_rotation_group","We","internally","represent","the","rotation","by","a","unit","quaternion",".","Example",":",">",">",">","q","=","Quaternion.identity","(",")",">",">",">","s","=","So3","(","q",")",">",">",">","s.q","Parameter","containing",":","tensor","(","[","1.",",","0.",",","0.",",","0",".","]",",","requires_grad=True",")"]
docstr: Converts elements of lie group  to elements of lie algebra.
  
  Example:
      >>> data = torch.ones((2, 4))
      >>> q = Quaternion(data)
      >>> So3(q).log()
      tensor([[0., 0., 0.],
              [0., 0., 0.]], grad_fn=<WhereBackward0>)
docstr_tok: ["Converts","elements","of","lie","group","to","elements","of","lie","algebra",".","Example",":",">",">",">","data","=","torch.ones","(","(","2",",","4",")",")",">",">",">","q","=","Quaternion","(","data",")",">",">",">","So3","(","q",")",".log","(",")","tensor","(","[","[","0.",",","0.",",","0",".","]",",","[","0.",",","0.",",","0",".","]","]",",","grad_fn=","<","WhereBackward0",">",")"]
code: def log(self) -> Tensor:
      """Converts elements of lie group  to elements of lie algebra.
  
      Example:
          >>> data = torch.ones((2, 4))
          >>> q = Quaternion(data)
          >>> So3(q).log()
          tensor([[0., 0., 0.],
                  [0., 0., 0.]], grad_fn=<WhereBackward0>)
      """
      theta = batched_dot_product(self.q.vec, self.q.vec).sqrt()
      # NOTE: this differs from https://github.com/strasdat/Sophus/blob/master/sympy/sophus/so3.py#L33
      omega = where(
          theta[..., None] != 0,
          2
          * self.q.real[..., None].acos()
          * self.q.vec
          / theta[..., None],
          2 * self.q.vec / self.q.real[..., None],
      )
      return omega
  
imports: from __future__ import annotations
  from typing import Optional
  from kornia.core import Device, Dtype, Module, Tensor, concatenate, eye, stack, tensor, where, zeros, zeros_like
  from kornia.core.check import KORNIA_CHECK_TYPE
  from kornia.geometry.conversions import vector_to_skew_symmetric_matrix
  from kornia.geometry.linalg import batched_dot_product
  from kornia.geometry.quaternion import Quaternion
  from kornia.geometry.vector import Vector3
label_desc: Use image node_id 7 for calling the So3 obj's underlying member method code with example usage: obj.log() and returns: omega