1  from . import np, MatrixLieAlgebra, contract 
 2  from .. import hat_map, hat_map_2d, map_hat_2d, map_hat 
 6      '''  
 7          This is the Lie algebra of skew-symmetric matrices so(n), 
 8          for the Special Orthogonal group SO(n). 
 9      ''' 
10   
14   
16          ''' Projects *v* to the closest skew-symmetric matrix. ''' 
17          return 0.5 * (v - v.T) 
 18   
20          return 'so%s' % (self.n) 
 21   
23          points = [] 
24          points.append(self.zero()) 
25          if self.n == 2: 
26              points.append(hat_map_2d(np.pi)) 
27              points.append(hat_map_2d(np.pi / 2)) 
28              points.append(hat_map_2d(-np.pi)) 
29          elif self.n == 3: 
30              points.append(hat_map(np.array([0, 0, 1]) * np.pi / 2)) 
31              points.append(hat_map(np.array([0, 0, 1]) * np.pi)) 
32              points.append(hat_map(np.array([0, 1, 0]) * np.pi / 2)) 
33              points.append(hat_map(np.array([0, 1, 0]) * np.pi)) 
34              points.append(hat_map(np.array([1, 0, 0]) * np.pi / 2)) 
35              points.append(hat_map(np.array([1, 0, 0]) * np.pi)) 
36          else: 
37              assert False, 'Not implemented for n=%s' % self.n 
38          return points 
 39   
40      @contract(a='belongs') 
42          if self.n == 2: 
43              return np.array([map_hat_2d(a)]) 
44          elif self.n == 3: 
45              return map_hat(a) 
46          else: 
47              assert False, 'Not implemented for n=%s.' % self.n 
 48   
49      @contract(v='array[N]') 
51          if self.n == 2: 
52              return hat_map_2d(v[0]) 
53          elif self.n == 3: 
54              return hat_map(v) 
55          else: 
56              assert False, 'Not implemented for n=%s.' % self.n 
  57