parameters: (self, right)
docstring: left-multiplication
              either rotation concatenation or point-transform
docstring_summary: left-multiplication
              either rotation concatenation or point-transform
docstring_tokens: left - multiplication either rotation concatenation or point - transform
function: def __mul__(self, right):
          """ left-multiplication
              either rotation concatenation or point-transform """
          if isinstance(right, sympy.Matrix):
              assert right.shape == (3, 1), right.shape
              return (self.q * sophus.Quaternion(0, right) * self.q.conj()).vec
          elif isinstance(right, So3):
              return So3(self.q * right.q)
          assert False, "unsupported type: {0}".format(type(right))
function_tokens: def __mul__ ( self , right ) : if isinstance ( right , sympy . Matrix ) : assert right . shape == ( 3 , 1 ) , right . shape return ( self . q * sophus . Quaternion ( 0 , right ) * self . q . conj ( ) ) . vec elif isinstance ( right , So3 ) : return So3 ( self . q * right . q ) assert False , "unsupported type: {0}" . format ( type ( right ) )