1 from . import np, DifferentiableManifold, contract
2 from .. import assert_allclose
3 from abc import abstractmethod
4 from contracts import check
8
9 @contract(dimension='int,>0')
15
17 ''' Returns the zero element for this algebra. '''
18 return np.zeros(self.shape)
19
21 ''' Return the norm of a vector in the algebra.
22 This is used in :py:class:`MatrixLieGroup` to measure
23 distances between points in the Lie group.
24 '''
25 return np.linalg.norm(v, 2)
26
27
29 return self.norm(a - b)
30
31 @contract(bv='belongs_ts')
33 base, vel = bv
34 return base + vel
35
36 @contract(base='belongs', target='belongs', returns='belongs_ts')
37 - def logmap(self, base, target):
38 return base, target - base
39
40 @contract(x='array')
42 if x.shape != self.shape:
43 raise ValueError('Expected shape %r, not %r.' %
44 (self.shape, x.shape))
45
46
47 assert np.all(np.isreal(x)), "Expected real vector"
48 proj = self.project(x)
49 assert_allclose(proj, x, atol=1e-8)
50
52
53 check('tuple(shape(x),shape(x))', bv, x=self.shape)
54 base, vel = bv
55 self.belongs(base)
56 self.belongs(vel)
57
58 @abstractmethod
60 ''' Projects a vector onto this Lie Algebra. '''
61
63 base, vel = bv
64 return base, self.project(vel)
65