Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 32 additions & 59 deletions src/snappy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,40 @@

from typing import Union, Tuple, List, Optional

class BaseTriangulation:
from .exterior_to_link import exterior_to_link

class BaseManifold(BaseTriangulation):
from .verify import verify_hyperbolicity
from .margulis import margulis
from .len_spec import (length_spectrum_alt_gen,
length_spectrum_alt)
from .isometry_signature import isometry_signature
from .cusps import (cusp_areas,
short_slopes,
cusp_translations)
from .cusps.cusp_area_matrix import cusp_area_matrix
from .raytracing import inside_view

# Subclass to be able to monkey-patch
class Triangulation(extensions.SnapPy.Triangulation):
__doc__ = extensions.SnapPy.Triangulation.__doc__
class Triangulation(
extensions.SnapPy.KernelTriangulation, BaseTriangulation):
__doc__ = extensions.SnapPy.KernelTriangulation.__doc__

# Subclass to be able to monkey-patch
class TriangulationHP(extensions.SnapPyHP.Triangulation):
__doc__ = extensions.SnapPyHP.Triangulation.__doc__
class TriangulationHP(
extensions.SnapPyHP.KernelTriangulation, BaseTriangulation):
__doc__ = extensions.SnapPyHP.KernelTriangulation.__doc__

# We want Manifold to be a subclass of Triangulation.
# Unfortunately, that introduces a diamond pattern here.
# Luckily, the python resolves methods and bases classes
# in the presence of a diamond pattern seem to work just
# fine. In particular, we do not double allocate the underlying
# C structures.
class Manifold(extensions.SnapPy.Manifold, Triangulation):
__doc__ = extensions.SnapPy.Manifold.__doc__
class Manifold(
extensions.SnapPy.KernelManifold, Triangulation, BaseManifold):
__doc__ = extensions.SnapPy.KernelManifold.__doc__

def identify(self, extends_to_link=False):
"""
Expand Down Expand Up @@ -98,8 +116,9 @@ def low_precision(self):

# We want ManifoldHP to be a subclass of TriangulationHP.
# See comment about Manifold and the diamond pattern.
class ManifoldHP(extensions.SnapPyHP.Manifold, TriangulationHP):
__doc__ = extensions.SnapPyHP.Manifold.__doc__
class ManifoldHP(
extensions.SnapPyHP.KernelManifold, TriangulationHP, BaseManifold):
__doc__ = extensions.SnapPyHP.KernelManifold.__doc__

def low_precision(self):
"""
Expand Down Expand Up @@ -219,7 +238,7 @@ def is_isometric_to(self,
resolved_other,
return_isometries=return_isometries)

is_isometric_to.__doc__ = extensions.SnapPy.Manifold._is_isometric_to.__doc__
is_isometric_to.__doc__ = extensions.SnapPy.KernelManifold._is_isometric_to.__doc__
Manifold.is_isometric_to = is_isometric_to
ManifoldHP.is_isometric_to = is_isometric_to

Expand All @@ -233,57 +252,17 @@ def isomorphisms_to(self,
return resolved_self._isomorphisms_to(
resolved_other)

isomorphisms_to.__doc__ = extensions.SnapPy.Triangulation._isomorphisms_to.__doc__
Triangulation.isomorphisms_to = isomorphisms_to
TriangulationHP.isomorphisms_to = isomorphisms_to
isomorphisms_to.__doc__ = extensions.SnapPy.KernelTriangulation._isomorphisms_to.__doc__
BaseTriangulation.isomorphisms_to = isomorphisms_to

from . import snap
snap.add_methods(Manifold)
snap.add_methods(ManifoldHP)
snap.add_methods(Triangulation, hyperbolic=False)
snap.add_methods(TriangulationHP, hyperbolic=False)

from . import exterior_to_link
Triangulation.exterior_to_link = exterior_to_link.exterior_to_link
TriangulationHP.exterior_to_link = exterior_to_link.exterior_to_link

from . import verify
Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity

from . import margulis
Manifold.margulis = margulis.margulis
ManifoldHP.margulis = margulis.margulis

from . import len_spec
Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
snap.add_methods(BaseManifold)
snap.add_methods(BaseTriangulation, hyperbolic=False)

from . import canonical
Manifold.canonical_retriangulation = canonical.canonical_retriangulation
ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp

from . import isometry_signature

Manifold.isometry_signature = isometry_signature.isometry_signature
ManifoldHP.isometry_signature = isometry_signature.isometry_signature

from .cusps import cusp_area_matrix

Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix

from . import cusps

Manifold.cusp_areas = cusps.cusp_areas
ManifoldHP.cusp_areas = cusps.cusp_areas
Manifold.short_slopes = cusps.short_slopes
ManifoldHP.short_slopes = cusps.short_slopes
Manifold.cusp_translations = cusps.cusp_translations
ManifoldHP.cusp_translations = cusps.cusp_translations

def complex_volume(manifold, verified_modulo_2_torsion=False,
bits_prec=None):
"""
Expand Down Expand Up @@ -349,12 +328,6 @@ def complex_volume(manifold, verified_modulo_2_torsion=False,
drilling._add_methods(Manifold)
drilling._add_methods(ManifoldHP, high_precision=True)

from . import raytracing

Manifold.inside_view = raytracing.inside_view
ManifoldHP.inside_view = raytracing.inside_view


def all_translations(self, verified=False, bits_prec=None):
"""
Returns the (complex) Euclidean translations of the meridian
Expand Down
10 changes: 5 additions & 5 deletions src/snappy/extensions/SnapPy/cython_src/core/basic.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ cdef IsometryListToIsometries(IsometryList *isometries):
# PLink communication

def _plink_callback(LE):
cdef Manifold manifold
cdef KernelManifold manifold
cdef c_Triangulation* c_triangulation = NULL
if LE.manifold is None:
LE.manifold = _manifold_class('empty')
Expand All @@ -637,10 +637,10 @@ def _plink_callback(LE):

# Conversion functions Manifold <-> Triangulation

def Manifold_from_Triangulation(Triangulation T, recompute=True,
def Manifold_from_Triangulation(KernelTriangulation T, recompute=True,
manifold_class=None):
cdef c_Triangulation *c_triangulation
cdef Manifold M
cdef KernelManifold M

M = _manifold_class('empty') if manifold_class is None else manifold_class('empty')
if T.c_triangulation is NULL:
Expand All @@ -663,9 +663,9 @@ def Manifold_from_Triangulation(Triangulation T, recompute=True,
return M


def Triangulation_from_Manifold(Manifold M):
def Triangulation_from_Manifold(KernelManifold M):
cdef c_Triangulation *c_triangulation
cdef Triangulation T
cdef KernelTriangulation T

if M.c_triangulation is NULL:
return _triangulation_class('empty')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ cdef class CCuspNeighborhood():
def _number_(n):
return number.number_to_native_number(n)

def __cinit__(self, Manifold manifold):
def __cinit__(self, KernelManifold manifold):
if manifold.c_triangulation is NULL:
raise ValueError('The Triangulation is empty.')
is_complete = manifold.cusp_info('is_complete')
Expand Down Expand Up @@ -41,7 +41,7 @@ cdef class CCuspNeighborhood():
Return a Manifold built from the current canonical triangulation.
"""
cdef c_Triangulation *c_triangulation
cdef Manifold M
cdef KernelManifold M

copy_triangulation(self.c_cusp_neighborhood.its_triangulation,
&c_triangulation)
Expand Down
4 changes: 2 additions & 2 deletions src/snappy/extensions/SnapPy/cython_src/core/dirichlet.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ cdef class CDirichletDomain():
return number.number_to_native_number(n)

def __cinit__(self,
Manifold manifold=None,
KernelManifold manifold=None,
vertex_epsilon=default_vertex_epsilon,
displacement=None,
centroid_at_origin=True,
Expand Down Expand Up @@ -538,7 +538,7 @@ cdef class CDirichletDomain():

cdef triangulate(self, return_class):
cdef c_Triangulation *c_triangulation
cdef Triangulation M
cdef KernelTriangulation M
c_triangulation = Dirichlet_to_triangulation(self.c_dirichlet_domain)
if c_triangulation is NULL:
raise ValueError('The Dirichlet domain could not be '
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ cdef class CFundamentalGroup():
cdef c_Triangulation *c_triangulation
cdef readonly num_cusps

def __cinit__(self, Triangulation triangulation,
def __cinit__(self, KernelTriangulation triangulation,
simplify_presentation=True,
fillings_may_affect_generators=True,
minimize_number_of_generators=True,
Expand Down
28 changes: 14 additions & 14 deletions src/snappy/extensions/SnapPy/cython_src/core/manifold.pyx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Manifolds

cdef class Manifold(Triangulation):
cdef class KernelManifold(KernelTriangulation):
"""
A Manifold is a :class:`Triangulation` together with a geometric structure.
That is, a Manifold is an ideal triangulation of the interior of a
Expand Down Expand Up @@ -205,7 +205,7 @@ cdef class Manifold(Triangulation):
cdef c_Triangulation *c_retriangulated_triangulation
cdef int n = get_num_tetrahedra(self.c_triangulation)
cdef result
cdef Triangulation new_tri
cdef KernelTriangulation new_tri

if self.c_triangulation is NULL:
return ""
Expand Down Expand Up @@ -257,7 +257,7 @@ cdef class Manifold(Triangulation):
False
"""

cdef Manifold M
cdef KernelManifold M
M = self.copy()
M.canonize()
canonical_retriangulation(M.c_triangulation)
Expand All @@ -276,7 +276,7 @@ cdef class Manifold(Triangulation):
>>> N.volume() # doctest: +NUMERIC6
5.13794120
"""
Triangulation._from_string(self, string)
KernelTriangulation._from_string(self, string)
if initialize_structure:
self.init_hyperbolic_structure()

Expand All @@ -290,7 +290,7 @@ cdef class Manifold(Triangulation):
>>> N.is_isometric_to(M)
True
"""
Triangulation._from_bytes(self, bytestring)
KernelTriangulation._from_bytes(self, bytestring)
if initialize_structure:
self.init_hyperbolic_structure()

Expand All @@ -299,7 +299,7 @@ cdef class Manifold(Triangulation):
Fill an empty manifold from an isosig generated by
triangulation_isosig.
"""
Triangulation._from_isosig(self, isosig)
KernelTriangulation._from_isosig(self, isosig)
if self.c_triangulation == NULL:
return
if initialize_structure:
Expand Down Expand Up @@ -488,7 +488,7 @@ cdef class Manifold(Triangulation):
cdef c_SymmetryGroup* symmetries_of_manifold = NULL
cdef c_SymmetryGroup* symmetries_of_link = NULL
cdef c_Triangulation* c_symmetric_triangulation = NULL
cdef Manifold symmetric_triangulation
cdef KernelManifold symmetric_triangulation
cdef Boolean is_full_group
cdef c_FuncResult result
cdef SymmetryGroup symmetry_group
Expand Down Expand Up @@ -611,7 +611,7 @@ cdef class Manifold(Triangulation):
sage: N2 == N4 #doctest: +SKIP
True
"""
cover = Triangulation.cover(self, permutation_rep)
cover = KernelTriangulation.cover(self, permutation_rep)
return Manifold_from_Triangulation(cover, recompute=False,
manifold_class=self.__class__)

Expand Down Expand Up @@ -656,7 +656,7 @@ cdef class Manifold(Triangulation):
argument method = 'gap' If you have Magma installed, you can
used it to do the heavy lifting by specifying method='magma'.
"""
covers = Triangulation.covers(self, degree, method,cover_type)
covers = KernelTriangulation.covers(self, degree, method,cover_type)
return [Manifold_from_Triangulation(cover,
recompute=False,
manifold_class=self.__class__)
Expand Down Expand Up @@ -1282,7 +1282,7 @@ cdef class Manifold(Triangulation):

Does not return a new Manifold.
"""
Triangulation.dehn_fill(self, filling_data, which_cusp)
KernelTriangulation.dehn_fill(self, filling_data, which_cusp)
do_Dehn_filling(self.c_triangulation)
self._cache.clear(message='Manifold.dehn_fill')

Expand Down Expand Up @@ -1397,7 +1397,7 @@ cdef class Manifold(Triangulation):
install_shortest_bases(self.c_triangulation)

else:
return Triangulation.set_peripheral_curves(
return KernelTriangulation.set_peripheral_curves(
self, peripheral_data, which_cusp,return_matrices)

def dual_curves(self, max_segments=6):
Expand Down Expand Up @@ -1518,7 +1518,7 @@ cdef class Manifold(Triangulation):
cdef int num_curves
cdef DualOneSkeletonCurve **curve_list
cdef c_Triangulation *c_triangulation
cdef Triangulation result
cdef KernelTriangulation result
cdef char* c_new_name

if isinstance(which_curve, DualCurveInfo):
Expand Down Expand Up @@ -1550,7 +1550,7 @@ cdef class Manifold(Triangulation):
return result

def _is_isometric_to(self,
Manifold other,
KernelManifold other,
return_isometries : bool = False):
"""
Returns ``True`` if M and N are isometric, ``False`` if they not.
Expand Down Expand Up @@ -1786,7 +1786,7 @@ cdef class Manifold(Triangulation):
cdef c_FuncResult result
cdef int num_surfaces
cdef c_Triangulation *pieces[2]
cdef Manifold M0, M1
cdef KernelManifold M0, M1

if self.c_triangulation is NULL:
raise ValueError('The Triangulation is empty.')
Expand Down
Loading
Loading