Source code for geometry.manifolds.point_set

from contracts import contract
from geometry.manifolds.differentiable_manifold import DifferentiableManifold
import numpy as np


# TODO: do some testing
[docs]class PointSet(object): """ A set of points on a differentiable manifold. """ @contract(manifold=DifferentiableManifold) def __init__(self, manifold, points=[]): self.points = list(points) self.manifold = manifold def __len__(self): return len(self.points)
[docs] def get_points(self): """ returns an iterable """ return list(self.points)
[docs] def add(self, p): self.points.append(p)
[docs] def is_closer_than(self, p, min_dist): # quick check: check only last d_last = self.manifold.distance(p, self.points[-1]) if d_last <= min_dist: return True return self.minimum_distance(p) <= min_dist
[docs] def distances_to_point(self, p): return np.array([self.manifold.distance(p, p0) for p0 in self.points])
[docs] def minimum_distance(self, p): dists = self.distances_to_point(p) return np.min(dists)
[docs] def average(self): """ Returns the average point """ # TODO: generalize return self.manifold.riemannian_mean(self.points)
[docs] def closest_index_to(self, p): dists = self.distances_to_point(p) return np.argmin(dists)
[docs] def centroid_index(self): avg = self.average() closest = self.closest_index_to(avg) return closest
[docs] def centroid(self): """ REturns the point which is closest to the average """ i = self.centroid_index() return self.points[i]