Source code for geometry.manifolds.torus
from contracts import contract
from geometry.spheres import normalize_pi
import numpy as np
from .differentiable_manifold import DifferentiableManifold
__all__ = ['Torus', 'T', 'T1', 'T2']
[docs]class Torus(DifferentiableManifold):
def __init__(self, n):
DifferentiableManifold.__init__(self, dimension=n)
self.n = n
[docs] def belongs(self, a):
ok = np.logical_and(a >= -np.pi, a < np.pi)
if not np.all(ok):
raise ValueError("Not all are ok in %s" % a)
[docs] def distance(self, a, b):
b = self.normalize(b - a)
return np.linalg.norm(b)
[docs] def logmap(self, base, p):
vel = self.normalize(p - base)
return base, vel
[docs] def expmap(self, bv):
a, vel = bv
b = self.normalize(a + vel)
return b
[docs] def project_ts(self, bv):
return bv # XXX: more checks
[docs] def normalize(self, a):
return normalize_pi(a)
[docs] def friendly(self, a):
return 'point(%s)' % a
[docs] @contract(returns='list(belongs)')
def interesting_points(self):
interesting = []
interesting.append(np.zeros(self.n))
for _ in range(2):
interesting.append(self.sample_uniform())
return interesting
def __repr__(self):
return 'T%s' % self.n
T1 = Torus(1)
T2 = Torus(2)
T3 = Torus(3)
T = {1: T1, 2: T2, 3: T3}