Source code for ddg.geometry.elliptic_models

"""Elliptic geometry module.

This is the metric Cayley-Klein geometry with empty / positive definite absolute.
"""
import numpy as np

from ddg.geometry.geometry_model_templates import MetricCayleyKleinGeometry
from ddg.geometry.quadrics import Quadric

__all__ = ["ProjectiveModel"]


[docs]class ProjectiveModel(MetricCayleyKleinGeometry): """Elliptic geometry. This is a Cayley-Klein geometry with empty absolute, so the model space is all of RPn. Parameters ---------- dimension : int Attributes ---------- dimension : int """ @property def absolute(self): """The absolute quadric with matrix ``diag([1,...,1])``. Returns ------- Quadric """ return Quadric(np.diag(np.ones(self.dimension + 1)))
[docs] @staticmethod def metric_to_cayley_klein_distance(d): """Return Metric distance converted to Cayley-Klein "distance". `K` is given by :: K = cos(d) ** 2 Parameters ---------- d : float Returns ------- K : float """ return np.cos(d) ** 2
[docs] @staticmethod def cayley_klein_distance_to_metric(K): """Return Cayley-Klein distance converted to metric distance. `d` is given by the equation :: d = arccos(sqrt(K)) Parameters ---------- K : float Returns ------- d : float Raises ------ ValueError If K is not in [0, 1] """ if not 0 <= K <= 1: raise ValueError( "Cayley-Klein distance must be in [0, 1] to correspond to a " "metric distance in elliptic geometry." ) return np.arccos(np.sqrt(K))
def __contains__(self, point): return point.ambient_dimension == self.ambient_dimension