Census manifolds
Snappy comes with a large library of manifolds, which can be accessed individually through the Manifold and Triangulation constructors but can also be iterated through using the objects described on this page.
SnapPy’s iterators support several flexible methods for accessing manifolds. They can be sliced (i.e. restricted to subranges) either by index or by volume. Calling the iterator with keyword arguments such as num_tets=1, betti=2 or num_cusps=3 returns an iterator which is filtered by the specified conditions. In addition these iterators can determine whether they contain a given manifold. They support python’s “A in B” syntax, and also provide an identify method which will return a copy of the census manifold which is isometric to the manifold passed as an argument.
- snappy.OrientableCuspedCensus = OrientableCuspedCensus without filters
Iterator for all orientable cusped hyperbolic manifolds that can be triangulated with at most 10 ideal tetrahedra. See [Li] for background on these manifolds.
>>> for M in OrientableCuspedCensus[3:6]: print(M, M.volume()) ... m007(0,0) 2.56897060 m009(0,0) 2.66674478 m010(0,0) 2.66674478 >>> for M in OrientableCuspedCensus[-9:-6]: print(M, M.volume()) ... o10_150721(0,0)(0,0)(0,0) 10.1494160640965 o10_150722(0,0)(0,0)(0,0) 10.1494160640965 o10_150723(0,0)(0,0) 10.1494160640965 >>> for M in OrientableCuspedCensus[4.10:4.11]: print(M, M.volume()) ... m217(0,0) 4.10795310 m218(0,0) 4.10942659 >>> for M in OrientableCuspedCensus(num_cusps=2)[:3]: ... print(M, M.volume(), M.num_cusps()) ... m125(0,0)(0,0) 3.66386238 2 m129(0,0)(0,0) 3.66386238 2 m202(0,0)(0,0) 4.05976643 2 >>> M = Manifold('m129') >>> M in LinkExteriors True >>> LinkExteriors.identify(M) 5^2_1(0,0)(0,0)
- snappy.OrientableClosedCensus = OrientableClosedCensus without filters
Iterator for 11,031 closed hyperbolic manifolds from the census by Hodgson and Weeks.
>>> len(OrientableClosedCensus) 11031 >>> len(OrientableClosedCensus(betti=2)) 1 >>> for M in OrientableClosedCensus(betti=2): ... print(M, M.homology()) ... v1539(5,1) Z + Z
- snappy.CensusKnots = CensusKnots without filters
Iterator for all of the knot exteriors in the SnapPea Census, as tabulated by Callahan, Dean, Weeks, Champanerkar, Kofman, Patterson, Dunfield, and Li. These are the knot exteriors which can be triangulated by at most 10 ideal tetrahedra. See [Li] for more.
>>> for M in CensusKnots[3.4:3.5]: ... print(M, M.volume(), LinkExteriors.identify(M)) ... K4_3(0,0) 3.47424776 False K5_1(0,0) 3.41791484 False K5_2(0,0) 3.42720525 8_1(0,0) K5_3(0,0) 3.48666015 9_2(0,0)
>>> len(CensusKnots) 3116 >>> CensusKnots[-1].num_tetrahedra() 10
- snappy.LinkExteriors = LinkExteriors without filters
Iterator for all knots with at most 11 crossings and links with at most 10 crossings, using the Rolfsen notation. The triangulations were computed by Joe Christy.
>>> for K in LinkExteriors(num_cusps=3)[-3:]: ... print(K, K.volume()) ... 10^3_72(0,0)(0,0)(0,0) 14.35768903 10^3_73(0,0)(0,0)(0,0) 15.86374431 10^3_74(0,0)(0,0)(0,0) 15.55091438 >>> M = Manifold('8_4') >>> OrientableCuspedCensus.identify(M) s862(0,0)
By default, the ‘identify’ returns the first isometric manifold it finds; if the optional ‘extends_to_link’ flag is set, it insists that meridians are taken to meridians.
>>> M = Manifold('7^2_8') >>> LinkExteriors.identify(M) 5^2_1(0,0)(0,0) >>> LinkExteriors.identify(M, extends_to_link=True) 7^2_8(0,0)(0,0)
- snappy.HTLinkExteriors = HTLinkExteriors without filters
This table extends the HTLinkExteriors table from snappy_15_knots with 16 crossing knots (no links with multiple components), by attaching this table of 16 crossing knots to the table in snappy_15_knots
>>> HTLinkExteriors.identify(LinkExteriors['8_20']) K8n1(0,0) >>> Mylist = HTLinkExteriors(alternating=False)[32.0:32.1] >>> len(Mylist) 4 >>> for L in Mylist: ... print( L.name(), L.volume() ) ... K16n883306 32.0352925448859 K16n916708 32.0248070639115 K16n931674 32.0386444405200 K16n996627 32.0366528043146
- snappy.RibbonLinks = RibbonLinks without filters
The database of ribbon links from Section 2.5 of [Dunfield and Gong]. Each link includes a certificate describing the ribbon disks:
>>> len(RibbonLinks(cusps=2)) 12143 >>> M = RibbonLinks[1000] >>> M.name(), M.num_cusps(), M.volume() ('ribbon_2_16_3079d007', 2, 22.9002274714046)
The bands used show each link is ribbon are included. For this link, we used 3 bands:
>>> N = RibbonLinks['ribbon_2_23_f9c7aff2'] >>> N.ribbon_cert[1::2] ['0d1c54_1_0', '5e5709_1_0', '144f625e5d29_5_2']
- snappy.NonorientableCuspedCensus = NonorientableCuspedCensus without filters
Iterator for all nonorientable cusped hyperbolic manifolds that can be triangulated with at most 5 ideal tetrahedra.
>>> for M in NonorientableCuspedCensus(betti=2)[:3]: ... print(M, M.homology()) ... m124(0,0)(0,0)(0,0) Z/2 + Z + Z m128(0,0)(0,0) Z + Z m131(0,0) Z + Z
- snappy.NonorientableClosedCensus = NonorientableClosedCensus without filters
Iterator for 17 nonorientable closed hyperbolic manifolds from the census by Hodgson and Weeks.
>>> for M in NonorientableClosedCensus[:3]: print(M, M.volume()) ... m018(1,0) 2.02988321 m177(1,0) 2.56897060 m153(1,0) 2.66674478
There are also:
As instances of subclasses of ManifoldTable, the objects above support the following methods.
- class snappy.database.ManifoldTable(table='', db_path=None, mfld_hash=<function mfld_hash>, **filter_args)
Iterator for cusped manifolds in an sqlite3 table of manifolds.
Initialize with the table name. The table schema is required to include a text field called ‘name’ and a text field called ‘triangulation’. The text holds the result of M.triangulation_isosig(), M.triangulation_isosig(decorated = True), or M._to_string().
Both mapping from the manifold name, and lookup by index are supported. Slicing can be done either by numerical index or by volume.
The __contains__ method is supported, so M in T returns True if M is isometric to a manifold in the table T. The method T.identify(M) will return the matching manifold from the table.
- find(where=None, order_by='id', limit=None, offset=None)
Return a list of up to limit manifolds stored in this table, satisfying the where clause, and ordered by the order_by clause. If limit is None, all matching manifolds are returned. If the offset parameter is set, the first offset matches are skipped.
- identify(mfld, extends_to_link=False)
Look for a manifold in this table which is isometric to the argument.
Return the matching manifold, if there is one which SnapPea declares to be isometric.
Return False if no manifold in the table has the same hash.
Return None in all other cases (for now).
If the flag “extends_to_link” is True, requires that the isometry sends meridians to meridians. If the input manifold is closed this will result in no matches being returned.
- keys()
Return the list of column names for this manifold table.
- siblings(mfld)
Return all manifolds in the census which have the same hash value.
Because of the large size of their datasets, the classes below can only iterate through slices by index, and do not provide the identification methods.
- class snappy.AlternatingKnotExteriors(indices=(0, 491327, 1))
Iterator/Sequence for Alternating knot exteriors from the Hoste-Thistlethwaite tables. Goes through 16 crossings.
- class snappy.NonalternatingKnotExteriors(indices=(0, 1210608, 1))
Iterator/Sequence for nonAlternating knot exteriors from the Hoste-Thistlethwaite tables. Goes through 16 crossings.