From ea5d7a908791efae8ae713fea2c8bd0a614b4193 Mon Sep 17 00:00:00 2001 From: Matthias Goerner <1239022+unhyperbolic@users.noreply.github.com> Date: Tue, 5 May 2026 10:50:25 -0700 Subject: [PATCH 1/2] Replacing monkey-patching with subclassing Triangulation(HP)/Manifold(HP) from common classes that import the python methods in place. --- src/snappy/__init__.py | 75 ++++++------------- src/snappy/isometry_signature.py | 2 +- .../raytracing/ideal_raytracing_data.py | 3 +- 3 files changed, 25 insertions(+), 55 deletions(-) diff --git a/src/snappy/__init__.py b/src/snappy/__init__.py index db44aa318..76ec4b4ba 100644 --- a/src/snappy/__init__.py +++ b/src/snappy/__init__.py @@ -28,12 +28,27 @@ from typing import Union, Tuple, List, Optional +class TriangulationMixIn: + from .exterior_to_link import exterior_to_link + +class ManifoldMixIn(TriangulationMixIn): + 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): +class Triangulation(extensions.SnapPy.Triangulation, TriangulationMixIn): __doc__ = extensions.SnapPy.Triangulation.__doc__ # Subclass to be able to monkey-patch -class TriangulationHP(extensions.SnapPyHP.Triangulation): +class TriangulationHP(extensions.SnapPyHP.Triangulation, TriangulationMixIn): __doc__ = extensions.SnapPyHP.Triangulation.__doc__ # We want Manifold to be a subclass of Triangulation. @@ -42,7 +57,7 @@ class TriangulationHP(extensions.SnapPyHP.Triangulation): # 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): +class Manifold(extensions.SnapPy.Manifold, Triangulation, ManifoldMixIn): __doc__ = extensions.SnapPy.Manifold.__doc__ def identify(self, extends_to_link=False): @@ -98,7 +113,7 @@ 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): +class ManifoldHP(extensions.SnapPyHP.Manifold, TriangulationHP, ManifoldMixIn): __doc__ = extensions.SnapPyHP.Manifold.__doc__ def low_precision(self): @@ -234,56 +249,16 @@ def isomorphisms_to(self, resolved_other) isomorphisms_to.__doc__ = extensions.SnapPy.Triangulation._isomorphisms_to.__doc__ -Triangulation.isomorphisms_to = isomorphisms_to -TriangulationHP.isomorphisms_to = isomorphisms_to +TriangulationMixIn.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(ManifoldMixIn) +snap.add_methods(TriangulationMixIn, 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): """ @@ -349,12 +324,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 diff --git a/src/snappy/isometry_signature.py b/src/snappy/isometry_signature.py index 92c2e1d8d..f3bfe9b37 100644 --- a/src/snappy/isometry_signature.py +++ b/src/snappy/isometry_signature.py @@ -1,4 +1,3 @@ -from . import Triangulation, TriangulationHP, ManifoldHP from . import verify from .sage_helper import _within_sage from .math_basics import is_RealIntervalFieldElement @@ -376,6 +375,7 @@ def drill_manifold_precisions( raise err def compute_meridian_slopes(isosig, tri): + from . import Triangulation isosig_tri = Triangulation(isosig, remove_finite_vertices=False) # Do not call isosig_tri.set_peripheral_curves('combinatorial') # here. diff --git a/src/snappy/raytracing/ideal_raytracing_data.py b/src/snappy/raytracing/ideal_raytracing_data.py index b53edf37f..e126f008e 100644 --- a/src/snappy/raytracing/ideal_raytracing_data.py +++ b/src/snappy/raytracing/ideal_raytracing_data.py @@ -1,6 +1,5 @@ from ..snap import t3mlite as t3m from ..snap.t3mlite import simplex -from .. import Triangulation from ..matrix import make_matrix, make_vector @@ -71,6 +70,8 @@ def from_manifold(manifold, num_cusps = manifold.num_cusps() + from .. import Triangulation + # Make a copy of the manifold. On the copy, we can set all # the Dehn-fillings to (0,0) so that gluing_equations gives # us both the meridian and longitude. From 63703c8fc48560aca0dd035e79a877a514f25027 Mon Sep 17 00:00:00 2001 From: Matthias Goerner <1239022+unhyperbolic@users.noreply.github.com> Date: Tue, 5 May 2026 22:04:23 -0700 Subject: [PATCH 2/2] Renames: extensions.SnapPy.Triangulation/Manifold -> KernelTriangulation/Manifold Triangulation/ManifoldMixIn -> BaseTriangulation/Manifold. --- src/snappy/__init__.py | 34 +++++++++++-------- .../SnapPy/cython_src/core/basic.pyx | 10 +++--- .../cython_src/core/cusp_neighborhoods.pyx | 4 +-- .../SnapPy/cython_src/core/dirichlet.pyx | 4 +-- .../cython_src/core/fundamental_group.pyx | 2 +- .../SnapPy/cython_src/core/manifold.pyx | 28 +++++++-------- .../SnapPy/cython_src/core/tail.pyx | 28 +++++++-------- .../SnapPy/cython_src/core/triangulation.pyx | 24 ++++++------- src/snappy/snap/slice_obs_HKL/__init__.py | 2 +- 9 files changed, 70 insertions(+), 66 deletions(-) diff --git a/src/snappy/__init__.py b/src/snappy/__init__.py index 76ec4b4ba..5aa5cf802 100644 --- a/src/snappy/__init__.py +++ b/src/snappy/__init__.py @@ -28,10 +28,10 @@ from typing import Union, Tuple, List, Optional -class TriangulationMixIn: +class BaseTriangulation: from .exterior_to_link import exterior_to_link -class ManifoldMixIn(TriangulationMixIn): +class BaseManifold(BaseTriangulation): from .verify import verify_hyperbolicity from .margulis import margulis from .len_spec import (length_spectrum_alt_gen, @@ -44,12 +44,14 @@ class ManifoldMixIn(TriangulationMixIn): from .raytracing import inside_view # Subclass to be able to monkey-patch -class Triangulation(extensions.SnapPy.Triangulation, TriangulationMixIn): - __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, TriangulationMixIn): - __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. @@ -57,8 +59,9 @@ class TriangulationHP(extensions.SnapPyHP.Triangulation, TriangulationMixIn): # 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, ManifoldMixIn): - __doc__ = extensions.SnapPy.Manifold.__doc__ +class Manifold( + extensions.SnapPy.KernelManifold, Triangulation, BaseManifold): + __doc__ = extensions.SnapPy.KernelManifold.__doc__ def identify(self, extends_to_link=False): """ @@ -113,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, ManifoldMixIn): - __doc__ = extensions.SnapPyHP.Manifold.__doc__ +class ManifoldHP( + extensions.SnapPyHP.KernelManifold, TriangulationHP, BaseManifold): + __doc__ = extensions.SnapPyHP.KernelManifold.__doc__ def low_precision(self): """ @@ -234,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 @@ -248,12 +252,12 @@ def isomorphisms_to(self, return resolved_self._isomorphisms_to( resolved_other) -isomorphisms_to.__doc__ = extensions.SnapPy.Triangulation._isomorphisms_to.__doc__ -TriangulationMixIn.isomorphisms_to = isomorphisms_to +isomorphisms_to.__doc__ = extensions.SnapPy.KernelTriangulation._isomorphisms_to.__doc__ +BaseTriangulation.isomorphisms_to = isomorphisms_to from . import snap -snap.add_methods(ManifoldMixIn) -snap.add_methods(TriangulationMixIn, hyperbolic=False) +snap.add_methods(BaseManifold) +snap.add_methods(BaseTriangulation, hyperbolic=False) from . import canonical Manifold.canonical_retriangulation = canonical.canonical_retriangulation diff --git a/src/snappy/extensions/SnapPy/cython_src/core/basic.pyx b/src/snappy/extensions/SnapPy/cython_src/core/basic.pyx index d33483006..3dcfab69a 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/basic.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/basic.pyx @@ -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') @@ -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: @@ -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') diff --git a/src/snappy/extensions/SnapPy/cython_src/core/cusp_neighborhoods.pyx b/src/snappy/extensions/SnapPy/cython_src/core/cusp_neighborhoods.pyx index 08d7fe572..64e7e4831 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/cusp_neighborhoods.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/cusp_neighborhoods.pyx @@ -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') @@ -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) diff --git a/src/snappy/extensions/SnapPy/cython_src/core/dirichlet.pyx b/src/snappy/extensions/SnapPy/cython_src/core/dirichlet.pyx index 79e672768..be549b951 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/dirichlet.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/dirichlet.pyx @@ -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, @@ -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 ' diff --git a/src/snappy/extensions/SnapPy/cython_src/core/fundamental_group.pyx b/src/snappy/extensions/SnapPy/cython_src/core/fundamental_group.pyx index e332cceeb..434e5d70f 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/fundamental_group.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/fundamental_group.pyx @@ -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, diff --git a/src/snappy/extensions/SnapPy/cython_src/core/manifold.pyx b/src/snappy/extensions/SnapPy/cython_src/core/manifold.pyx index c74981bb9..2e5c4f19d 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/manifold.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/manifold.pyx @@ -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 @@ -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 "" @@ -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) @@ -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() @@ -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() @@ -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: @@ -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 @@ -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__) @@ -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__) @@ -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') @@ -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): @@ -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): @@ -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. @@ -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.') diff --git a/src/snappy/extensions/SnapPy/cython_src/core/tail.pyx b/src/snappy/extensions/SnapPy/cython_src/core/tail.pyx index fc9aab775..4fadd6a7c 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/tail.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/tail.pyx @@ -22,8 +22,8 @@ is_decorated_isosig = decorated_isosig.isosig_pattern # Hooks so that global module can monkey patch in modified versions # of the Triangulation and Manifold classes. -_triangulation_class = Triangulation -_manifold_class = Manifold +_triangulation_class = None +_manifold_class = None def bundle_from_string(desc): @@ -183,14 +183,14 @@ def get_triangulation_tester(): 'dLQbcccdxwb'] for spec in specs: - M = Manifold(spec) + M = KernelManifold(spec) vol = M.volume() if abs(vol) < 0.1: vol = 0.0 print(M, vol, M.homology()) for spec in specs: - M = Triangulation(spec) + M = KernelTriangulation(spec) print(M, M.homology()) @@ -383,7 +383,7 @@ class CuspedCensus(Census): def __getitem__(self, n): cdef c_Triangulation* c_triangulation - cdef Manifold result + cdef KernelManifold result if isinstance(n, slice): return self.__class__(n.indices(self.length)) if n < 0: @@ -412,7 +412,7 @@ class CuspedCensus(Census): except: raise IOError('The Morwen 8 tetrahedra manifold %s ' 'was not found.' % spec) - result = Manifold(spec='empty') + result = KernelManifold(spec='empty') result.set_c_triangulation(c_triangulation) return result # return Manifold('t%d' % census_index) @@ -423,7 +423,7 @@ class CuspedCensus(Census): if c_triangulation == NULL: print(num_tet, census_index) raise RuntimeError('SnapPea failed to read the census manifold.') - result = Manifold(spec='empty') + result = KernelManifold(spec='empty') result.set_c_triangulation(c_triangulation) return result @@ -470,7 +470,7 @@ class ObsOrientableClosedCensus(Census): def __getitem__(self, n): cdef c_Triangulation* c_triangulation - cdef Manifold result + cdef KernelManifold result if isinstance(n, slice): return self.__class__(n.indices(self.length)) _, num_tet, index, m, l = ObsOrientableClosedCensus.data[n].split() @@ -479,7 +479,7 @@ class ObsOrientableClosedCensus(Census): if c_triangulation == NULL: print(num_tet, index) raise RuntimeError('SnapPea failed to read the census manifold.') - result = Triangulation(spec='empty') + result = KernelTriangulation(spec='empty') result.set_c_triangulation(c_triangulation) result.dehn_fill((int(m), int(l))) return result.with_hyperbolic_structure() @@ -505,7 +505,7 @@ class ObsNonorientableClosedCensus(Census): def __getitem__(self, n): cdef c_Triangulation* c_triangulation - cdef Manifold result + cdef KernelManifold result if isinstance(n, slice): return self.__class__(n.indices(self.length)) _, num_tet, index, m, l = ObsNonorientableClosedCensus.data[n].split() @@ -514,7 +514,7 @@ class ObsNonorientableClosedCensus(Census): if c_triangulation == NULL: print(num_tet, index) raise RuntimeError('SnapPea failed to read the census manifold.') - result = Triangulation(spec='empty') + result = KernelTriangulation(spec='empty') result.set_c_triangulation(c_triangulation) result.dehn_fill((int(m), int(l))) return result.with_hyperbolic_structure() @@ -594,7 +594,7 @@ class ObsCensusKnots(Census): c_triangulation = read_triangulation_from_string(filedata) except: raise IOError("The census knot %s was not found." % name) - result = Triangulation('empty') + result = KernelTriangulation('empty') result.set_c_triangulation(c_triangulation) result.set_name(name) return result.with_hyperbolic_structure() @@ -656,7 +656,7 @@ class ObsLinkExteriors(Census): except: raise IOError('The link complement %s was not ' 'found.' % filename) - result = Triangulation('empty') + result = KernelTriangulation('empty') result.set_c_triangulation(c_triangulation) result.set_name(name) return result.with_hyperbolic_structure() @@ -719,7 +719,7 @@ class ObsMorwenLinks(Census): return SC else: name = str('DT:%s' % self.DT_codes[n]) - result = Manifold(name) + result = KernelManifold(name) result.set_name(name) return result diff --git a/src/snappy/extensions/SnapPy/cython_src/core/triangulation.pyx b/src/snappy/extensions/SnapPy/cython_src/core/triangulation.pyx index f9295affb..5f045511c 100644 --- a/src/snappy/extensions/SnapPy/cython_src/core/triangulation.pyx +++ b/src/snappy/extensions/SnapPy/cython_src/core/triangulation.pyx @@ -1,7 +1,7 @@ from ..cache import SnapPyCache import low_index -cdef class Triangulation(): +cdef class KernelTriangulation(): """ A Triangulation object represents a compact 3-manifold with torus boundary components, given as an ideal triangulation of the @@ -142,7 +142,7 @@ cdef class Triangulation(): self.get_triangulation_from_name(name, remove_finite_vertices) # Set the dehn fillings - Triangulation.dehn_fill(self, fillings) + KernelTriangulation.dehn_fill(self, fillings) cdef get_triangulation_from_name(self, name, remove_finite_vertices=True): @@ -437,7 +437,7 @@ cdef class Triangulation(): raise ValueError('The Triangulation is already orientable.') cdef c_Triangulation* cover_c_triangulation = NULL - cdef Triangulation new_tri + cdef KernelTriangulation new_tri cover_c_triangulation = double_cover(self.c_triangulation) new_tri = self.__class__('empty') @@ -471,7 +471,7 @@ cdef class Triangulation(): >>> N = M.copy() """ cdef c_Triangulation* copy_c_triangulation = NULL - cdef Triangulation new_tri + cdef KernelTriangulation new_tri if self.c_triangulation is NULL: return self.__class__('empty') @@ -992,7 +992,7 @@ cdef class Triangulation(): free_triangulation_data(data) return result - def _isomorphisms_to(self, Triangulation other not None): + def _isomorphisms_to(self, KernelTriangulation other not None): """ Returns a complete list of combinatorial isomorphisms between the two triangulations: @@ -1034,7 +1034,7 @@ cdef class Triangulation(): if self.c_triangulation is not NULL: free_triangulation(self.c_triangulation) - def __richcmp__(Triangulation self, Triangulation other, op): + def __richcmp__(KernelTriangulation self, KernelTriangulation other, op): """ Two triangulations are equal if they are combinatorially isomorphic. Currently we don't handle the case where there @@ -1210,14 +1210,14 @@ cdef class Triangulation(): 'you must specify which one you\n' 'are filling, e.g. M.dehn_fill((2,3),1)') if num_cusps == 1 and len(filling_data) == 2: - Triangulation.dehn_fill(self, filling_data, 0) + KernelTriangulation.dehn_fill(self, filling_data, 0) return if len(filling_data) > num_cusps: raise IndexError('You provided filling data for too ' 'many cusps. There are only %s.'% num_cusps) for i, fill in enumerate(filling_data): - Triangulation.dehn_fill(self, fill, i) + KernelTriangulation.dehn_fill(self, fill, i) # When doctesting, the M,L coefficients acquire an accuracy of 8. # So we have to include the zeros in the doctest string. @@ -1329,7 +1329,7 @@ cdef class Triangulation(): 'prime integers.') cdef c_Triangulation* c_filled_tri = NULL - cdef Triangulation filled_tri + cdef KernelTriangulation filled_tri cdef Boolean *fill_cusp_spec = NULL fill_cusp_spec = malloc(n*sizeof(Boolean)) @@ -1387,7 +1387,7 @@ cdef class Triangulation(): if not all(cusp_is_fillable(self.c_triangulation, c) for c in range(n)): raise IndexError('All cusps must be fillable.') cdef c_Triangulation* c_new_tri = NULL - cdef Triangulation filled_tri + cdef KernelTriangulation filled_tri cdef Boolean *fill_cusp_spec = NULL cdef Boolean fill_by_fold if method == 'fold': @@ -2414,7 +2414,7 @@ cdef class Triangulation(): """ cdef RepresentationIntoSn* c_representation cdef c_Triangulation* c_triangulation - cdef Triangulation cover + cdef KernelTriangulation cover if self.c_triangulation is NULL: raise ValueError('The Triangulation is empty.') @@ -2627,7 +2627,7 @@ cdef class Triangulation(): cdef RepresentationList* reps cdef RepresentationIntoSn* rep cdef c_Triangulation* cover - cdef Triangulation T + cdef KernelTriangulation T cdef PermutationSubgroup c_cover_type if cover_type == 'cyclic': diff --git a/src/snappy/snap/slice_obs_HKL/__init__.py b/src/snappy/snap/slice_obs_HKL/__init__.py index e273d1b4d..828bfc895 100644 --- a/src/snappy/snap/slice_obs_HKL/__init__.py +++ b/src/snappy/snap/slice_obs_HKL/__init__.py @@ -159,7 +159,7 @@ def slice_obstruction_HKL(self, if M.homology().elementary_divisors() != [0]: raise ValueError('Not the exterior of knot in S^3 as H_1 != Z') if check_in_S3: - T = SnapPy.Triangulation(M) + T = SnapPy.KernelTriangulation(M) T.dehn_fill((1, 0)) if T.fundamental_group().num_generators() != 0: raise ValueError('The (1, 0) filling is not obviously S^3')