Regina 7.0 Calculation Engine
|
A dim-dimensional triangulation, built by gluing together dim-dimensional simplices along their (dim-1)-dimensional facets. More...
#include <triangulation/generic.h>
Public Member Functions | |
std::shared_ptr< PacketOf< Triangulation< dim > > > | packet () |
Returns the packet that holds this data, if there is one. More... | |
std::shared_ptr< const PacketOf< Triangulation< dim > > > | packet () const |
Returns the packet that holds this data, if there is one. More... | |
std::string | anonID () const |
A unique string ID that can be used in place of a packet ID. More... | |
std::string | str () const |
Returns a short text representation of this object. More... | |
std::string | utf8 () const |
Returns a short text representation of this object using unicode characters. More... | |
std::string | detail () const |
Returns a detailed text representation of this object. More... | |
Constructors and Destructors | |
Triangulation () | |
Default constructor. More... | |
Triangulation (const Triangulation ©) | |
Creates a new copy of the given triangulation. More... | |
Triangulation (const Triangulation ©, bool cloneProps) | |
Creates a new copy of the given triangulation, with the option of whether or not to clone its computed properties also. More... | |
Triangulation (Triangulation &&src) noexcept=default | |
Moves the given triangulation into this new triangulation. More... | |
~Triangulation () | |
Destroys this triangulation. More... | |
Simplices | |
size_t | size () const |
Returns the number of top-dimensional simplices in the triangulation. More... | |
auto | simplices () const |
Returns an object that allows iteration through and random access to all top-dimensional simplices in this triangulation. More... | |
Simplex< dim > * | simplex (size_t index) |
Returns the top-dimensional simplex at the given index in the triangulation. More... | |
const Simplex< dim > * | simplex (size_t index) const |
Returns the top-dimensional simplex at the given index in the triangulation. More... | |
Simplex< dim > * | newSimplex () |
Creates a new top-dimensional simplex and adds it to this triangulation. More... | |
Simplex< dim > * | newSimplex (const std::string &desc) |
Creates a new top-dimensional simplex with the given description and adds it to this triangulation. More... | |
template<int k> | |
std::array< Simplex< dim > *, k > | newSimplices () |
Creates k new top-dimensional simplices, adds them to this triangulation, and returns them in a std::array. More... | |
void | newSimplices (size_t k) |
Creates k new top-dimensional simplices and adds them to this triangulation. More... | |
void | removeSimplex (Simplex< dim > *simplex) |
Removes the given top-dimensional simplex from this triangulation. More... | |
void | removeSimplexAt (size_t index) |
Removes the top-dimensional simplex at the given index in this triangulation. More... | |
void | removeAllSimplices () |
Removes all simplices from the triangulation. More... | |
void | moveContentsTo (Triangulation< dim > &dest) |
Moves the contents of this triangulation into the given destination triangulation, without destroying any pre-existing contents. More... | |
Skeletal Queries | |
size_t | countComponents () const |
Returns the number of connected components in this triangulation. More... | |
size_t | countBoundaryComponents () const |
Returns the number of boundary components in this triangulation. More... | |
template<int subdim> | |
size_t | countFaces () const |
Returns the number of subdim-faces in this triangulation. More... | |
size_t | countFaces (int subdim) const |
Returns the number of subdim-faces in this triangulation, where the face dimension does not need to be known until runtime. More... | |
size_t | countVertices () const |
A dimension-specific alias for countFaces<0>(). More... | |
size_t | countEdges () const |
A dimension-specific alias for countFaces<1>(). More... | |
size_t | countTriangles () const |
A dimension-specific alias for countFaces<2>(). More... | |
size_t | countTetrahedra () const |
A dimension-specific alias for countFaces<3>(). More... | |
size_t | countPentachora () const |
A dimension-specific alias for countFaces<4>(). More... | |
std::vector< size_t > | fVector () const |
Returns the f-vector of this triangulation, which counts the number of faces of all dimensions. More... | |
auto | components () const |
Returns an object that allows iteration through and random access to all components of this triangulation. More... | |
auto | boundaryComponents () const |
Returns an object that allows iteration through and random access to all boundary components of this triangulation. More... | |
template<int subdim> | |
auto | faces () const |
Returns an object that allows iteration through and random access to all subdim-faces of this triangulation, in a way that is optimised for C++ programmers. More... | |
auto | faces (int subdim) const |
Returns an object that allows iteration through and random access to all subdim-faces of this triangulation, in a way that is optimised for Python programmers. More... | |
auto | vertices () const |
A dimension-specific alias for faces<0>(). More... | |
auto | edges () const |
A dimension-specific alias for faces<1>(). More... | |
auto | triangles () const |
A dimension-specific alias for faces<2>(), or an alias for simplices() in dimension dim = 2. More... | |
auto | tetrahedra () const |
A dimension-specific alias for faces<3>(), or an alias for simplices() in dimension dim = 3. More... | |
auto | pentachora () const |
A dimension-specific alias for faces<4>(), or an alias for simplices() in dimension dim = 4. More... | |
Component< dim > * | component (size_t index) const |
Returns the requested connected component of this triangulation. More... | |
BoundaryComponent< dim > * | boundaryComponent (size_t index) const |
Returns the requested boundary component of this triangulation. More... | |
template<int subdim> | |
Face< dim, subdim > * | face (size_t index) const |
Returns the requested subdim-face of this triangulation, in a way that is optimised for C++ programmers. More... | |
auto | face (int subdim, size_t index) const |
Returns the requested subdim-face of this triangulation, in a way that is optimised for Python programmers. More... | |
Face< dim, 0 > * | vertex (size_t index) const |
A dimension-specific alias for face<0>(). More... | |
Face< dim, 1 > * | edge (size_t index) const |
A dimension-specific alias for face<1>(). More... | |
Face< dim, 2 > * | triangle (size_t index) |
A dimension-specific alias for face<2>(), or an alias for simplex() in dimension dim = 2. More... | |
auto | triangle (size_t index) const |
A dimension-specific alias for face<2>(), or an alias for simplex() in dimension dim = 2. More... | |
Face< dim, 3 > * | tetrahedron (size_t index) |
A dimension-specific alias for face<3>(), or an alias for simplex() in dimension dim = 3. More... | |
auto | tetrahedron (size_t index) const |
A dimension-specific alias for face<3>(), or an alias for simplex() in dimension dim = 3. More... | |
Face< dim, 4 > * | pentachoron (size_t index) |
A dimension-specific alias for face<4>(), or an alias for simplex() in dimension dim = 4. More... | |
auto | pentachoron (size_t index) const |
A dimension-specific alias for face<4>(), or an alias for simplex() in dimension dim = 4. More... | |
Basic Properties | |
bool | isEmpty () const |
Determines whether this triangulation is empty. More... | |
bool | isValid () const |
Determines if this triangulation is valid. More... | |
bool | hasBoundaryFacets () const |
Determines if this triangulation has any boundary facets. More... | |
size_t | countBoundaryFacets () const |
Returns the total number of boundary facets in this triangulation. More... | |
bool | isOrientable () const |
Determines if this triangulation is orientable. More... | |
bool | isConnected () const |
Determines if this triangulation is connected. More... | |
bool | isOriented () const |
Determines if this triangulation is oriented; that is, if the vertices of its top-dimensional simplices are labelled in a way that preserves orientation across adjacent facets. More... | |
long | eulerCharTri () const |
Returns the Euler characteristic of this triangulation. More... | |
Algebraic Properties | |
const GroupPresentation & | fundamentalGroup () const |
Returns the fundamental group of this triangulation. More... | |
void | simplifiedFundamentalGroup (GroupPresentation newGroup) |
Notifies the triangulation that you have simplified the presentation of its fundamental group. More... | |
template<int k = 1> | |
AbelianGroup | homology () const |
Returns the kth homology group of this triangulation, treating any ideal vertices as though they had been truncated. More... | |
AbelianGroup | homology (int k) const |
Returns the kth homology group of this triangulation, treating any ideal vertices as though they had been truncated, where the parameter k does not need to be known until runtime. More... | |
const AbelianGroup & | homologyH1 () const |
Deprecated routine that returns the first homology group for this triangulation. More... | |
template<int k = 1> | |
MarkedAbelianGroup | markedHomology () const |
Returns the kth homology group of this triangulation, without truncating ideal vertices, but with explicit coordinates that track the individual k-faces of this triangulation. More... | |
MarkedAbelianGroup | markedHomology (int k) const |
Returns the kth homology group of this triangulation, without truncating ideal vertices, but with explicit coordinates that track the individual k-faces of this triangulation, where the parameter k does not need to be known until runtime. More... | |
template<int subdim> | |
MatrixInt | boundaryMap () const |
Returns the boundary map from subdim-faces to (subdim-1)-faces of the triangulation. More... | |
MatrixInt | boundaryMap (int subdim) const |
Returns the boundary map from subdim-faces to (subdim-1)-faces of the triangulation, where the face dimension does not need to be known until runtime. More... | |
Skeletal Transformations | |
void | orient () |
Relabels the vertices of top-dimensional simplices in this triangulation so that all simplices are oriented consistently, if possible. More... | |
void | reflect () |
Relabels the vertices of top-dimensional simplices in this triangulation so that all simplices reflect their orientation. More... | |
template<int k> | |
bool | pachner (Face< dim, k > *f, bool check=true, bool perform=true) |
Checks the eligibility of and/or performs a (dim + 1 - k)-(k + 1) Pachner move about the given k-face. More... | |
Subdivisions, Extensions and Covers | |
void | makeDoubleCover () |
Converts this triangulation into its double cover. More... | |
void | barycentricSubdivision () |
Does a barycentric subdivision of the triangulation. More... | |
bool | finiteToIdeal () |
Converts each real boundary component into a cusp (i.e., an ideal vertex). More... | |
Decompositions | |
std::vector< Triangulation< dim > > | triangulateComponents () const |
Returns the individual connected components of this triangulation. More... | |
Isomorphism Testing | |
bool | operator== (const Triangulation< dim > &other) const |
Determines if this triangulation is combinatorially identical to the given triangulation. More... | |
bool | operator!= (const Triangulation< dim > &other) const |
Determines if this triangulation is not combinatorially identical to the given triangulation. More... | |
bool | isIdenticalTo (const Triangulation< dim > &other) const |
Deprecated routine that determines if this triangulation is combinatorially identical to the given triangulation. More... | |
std::optional< Isomorphism< dim > > | isIsomorphicTo (const Triangulation< dim > &other) const |
Determines if this triangulation is combinatorially isomorphic to the given triangulation. More... | |
std::optional< Isomorphism< dim > > | isContainedIn (const Triangulation< dim > &other) const |
Determines if an isomorphic copy of this triangulation is contained within the given triangulation, possibly as a subcomplex of some larger component (or components). More... | |
template<typename Action , typename... Args> | |
bool | findAllIsomorphisms (const Triangulation< dim > &other, Action &&action, Args &&... args) const |
Finds all ways in which this triangulation is combinatorially isomorphic to the given triangulation. More... | |
template<typename Action , typename... Args> | |
bool | findAllSubcomplexesIn (const Triangulation< dim > &other, Action &&action, Args &&... args) const |
Finds all ways in which an isomorphic copy of this triangulation is contained within the given triangulation, possibly as a subcomplex of some larger component (or components). More... | |
bool | makeCanonical () |
Relabel the top-dimensional simplices and their vertices so that this triangulation is in canonical form. More... | |
Building Triangulations | |
void | insertTriangulation (const Triangulation< dim > &source) |
Inserts a copy of the given triangulation into this triangulation. More... | |
void | insertConstruction (size_t nSimplices, const int adjacencies[][dim+1], const int gluings[][dim+1][dim+1]) |
Deprecated routine that inserts a given triangulation into this triangulation, where the given triangulation is described by a pair of integer arrays. More... | |
Exporting Triangulations | |
void | writeTextShort (std::ostream &out) const |
Writes a short text representation of this object to the given output stream. More... | |
void | writeTextLong (std::ostream &out) const |
Writes a detailed text representation of this object to the given output stream. More... | |
template<class Type = IsoSigClassic<dim>, class Encoding = IsoSigPrintable<dim>> | |
Encoding::Signature | isoSig () const |
Constructs the isomorphism signature of the given type for this triangulation. More... | |
template<class Type = IsoSigClassic<dim>, class Encoding = IsoSigPrintable<dim>> | |
std::pair< typename Encoding::Signature, Isomorphism< dim > > | isoSigDetail () const |
Constructs the isomorphism signature for this triangulation, along with the relabelling that will occur when the triangulation is reconstructed from it. More... | |
std::string | dumpConstruction () const |
Returns C++ code that can be used to reconstruct this triangulation. More... | |
Static Public Attributes | |
static constexpr int | dimension = dim |
A compile-time constant that gives the dimension of the triangulation. More... | |
Protected Member Functions | |
void | swap (Snapshottable &other) noexcept |
Swap operation. More... | |
void | takeSnapshot () |
Must be called before modification and/or destruction of the type T contents. More... | |
bool | isReadOnlySnapshot () const |
Determines if this object is a read-only deep copy that was created by a snapshot. More... | |
Protected Attributes | |
MarkedVector< Simplex< dim > > | simplices_ |
The top-dimensional simplices that form the triangulation. More... | |
MarkedVector< BoundaryComponent< dim > > | boundaryComponents_ |
The components that form the boundary of the triangulation. More... | |
bool | valid_ |
Is this triangulation valid? See isValid() for details on what this means. More... | |
uint8_t | topologyLock_ |
If non-zero, this will cause Triangulation<dim>::clearAllProperties() to preserve any computed properties that related to the manifold (as opposed to the specific triangulation). More... | |
PacketHeldBy | heldBy_ |
Indicates whether this Held object is in fact the inherited data for a PacketOf<Held>. More... | |
Simplices | |
class | detail::SimplexBase< dim > |
class | detail::TriangulationBase< dim > |
Triangulation & | operator= (const Triangulation &)=default |
Sets this to be a (deep) copy of the given triangulation. More... | |
Triangulation & | operator= (Triangulation &&src)=default |
Moves the contents of the given triangulation into this triangulation. More... | |
void | swap (Triangulation< dim > &other) |
Swaps the contents of this and the given triangulation. More... | |
void | swapContents (Triangulation< dim > &other) |
Deprecated routine that swaps the contents of this and the given triangulation. More... | |
Importing Triangulations | |
static Triangulation< dim > | fromGluings (size_t size, std::initializer_list< std::tuple< size_t, int, size_t, Perm< dim+1 > > > gluings) |
Creates a triangulation from a hard-coded list of gluings. More... | |
template<typename Iterator > | |
static Triangulation< dim > | fromGluings (size_t size, Iterator beginGluings, Iterator endGluings) |
Creates a triangulation from a list of gluings. More... | |
static Triangulation< dim > | fromIsoSig (const std::string &sig) |
Recovers a full triangulation from an isomorphism signature. More... | |
static Triangulation< dim > | fromSig (const std::string &sig) |
Alias for fromIsoSig(), to recover a full triangulation from an isomorphism signature. More... | |
static size_t | isoSigComponentSize (const std::string &sig) |
Deduces the number of top-dimensional simplices in a connected triangulation from its isomorphism signature. More... | |
void | ensureSkeleton () const |
Ensures that all "on demand" skeletal objects have been calculated. More... | |
bool | calculatedSkeleton () const |
Determines whether the skeletal objects and properties of this triangulation have been calculated. More... | |
void | calculateSkeleton () |
Calculates all skeletal objects for this triangulation. More... | |
void | clearBaseProperties () |
Clears all properties that are managed by this base class. More... | |
void | swapBaseData (TriangulationBase< dim > &other) |
Swaps all data that is managed by this base class, including simplices, skeletal data, cached properties and the snapshotting data, with the given triangulation. More... | |
void | writeXMLBaseProperties (std::ostream &out) const |
Writes a chunk of XML containing properties of this triangulation. More... | |
A dim-dimensional triangulation, built by gluing together dim-dimensional simplices along their (dim-1)-dimensional facets.
Typically (but not necessarily) such triangulations are used to represent dim-manifolds.
Such triangulations are not the same as pure simplicial complexes, for two reasons:
Amongst other things, this definition is general enough to capture any reasonable definition of a dim-manifold triangulation. However, there is no requirement that a triangulation must actually represent a manifold (and indeed, testing this condition is undecidable for sufficiently large dim).
You can construct a triangulation from scratch using routines such as newSimplex() and Simplex<dim>::join(). There are also routines for exporting and importing triangulations in bulk, such as isoSig() and fromIsoSig() (which use isomorphism signatures), or dumpConstruction() and fromGluings() (which use C++ code).
In additional to top-dimensional simplices, this class also tracks:
Such objects are temporary: whenever the triangulation changes, they will be deleted and rebuilt, and any pointers to them will become invalid. Likewise, if the triangulation is deleted then all component objects will be deleted alongside it.
Since Regina 7.0, this is no longer a "packet type" that can be inserted directly into the packet tree. Instead a Triangulation is now a standalone mathematatical object, which makes it slimmer and faster for ad-hoc use. The consequences of this are:
This class implements C++ move semantics and adheres to the C++ Swappable requirement. It is designed to avoid deep copies wherever possible, even when passing or returning objects by value.
For Regina's standard dimensions, this template is specialised and offers much more functionality. In order to use these specialised classes, you will need to include the corresponding headers (e.g., triangulation/dim2.h for dim = 2, or triangulation/dim3.h for dim = 3).
dim | the dimension of the underlying triangulation. This must be between 2 and 15 inclusive. |
|
inline |
Default constructor.
Creates an empty triangulation.
|
inline |
Creates a new copy of the given triangulation.
This will clone any computed properties (such as homology, fundamental group, and so on) of the given triangulation also. If you want a "clean" copy that resets all properties to unknown, you can use the two-argument copy constructor instead.
copy | the triangulation to copy. |
|
inline |
Creates a new copy of the given triangulation, with the option of whether or not to clone its computed properties also.
copy | the triangulation to copy. |
cloneProps | true if this should also clone any computed properties of the given triangulation (such as homology, fundamental group, and so on), or false if the new triangulation should have all properties marked as unknown. |
|
defaultnoexcept |
Moves the given triangulation into this new triangulation.
This is much faster than the copy constructor, but is still linear time. This is because every top-dimensional simplex must be adjusted to point back to this new triangulation instead of src.
All top-dimensional simplices and skeletal objects (faces, components and boundary components) that belong to src will be moved into this triangulation, and so any pointers or references to Simplex<dim>, Face<dim, subdim>, Component<dim> or BoundaryComponent<dim> objects will remain valid. Likewise, all cached properties will be moved into this triangulation.
The triangulation that is passed (src) will no longer be usable.
noexcept
, and in particular does not fire any change events. This is because this triangulation is freshly constructed (and therefore has no listeners yet), and because we assume that src is about to be destroyed (an action that will fire a packet destruction event).src | the triangulation to move. |
|
inline |
Destroys this triangulation.
The constituent simplices, the cellular structure and all other properties will also be destroyed.
|
inherited |
A unique string ID that can be used in place of a packet ID.
This is an alternative to Packet::internalID(), and is designed for use when Held is not actually wrapped by a PacketOf<Held>. (An example of such a scenario is when a normal surface list needs to write its triangulation to file, but the triangulation is a standalone object that is not stored in a packet.)
The ID that is returned will:
These IDs are not preserved when copying or moving one object to another, and are not preserved when writing to a Regina data file and then reloading the file contents.
See Packet::internalID() for further details.
|
inherited |
Does a barycentric subdivision of the triangulation.
This is done in-place, i.e., the triangulation will be modified directly.
Each top-dimensional simplex s is divided into (dim + 1) factorial sub-simplices by placing an extra vertex at the centroid of every face of every dimension. Each of these sub-simplices t is described by a permutation p of (0, ..., dim). The vertices of such a sub-simplex t are:
The sub-simplices have their vertices numbered in a way that mirrors the original simplex s:
In particular, if this triangulation is currently oriented, then this barycentric subdivision will preserve the orientation.
If simplex s has index i in the original triangulation, then its sub-simplex corresponding to permutation p will have index ((dim + 1)! * i + p.orderedSnIndex())
in the resulting triangulation. In other words: sub-simplices are ordered first according to the original simplex that contains them, and then according to the lexicographical ordering of the corresponding permutations p.
size_t
).
|
inlineinherited |
Returns the requested boundary component of this triangulation.
Note that each time the triangulation changes, all boundary components will be deleted and replaced with new ones. Therefore this object should be considered temporary only.
index | the index of the desired boundary component; this must be between 0 and countBoundaryComponents()-1 inclusive. |
|
inlineinherited |
Returns an object that allows iteration through and random access to all boundary components of this triangulation.
Note that, in Regina's standard dimensions, each ideal vertex forms its own boundary component, and some invalid vertices do also. See the BoundaryComponent class notes for full details on what constitutes a boundary component in standard and non-standard dimensions.
The object that is returned is lightweight, and can be happily copied by value. The C++ type of the object is subject to change, so C++ users should use auto
(just like this declaration does).
The returned object is guaranteed to be an instance of ListView, which means it offers basic container-like functions and supports C++11 range-based for
loops. Note that the elements of the list will be pointers, so your code might look like:
The object that is returned will remain up-to-date and valid for as long as the triangulation exists. In contrast, however, remember that the individual boundary components within this list will be deleted and replaced each time the triangulation changes. Therefore it is best to treat this object as temporary only, and to call boundaryComponents() again each time you need it.
|
inherited |
Returns the boundary map from subdim-faces to (subdim-1)-faces of the triangulation.
This is the boundary map that you would use if you were building the homology groups manually from a chain complex.
Unlike homology(), this code does not use the dual skeleton: instead it uses the primal (i.e., ordinary) skeleton.
The matrix that is returned should be thought of as acting on column vectors. Specifically, the cth column of the matrix corresponds to the cth subdim-face of this triangulation, and the rth row corresponds to the rth (subdim-1)-face of this triangulation. All faces are oriented according to the permutations returned by Simplex::faceMapping(), or equivalently, by FaceEmbedding::vertices().
If you wish to convert these boundary maps to homology groups yourself, either the AbelianGroup class (if you do not need to track which face is which) or the MarkedAbelianGroup class (if you do need to track individual faces) can help you do this.
Note that, unlike many of the templated face-related routines, this routine explicitly supports the case subdim = dim.
homologyMap(subdim)
.subdim | the face dimension; this must be between 1 and dim inclusive. |
|
inlineinherited |
Returns the boundary map from subdim-faces to (subdim-1)-faces of the triangulation, where the face dimension does not need to be known until runtime.
For C++ programmers who know subdim at compile time, you are better off using the template function boundaryMap<subdim>() instead, which is slightly faster.
See the templated boundaryMap<subdim>() for full details on what this function computes and how the matrix it returns should be interpreted.
InvalidArgument | the face dimension subdim is outside the supported range (i.e., less than 1 or greater than dim). |
subdim | the face dimension; this must be between 1 and dim inclusive. |
|
inlineprotectedinherited |
Determines whether the skeletal objects and properties of this triangulation have been calculated.
These are only calculated "on demand", when a skeletal property is first queried.
true
if and only if the skeleton has been calculated.
|
protectedinherited |
Calculates all skeletal objects for this triangulation.
For this parent class, calculateSkeleton() computes properties such as connected components, orientability, and lower-dimensional faces. Some Triangulation<dim> subclasses may track additional skeletal data, in which case they should reimplement this function. Their reimplementations must call this parent implementation.
You should never call this function directly; instead call ensureSkeleton() instead.
|
protectedinherited |
Clears all properties that are managed by this base class.
This includes deleting all skeletal objects and emptying the corresponding internal lists, as well as clearing other cached properties and deallocating the corresponding memory where required.
Note that TriangulationBase almost never calls this routine itself (the one exception is the copy assignment operator). Typically clearBaseProperties() is only ever called by Triangulation<dim>::clearAllProperties(), which in turn is called by "atomic" routines that change the triangluation (before firing packet change events), as well as the Triangulation<dim> destructor.
|
inlineinherited |
Returns the requested connected component of this triangulation.
Note that each time the triangulation changes, all component objects will be deleted and replaced with new ones. Therefore this component object should be considered temporary only.
index | the index of the desired component; this must be between 0 and countComponents()-1 inclusive. |
|
inlineinherited |
Returns an object that allows iteration through and random access to all components of this triangulation.
The object that is returned is lightweight, and can be happily copied by value. The C++ type of the object is subject to change, so C++ users should use auto
(just like this declaration does).
The returned object is guaranteed to be an instance of ListView, which means it offers basic container-like functions and supports C++11 range-based for
loops. Note that the elements of the list will be pointers, so your code might look like:
The object that is returned will remain up-to-date and valid for as long as the triangulation exists. In contrast, however, remember that the individual component objects within this list will be deleted and replaced each time the triangulation changes. Therefore it is best to treat this object as temporary only, and to call components() again each time you need it.
|
inlineinherited |
Returns the number of boundary components in this triangulation.
Note that, in Regina's standard dimensions, each ideal vertex forms its own boundary component, and some invalid vertices do also. See the BoundaryComponent class notes for full details on what constitutes a boundary component in standard and non-standard dimensions.
|
inlineinherited |
Returns the total number of boundary facets in this triangulation.
This routine counts facets of top-dimensional simplices that are not glued to some adjacent top-dimensional simplex.
|
inlineinherited |
Returns the number of connected components in this triangulation.
|
inlineinherited |
A dimension-specific alias for countFaces<1>().
This alias is available for all dimensions dim.
See countFaces() for further information.
|
inlineinherited |
Returns the number of subdim-faces in this triangulation.
This is the fastest way to count faces if you know subdim at compile time.
For convenience, this routine explicitly supports the case subdim = dim. This is not the case for the routines face() and faces(), which give access to individual faces (the reason relates to the fact that top-dimensional simplices are built manually, whereas lower-dimensional faces are deduced properties).
countFaces(subdim)
.subdim | the face dimension; this must be between 0 and dim inclusive. |
|
inlineinherited |
Returns the number of subdim-faces in this triangulation, where the face dimension does not need to be known until runtime.
This routine takes linear time in the dimension dim. For C++ programmers who know subdim at compile time, you are better off using the template function countFaces<subdim>() instead, which is fast constant time.
For convenience, this routine explicitly supports the case subdim = dim. This is not the case for the routines face() and faces(), which give access to individual faces (the reason relates to the fact that top-dimensional simplices are built manually, whereas lower-dimensional faces are deduced properties).
InvalidArgument | the face dimension subdim is outside the supported range (i.e., negative or greater than dim). |
subdim | the face dimension; this must be between 0 and dim inclusive. |
|
inlineinherited |
A dimension-specific alias for countFaces<4>().
This alias is available for dimensions dim ≥ 4.
See countFaces() for further information.
|
inlineinherited |
A dimension-specific alias for countFaces<3>().
This alias is available for dimensions dim ≥ 3.
See countFaces() for further information.
|
inlineinherited |
A dimension-specific alias for countFaces<2>().
This alias is available for all dimensions dim.
See countFaces() for further information.
|
inlineinherited |
A dimension-specific alias for countFaces<0>().
This alias is available for all dimensions dim.
See countFaces() for further information.
|
inherited |
Returns a detailed text representation of this object.
This text may span many lines, and should provide the user with all the information they could want. It should be human-readable, should not contain extremely long lines (which cause problems for users reading the output in a terminal), and should end with a final newline. There are no restrictions on the underlying character set.
|
inherited |
Returns C++ code that can be used to reconstruct this triangulation.
This code will call Triangulation<dim>::fromGluings(), passing a hard-coded C++11 initialiser list.
The main purpose of this routine is to generate this hard-coded initialiser list, which can be tedious and error-prone to write by hand.
Note that the number of lines of code produced grows linearly with the number of simplices. If this triangulation is very large, the returned string will be very large as well.
|
inlineinherited |
|
inlineinherited |
A dimension-specific alias for faces<1>().
This alias is available for all dimensions dim.
See faces() for further information.
|
inlineprotectedinherited |
Ensures that all "on demand" skeletal objects have been calculated.
|
inlineinherited |
Returns the Euler characteristic of this triangulation.
This will be evaluated strictly as the alternating sum of the number of i-faces (that is, countVertices() - countEdges() + countTriangles() - ...
).
Note that this routine handles ideal triangulations in a non-standard way. Since it computes the Euler characteristic of the triangulation (and not the underlying manifold), this routine will treat each ideal boundary component as a single vertex, and not as an entire (dim-1)-dimensional boundary component.
In Regina's standard dimensions, for a routine that handles ideal boundary components properly (by treating them as (dim-1)-dimensional boundary components when computing Euler characteristic), you can use the routine eulerCharManifold() instead.
|
inlineinherited |
Returns the requested subdim-face of this triangulation, in a way that is optimised for Python programmers.
For C++ users, this routine is not very useful: since precise types must be know at compile time, this routine returns a std::variant v that could store a pointer to any class Face<dim, ...>. This means you cannot access the face directly: you will still need some kind of compile-time knowledge of subdim before you can extract and use an appropriate Face<dim, subdim> object from v. However, once you know subdim at compile time, you are better off using the (simpler and faster) routine face<subdim>() instead.
For Python users, this routine is much more useful: the return type can be chosen at runtime, and so this routine simply returns a Face<dim, subdim> object of the appropriate face dimension that you can use immediately.
The specific return type for C++ programmers will be std::variant<Face<dim, 0>*, ..., Face<dim, dim-1>*>.
InvalidArgument | the face dimension subdim is outside the supported range (i.e., negative, or greater than or equal to dim). |
subdim | the face dimension; this must be between 0 and dim-1 inclusive. |
index | the index of the desired face, ranging from 0 to countFaces<subdim>()-1 inclusive. |
|
inlineinherited |
Returns the requested subdim-face of this triangulation, in a way that is optimised for C++ programmers.
face(subdim, index)
.subdim | the face dimension; this must be between 0 and dim-1 inclusive. |
index | the index of the desired face, ranging from 0 to countFaces<subdim>()-1 inclusive. |
|
inlineinherited |
Returns an object that allows iteration through and random access to all subdim-faces of this triangulation, in a way that is optimised for C++ programmers.
The object that is returned is lightweight, and can be happily copied by value. The C++ type of the object is subject to change, so C++ users should use auto
(just like this declaration does).
The returned object is guaranteed to be an instance of ListView, which means it offers basic container-like functions and supports C++11 range-based for
loops. Note that the elements of the list will be pointers, so your code might look like:
The object that is returned will remain up-to-date and valid for as long as the triangulation exists. In contrast, however, remember that the individual faces within this list will be deleted and replaced each time the triangulation changes. Therefore it is best to treat this object as temporary only, and to call faces() again each time you need it.
faces(subdim)
.subdim | the face dimension; this must be between 0 and dim-1 inclusive. |
|
inlineinherited |
Returns an object that allows iteration through and random access to all subdim-faces of this triangulation, in a way that is optimised for Python programmers.
C++ users should not use this routine. The return type must be fixed at compile time, and so it is a std::variant that can hold any of the lightweight return types from the templated faces<subdim>() function. This means that the return value will still need compile-time knowledge of subdim to extract and use the appropriate face objects. However, once you know subdim at compile time, you are much better off using the (simpler and faster) routine faces<subdim>() instead.
For Python users, this routine is much more useful: the return type can be chosen at runtime, and so this routine returns a Python list of Face<dim, subdim> objects (holding all the subdim-faces of the triangulation), which you can use immediately.
InvalidArgument | the face dimension subdim is outside the supported range (i.e., negative, or greater than or equal to dim). |
subdim | the face dimension; this must be between 0 and dim-1 inclusive. |
|
inlineinherited |
Finds all ways in which this triangulation is combinatorially isomorphic to the given triangulation.
This routine behaves identically to isIsomorphicTo(), except that instead of returning just one isomorphism, all such isomorphisms will be found and processed. See the isIsomorphicTo() notes for details on this.
For each isomorphism that is found, this routine will call action (which must be a function or some other callable object).
(const Isomorphism<dim>&)
; this will be a reference to the isomorphism that was found. If action wishes to keep the isomorphism, it should take a deep copy (not a reference), since the isomorphism may be changed and reused after action returns.bool
. A return value of false
indicates that the search for isomorphisms should continue, and a return value of true
indicates that the search should terminate immediately.findAllIsomorphisms(other, action)
, which mirrors the C++ function: it takes action which may be a pure Python function, the return value indicates whether action ever terminated the search, but it does not take an additonal argument list (args). The second form is findAllIsomorphisms(other)
, which returns a Python list containing all of the isomorphisms that were found.other | the triangulation to compare with this one. |
action | a function (or other callable object) to call for each isomorphism that is found. |
args | any additional arguments that should be passed to action, following the initial isomorphism argument. |
true
if action ever terminated the search by returning true
, or false
if the search was allowed to run to completion.
|
inlineinherited |
Finds all ways in which an isomorphic copy of this triangulation is contained within the given triangulation, possibly as a subcomplex of some larger component (or components).
This routine behaves identically to isContainedIn(), except that instead of returning just one isomorphism (which may be boundary incomplete and need not be onto), all such isomorphisms will be found and processed. See the isContainedIn() notes for details on this.
For each isomorphism that is found, this routine will call action (which must be a function or some other callable object).
(const Isomorphism<dim>&)
; this will be a reference to the isomorphism that was found. If action wishes to keep the isomorphism, it should take a deep copy (not a reference), since the isomorphism may be changed and reused after action returns.bool
. A return value of false
indicates that the search for isomorphisms should continue, and a return value of true
indicates that the search should terminate immediately.findAllSubcomplexesIn(other, action)
, which mirrors the C++ function: it takes action which may be a pure Python function, the return value indicates whether action ever terminated the search, but it does not take an additonal argument list (args). The second form is findAllSubcomplexesIn(other)
, which returns a Python list containing all of the isomorphisms that were found.other | the triangulation in which to search for isomorphic copies of this triangulation. |
action | a function (or other callable object) to call for each isomorphism that is found. |
args | any additional arguments that should be passed to action, following the initial isomorphism argument. |
true
if action ever terminated the search by returning true
, or false
if the search was allowed to run to completion.
|
inherited |
Converts each real boundary component into a cusp (i.e., an ideal vertex).
Only boundary components formed from real (dim-1)-faces will be affected; ideal boundary components are already cusps and so will not be changed.
One side-effect of this operation is that all spherical boundary components will be filled in with balls.
This operation is performed by attaching a new dim-simplex to each boundary (dim-1)-face, and then gluing these new simplices together in a way that mirrors the adjacencies of the underlying boundary facets. Each boundary component will thereby be pushed up through the new simplices and converted into a cusp formed using vertices of these new simplices.
In Regina's standard dimensions, where triangulations also support an idealToFinite() operation, this routine is a loose converse of that operation.
In dimension 2, every boundary component is spherical and so this routine simply fills all the punctures in the underlying surface. (In dimension 2, triangulations cannot have cusps).
true
if changes were made, or false
if the original triangulation contained no real boundary components.
|
staticinherited |
Creates a triangulation from a list of gluings.
This routine is an analogue to the variant of fromGluings() that takes a C++11 initialiser list; however, here the input data may be constructed at runtime (which makes it accessible to Python, amongst other things).
The iterator range (beginGluings, endGluings) should encode the list of gluings for the triangulation. Each iterator in this range must dereference to a tuple of the form (simp, facet, adj, gluing); here simp, facet and adj are all integers, and gluing is of type Perm<dim+1>. Each such tuple indicates that facet facet of top-dimensional simplex number simp should be glued to top-dimensional simplex number adj using the permutation gluing. In other words, such a tuple encodes the same information as calling simplex(simp).join(facet, simplex(adj), gluing)
upon the triangulation being constructed.
Every gluing should be encoded from one direction only. This means, for example, that to build a closed 3-manifold triangulation with n tetrahedra, you would pass a list of 2n such tuples. If you attempt to make the same gluing twice (e.g., once from each direction), then this routine will throw an exception.
Any facet of a simplex that does not feature in the given list of gluings (either as a source or a destination) will be left as a boundary facet.
Note that, as usual, the top-dimensional simplices are numbered 0,...,(size-1), and the facets of each simplex are numbered 0,...,dim.
As an example, Python users can construct the figure eight knot complement as follows:
InvalidArgument | the given list of gluings does not correctly describe a triangulation with size top-dimensional simplices. |
size | the number of top-dimensional simplices in the triangulation to construct. |
beginGluings | the beginning of the list of gluings, as described above. |
endGluings | a past-the-end iterator indicating the end of the list of gluings. |
|
inlinestaticinherited |
Creates a triangulation from a hard-coded list of gluings.
This routine takes a C++11 initialiser list, which makes it useful for creating hard-coded examples directly in C++ code without needing to write a tedious sequence of calls to Simplex<dim>::join().
Each element of the initialiser list should be a tuple of the form (simp, facet, adj, gluing), which indicates that facet facet of top-dimensional simplex number simp should be glued to top-dimensional simplex number adj using the permutation gluing. In other words, such a tuple encodes the same information as calling simplex(simp).join(facet, simplex(adj), gluing)
upon the triangulation being constructed.
Every gluing should be encoded from one direction only. This means, for example, that to build a closed 3-manifold triangulation with n tetrahedra, you would pass a list of 2n such tuples. If you attempt to make the same gluing twice (e.g., once from each direction), then this routine will throw an exception.
Any facet of a simplex that does not feature in the given list of gluings (either as a source or a destination) will be left as a boundary facet.
Note that, as usual, the top-dimensional simplices are numbered 0,...,(size-1), and the facets of each simplex are numbered 0,...,dim.
As an example, you can construct the figure eight knot complement using the following code:
InvalidArgument | the given list of gluings does not correctly describe a triangulation with size top-dimensional simplices. |
size | the number of top-dimensional simplices in the triangulation to construct. |
gluings | describes the gluings between these top-dimensional simplices, as described above. |
|
staticinherited |
Recovers a full triangulation from an isomorphism signature.
See isoSig() for more information on isomorphism signatures. It will be assumed that the signature describes a triangulation of dimension dim.
Currently this routine only supports isomorphism signatures that were created with the default encoding (i.e., there was no Encoding template parameter passed to isoSig()).
Calling isoSig() followed by fromIsoSig() is not guaranteed to produce an identical triangulation to the original, but it is guaranteed to produce a combinatorially isomorphic triangulation. In other words, fromIsoSig() may reconstruct the triangulation with its simplices and/or vertices relabelled. The optional argument to isoSig() allows you to determine the precise relabelling that will be used, if you need to know it.
For a full and precise description of the isomorphism signature format for 3-manifold triangulations, see Simplification paths in the Pachner graphs of closed orientable 3-manifold triangulations, Burton, 2011, arXiv:1110.6080
. The format for other dimensions is essentially the same, but with minor dimension-specific adjustments.
InvalidArgument | the given string was not a valid dim-dimensional isomorphism signature created using the default encoding. |
sig | the isomorphism signature of the triangulation to construct. Note that isomorphism signatures are case-sensitive (unlike, for example, dehydration strings for 3-manifolds). |
|
inlinestaticinherited |
Alias for fromIsoSig(), to recover a full triangulation from an isomorphism signature.
This alias fromSig() is provided to assist with generic code that can work with both triangulations and links.
See fromIsoSig() for further details.
InvalidArgument | the given string was not a valid dim-dimensional isomorphism signature created using the default encoding. |
sig | the isomorphism signature of the triangulation to construct. Note that isomorphism signatures are case-sensitive (unlike, for example, dehydration strings for 3-manifolds). |
|
inherited |
Returns the fundamental group of this triangulation.
The fundamental group is computed in the dual 2-skeleton. This means:
Bear in mind that each time the triangulation changes, the fundamental group will be deleted. Thus the reference that is returned from this routine should not be kept for later use. Instead, fundamentalGroup() should be called again; this will be instantaneous if the group has already been calculated.
|
inlineinherited |
Returns the f-vector of this triangulation, which counts the number of faces of all dimensions.
The vector that is returned will have length dim+1. If this vector is f, then f[k] will be the number of k-faces for each 0 ≤ k ≤ dim.
This routine is significantly more heavyweight than countFaces(). Its advantage is that, unlike the templatised countFaces(), it allows you to count faces whose dimensions are not known until runtime.
|
inlineinherited |
Determines if this triangulation has any boundary facets.
This routine returns true
if and only if the triangulation contains some top-dimension simplex with at least one facet that is not glued to an adjacent simplex.
true
if and only if there are boundary facets.
|
inherited |
Returns the kth homology group of this triangulation, treating any ideal vertices as though they had been truncated.
A problem here is that, if dim is not one of Regina's standard dimensions, then Regina cannot actually detect ideal vertices (since in general this requires solving undecidable problems). Currently we resolve this by insisting that, in higher dimensions, the homology dimension k is at most (dim-2); the underlying algorithm will then effectively truncate all vertices (since truncating "ordinary" vertices whose links are spheres or balls does not affect the kth homology in such cases).
In general, this routine insists on working with a valid triangulation (see isValid() for what this means). However, for historical reasons, if you are computing first homology (k = 1) then your triangulation is allowed to be invalid, though the results might or might not be useful to you. The homology will be computed using the dual skeleton: what this means is that any invalid faces of dimension 0,1,...,(dim-3) will be treated as though their centroids had been truncated, but any invalid (dim-2)-faces will be treated without such truncation. A side-effect is that, after performing a barycentric on an invalid triangulation, the group returned by homology<1>() might change.
FailedPrecondition | This triangulation is invalid, and the homology dimension k is not 1. |
homology(k)
.k | the dimension of the homology group to return; this must be between 1 and (dim - 1) inclusive if dim is one of Regina's standard dimensions, or between 1 and (dim - 2) inclusive if not. |
|
inlineinherited |
Returns the kth homology group of this triangulation, treating any ideal vertices as though they had been truncated, where the parameter k does not need to be known until runtime.
For C++ programmers who know k at compile time, you are better off using the template function homology<k>() instead, which is slightly faster.
See the templated homology<k>() for full details on exactly what this function computes.
FailedPrecondition | This triangulation is invalid, and the homology dimension k is not 1. |
InvalidArgument | the homology dimension k is outside the supported range. This range depends upon the triangulation dimension dim; for details see the documentation below for the argument k. |
k | the dimension of the homology group to return; this must be between 1 and (dim - 1) inclusive if dim is one of Regina's standard dimensions, or between 1 and (dim - 2) inclusive if not. |
|
inlineinherited |
Deprecated routine that returns the first homology group for this triangulation.
|
inherited |
Deprecated routine that inserts a given triangulation into this triangulation, where the given triangulation is described by a pair of integer arrays.
The main purpose of this routine was to help users to hard-code triangulations into C++ source files. Nowadays you are better off doing this through fromGluings() instead.
This routine will insert an additional nSimplices top-dimensional simplices into this triangulation. We number these simplices 0,1,...,nSimplices-1. The gluings between these new simplices should be stored in the two arrays as follows.
The adjacencies array describes which simplices are joined to which others. Specifically, adjacencies[s][f]
indicates which of the new simplices is joined to facet f of simplex s. This should be between 0 and nSimplices-1 inclusive, or -1 if facet f of simplex s is to be left as a boundary facet.
The gluings array describes the particular gluing permutations used to join these simplices together. Specifically, gluings[s][f][0..dim]
should describe the permutation used to join facet f of simplex s to its adjacent simplex. These dim+1 integers should be 0,1,...,dim in some order, so that gluings[s][f][i]
contains the image of i under this permutation. If facet f of simplex s is to be left as a boundary facet, then gluings[s][f][0..dim]
may contain anything (and will be duly ignored).
If this triangulation is empty before this routine is called, then the new simplices will be given indices 0,1,...,nSimplices-1 according to the numbering described above. Otherwise they will be inserted after any pre-existing simplices, and so they will be given larger indices instead. In the latter case, the adjacencies array should still refer to the new simplices as 0,1,...,nSimplices-1, and this routine will handle any renumbering automatically at runtime.
It is the responsibility of the caller of this routine to ensure that the given arrays are correct and consistent. No error checking will be performed by this routine.
nSimplices | the number of additional simplices to insert. |
adjacencies | describes which simplices are adjace to which others, as described above. This array must have initial dimension at least nSimplices. |
gluings | describes the specific gluing permutations, as described above. This array must also have initial dimension at least nSimplices. |
|
inherited |
Inserts a copy of the given triangulation into this triangulation.
The top-dimensional simplices of source will be copied into this triangulation in the same order in which they appear in source. That is, if the original size of this triangulation was S, then the simplex at index i in source will be copied into this triangulation as a new simplex at index S+i.
The copies will use the same vertex numbering and descriptions as the original simplices from source, and any gluings between the simplices of source will likewise be copied across as gluings between their copies in this triangulation.
This routine behaves correctly when source is this triangulation.
source | the triangulation whose copy will be inserted. |
|
inlineinherited |
Determines if this triangulation is connected.
This routine returns false
only if there is more than one connected component. In particular, it returns true
for the empty triangulation.
true
if and only if this triangulation is connected.
|
inlineinherited |
Determines if an isomorphic copy of this triangulation is contained within the given triangulation, possibly as a subcomplex of some larger component (or components).
Specifically, this routine determines if there is a boundary incomplete combinatorial isomorphism from this triangulation to other. Boundary incomplete isomorphisms are described in detail in the Isomorphism class notes.
In particular, note that facets of top-dimensional simplices that lie on the boundary of this triangulation need not correspond to boundary facets of other, and that other may contain more top-dimensional simplices than this triangulation.
If a boundary incomplete isomorphism is found, the details of this isomorphism are returned. Thus, to test whether an isomorphism exists, you can just call if (isContainedIn(other))
.
If more than one such isomorphism exists, only one will be returned. For a routine that returns all such isomorphisms, see findAllSubcomplexesIn().
other | the triangulation in which to search for an isomorphic copy of this triangulation. |
|
inlineinherited |
Determines whether this triangulation is empty.
An empty triangulation is one with no simplices at all.
true
if and only if this triangulation is empty.
|
inlineinherited |
Deprecated routine that determines if this triangulation is combinatorially identical to the given triangulation.
other | the triangulation to compare with this. |
true
if and only if the two triangulations are combinatorially identical.
|
inlineinherited |
Determines if this triangulation is combinatorially isomorphic to the given triangulation.
Two triangulations are isomorphic if and only it is possible to relabel their top-dimensional simplices and the (dim+1) vertices of each simplex in a way that makes the two triangulations combinatorially identical, as returned by isIdenticalTo().
Equivalently, two triangulations are isomorphic if and only if there is a one-to-one and onto boundary complete combinatorial isomorphism from this triangulation to other, as described in the Isomorphism class notes.
In particular, note that this triangulation and other must contain the same number of top-dimensional simplices for such an isomorphism to exist.
If the triangulations are isomorphic, then this routine returns one such boundary complete isomorphism (i.e., one such relabelling). Otherwise it returns no value. Thus, to test whether an isomorphism exists, you can just call if (isIsomorphicTo(other))
.
There may be many such isomorphisms between the two triangulations. If you need to find all such isomorphisms, you may call findAllIsomorphisms() instead.
If you need to ensure that top-dimensional simplices are labelled the same in both triangulations (i.e., that the triangulations are related by the identity isomorphism), you should call the stricter test isIdenticalTo() instead.
other | the triangulation to compare with this one. |
|
inlineinherited |
Determines if this triangulation is orientable.
true
if and only if this triangulation is orientable.
|
inherited |
Determines if this triangulation is oriented; that is, if the vertices of its top-dimensional simplices are labelled in a way that preserves orientation across adjacent facets.
Specifically, this routine returns true
if and only if every gluing permutation has negative sign.
Note that orientable triangulations are not always oriented by default. You can call orient() if you need the top-dimensional simplices to be oriented consistently as described above.
A non-orientable triangulation can never be oriented.
true
if and only if all top-dimensional simplices are oriented consistently.
|
inherited |
Constructs the isomorphism signature of the given type for this triangulation.
Support for different types of signature is new to Regina 7.0 (see below for details); all isomorphism signatures created in Regina 6.0.1 or earlier are of the default type IsoSigClassic.
An isomorphism signature is a compact representation of a triangulation that uniquely determines the triangulation up to combinatorial isomorphism. That is, for any fixed signature type T, two triangulations of dimension dim are combinatorially isomorphic if and only if their isomorphism signatures of type T are the same.
The length of an isomorphism signature is proportional to n log n
, where n is the number of top-dimenisonal simplices. The time required to construct it is worst-case O((dim!) n^2 log^2 n)
. Whilst this is fine for large triangulations, it becomes very slow for large dimensions; the main reason for introducing different signature types is that some alternative types can be much faster to compute in practice.
Whilst the format of an isomorphism signature bears some similarity to dehydration strings for 3-manifolds, they are more general: isomorphism signatures can be used with any triangulations, including closed, bounded and/or disconnected triangulations, as well as triangulations with many simplices. Note also that 3-manifold dehydration strings are not unique up to isomorphism (they depend on the particular labelling of tetrahedra).
The routine fromIsoSig() can be used to recover a triangulation from an isomorphism signature (only if the default encoding has been used, but it does not matter which signature type was used). The triangulation recovered might not be identical to the original, but it will be combinatorially isomorphic. If you need the precise relabelling, you can call isoSigDetail() instead.
Regina supports several different variants of isomorphism signatures, which are tailored to different computational needs; these are currently determined by the template parameters Type and Encoding:
You may instead pass your own type and/or encoding parameters as template arguments. Currently this facility is for internal use only, and the requirements for type and encoding parameters may change in future versions of Regina. At present:
For a full and precise description of the classic isomorphism signature format for 3-manifold triangulations, see Simplification paths in the Pachner graphs of closed orientable 3-manifold triangulations, Burton, 2011, arXiv:1110.6080
. The format for other dimensions is essentially the same, but with minor dimension-specific adjustments.
isoSig_EdgeDegrees
(for the case where Type is the class IsoSigEdgeDegrees). Currently Regina only offers one encoding (the default), and so there are no suffixes for encodings.
|
staticinherited |
Deduces the number of top-dimensional simplices in a connected triangulation from its isomorphism signature.
See isoSig() for more information on isomorphism signatures. It will be assumed that the signature describes a triangulation of dimension dim.
Currently this routine only supports isomorphism signatures that were created with the default encoding (i.e., there was no Encoding template parameter passed to isoSig()).
If the signature describes a connected triangulation, this routine will simply return the size of that triangulation (e.g., the number of tetrahedra in the case dim = 3). You can also pass an isomorphism signature that describes a disconnected triangulation; however, this routine will only return the number of top-dimensional simplices in the first connected component. If you need the total size of a disconnected triangulation, you will need to reconstruct the full triangulation by calling fromIsoSig() instead.
This routine is very fast, since it only examines the first few characters of the isomorphism signature (in which the size of the first component is encoded). However, a side-effect of this is that it is possible to pass an invalid isomorphism signature and still receive a positive result. If you need to test whether a signature is valid or not, you must call fromIsoSig() instead, which will examine the entire signature in full.
sig | the isomorphism signature of a dim-dimensional triangulation. Note that isomorphism signature are case-sensitive (unlike, for example, dehydration strings for 3-manifolds). |
|
inherited |
Constructs the isomorphism signature for this triangulation, along with the relabelling that will occur when the triangulation is reconstructed from it.
Essentially, an isomorphism signature is a compact representation of a triangulation that uniquely determines the triangulation up to combinatorial isomorphism. See isoSig() for much more detail on isomorphism signatures as well as the support for different signature types and encodings.
As described in the isoSig() notes, you can call fromIsoSig() to recover a triangulation from an isomorphism signature (assuming the default encoding was used). Whilst the triangulation that is recovered will be combinatorially isomorphic to the original, it might not be identical. This routine returns not only the isomorphism signature, but also an isomorphism that describes the precise relationship between this triangulation and the reconstruction from fromIsoSig().
Specifically, if this routine returns the pair (sig, relabelling), this means that the triangulation reconstructed from fromIsoSig(sig)
will be identical to relabelling.apply(this)
.
isoSigDetail_EdgeDegrees
(for the case where Type is the class IsoSigEdgeDegrees). Currently Regina only offers one encoding (the default), and so there are no suffixes for encodings.FailedPrecondition | This triangulation is either empty or disconnected. |
|
inlineprotectedinherited |
Determines if this object is a read-only deep copy that was created by a snapshot.
Recall that, if an image I of type T has a snapshot pointing to it, and if that image I is about to be modified or destroyed, then the snapshot will make an internal deep copy of I and refer to that instead.
The purpose of this routine is to identify whether the current object is such a deep copy. This may be important information, since a snapshot's deep copy is read-only: it must not be modified or destroyed by the outside world. (Of course the only way to access this deep copy is via const reference from the SnapshotRef dereference operators, but there are settings in which this constness is "forgotten", such as Regina's Python bindings.)
true
if and only if this object is a deep copy that was taken by a Snapshot object of some original type T image.
|
inlineinherited |
Determines if this triangulation is valid.
There are several conditions that might make a dim-dimensional triangulation invalid:
Condition (1) is tested for all dimensions dim. Condition (2) is more difficult, since it relies on undecidable problems. As a result, (2) is only tested when dim is one of Regina's standard dimensions.
If a triangulation is invalid then you can call Face<dim, subdim>::isValid() to discover exactly which face(s) are responsible, and you can call Face<dim, subdim>::hasBadIdentification() and/or Face<dim, subdim>::hasBadLink() to discover exactly which conditions fail.
Note that all invalid vertices are considered to be on the boundary; see isBoundary() for details.
true
if and only if this triangulation is valid.
|
inherited |
Relabel the top-dimensional simplices and their vertices so that this triangulation is in canonical form.
This is essentially the lexicographically smallest labelling when the facet gluings are written out in order.
Two triangulations are isomorphic if and only if their canonical forms are identical.
The lexicographic ordering assumes that the facet gluings are written in order of simplex index and then facet number. Each gluing is written as the destination simplex index followed by the gluing permutation (which in turn is written as the images of 0,1,...,dim in order).
true
if the triangulation was changed, or false
if the triangulation was in canonical form to begin with.
|
inherited |
Converts this triangulation into its double cover.
Each orientable component will be duplicated, and each non-orientable component will be converted into its orientable double cover.
|
inlineinherited |
Returns the kth homology group of this triangulation, without truncating ideal vertices, but with explicit coordinates that track the individual k-faces of this triangulation.
This is a specialised homology routine; you should only use it if you need to understand how individual k-faces (or chains of k-faces) appear within the homology group.
FailedPrecondition | This triangulation is empty or invalid. |
markedHomology(k)
.k | the dimension of the homology group to compute; this must be between 1 and (dim-1) inclusive. |
|
inlineinherited |
Returns the kth homology group of this triangulation, without truncating ideal vertices, but with explicit coordinates that track the individual k-faces of this triangulation, where the parameter k does not need to be known until runtime.
For C++ programmers who know k at compile time, you are better off using the template function markedHomology<k>() instead, which is slightly faster.
See the templated markedHomology<k>() for full details on what this function computes, some important caveats to be aware of, and how the group that it returns should be interpreted.
FailedPrecondition | This triangulation is empty or invalid. |
InvalidArgument | the homology dimension k is outside the supported range (i.e., less than 1 or greater than or equal to dim). |
k | the dimension of the homology group to compute; this must be between 1 and (dim-1) inclusive. |
|
inherited |
Moves the contents of this triangulation into the given destination triangulation, without destroying any pre-existing contents.
All top-dimensional simplices that currently belong to dest will remain there (and will keep the same indices in dest). All top-dimensional simplices that belong to this triangulation will be moved into dest also (but in general their indices will change).
This triangulation will become empty as a result.
Any pointers or references to Simplex<dim> objects will remain valid.
If your intention is to replace the simplices in dest (i.e., you do not need to preserve the original contents), then consider using the move assignment operator instead (which is more streamlined and also moves across any cached properties from the source triangulation).
dest | the triangulation into which simplices should be moved. |
|
inherited |
Creates a new top-dimensional simplex and adds it to this triangulation.
The new simplex will have an empty description. All (dim+1) facets of the new simplex will be boundary facets.
The new simplex will become the last simplex in this triangulation; that is, it will have index size()-1.
|
inherited |
Creates a new top-dimensional simplex with the given description and adds it to this triangulation.
All (dim+1) facets of the new simplex will be boundary facets.
Descriptions are optional, may have any format, and may be empty. How descriptions are used is entirely up to the user.
The new simplex will become the last simplex in this triangulation; that is, it will have index size()-1.
desc | the description to give to the new simplex. |
|
inherited |
Creates k new top-dimensional simplices, adds them to this triangulation, and returns them in a std::array.
The main purpose of this routine is to support structured binding; for example:
All new simplices will have empty descriptions, and all facets of each new simplex will be boundary facets.
The new simplices will become the last k simplices in this triangulation. Specifically, if the return value is the array ret, then each simplex ret[i]
will have index size()-k+i
in the overall triangulation.
k | the number of new top-dimensional simplices to add; this must be non-negative. |
|
inherited |
Creates k new top-dimensional simplices and adds them to this triangulation.
This is similar to the templated routine newSimplices<k>()
, but with two key differences:
All new simplices will have empty descriptions, and all facets of each new simplex will be boundary facets.
The new simplices will become the last k simplices in this triangulation.
k | the number of new top-dimensional simplices to add; this must be non-negative. |
|
inlineinherited |
Determines if this triangulation is not combinatorially identical to the given triangulation.
Here "identical" means that the triangulations have the same number of top-dimensional simplices, with gluings between the same pairs of numbered simplices using the same gluing permutations. In other words, "identical" means that the triangulations are isomorphic via the identity isomorphism.
For the less strict notion of isomorphic triangulations, which allows relabelling of the top-dimensional simplices and their vertices, see isIsomorphicTo() instead.
This test does not examine the textual simplex descriptions, as seen in Simplex<dim>::description(); these may still differ. It also does not test whether lower-dimensional faces are numbered identically (vertices, edges and so on); this routine is only concerned with top-dimensional simplices.
(At the time of writing, two identical triangulations will always number their lower-dimensional faces in the same way. However, it is conceivable that in future versions of Regina there may be situations in which identical triangulations can acquire different numberings for vertices, edges, and so on.)
other | the triangulation to compare with this. |
true
if and only if the two triangulations are not combinatorially identical.
|
default |
Sets this to be a (deep) copy of the given triangulation.
|
default |
Moves the contents of the given triangulation into this triangulation.
This is much faster than copy assignment, but is still linear time. This is because every top-dimensional simplex must be adjusted to point back to this triangulation instead of src.
All top-dimensional simplices and skeletal objects (faces, components and boundary components) that belong to src will be moved into this triangulation, and so any pointers or references to Simplex<dim>, Face<dim, subdim>, Component<dim> or BoundaryComponent<dim> objects will remain valid. Likewise, all cached properties will be moved into this triangulation.
The triangulation that is passed (src) will no longer be usable.
noexcept
, since it fires change events on this triangulation which may in turn call arbitrary code via any registered packet listeners. It deliberately does not fire change events on src, since it assumes that src is about to be destroyed (which will fire a destruction event instead).src | the triangulation to move. |
|
inherited |
Determines if this triangulation is combinatorially identical to the given triangulation.
Here "identical" means that the triangulations have the same number of top-dimensional simplices, with gluings between the same pairs of numbered simplices using the same gluing permutations. In other words, "identical" means that the triangulations are isomorphic via the identity isomorphism.
For the less strict notion of isomorphic triangulations, which allows relabelling of the top-dimensional simplices and their vertices, see isIsomorphicTo() instead.
This test does not examine the textual simplex descriptions, as seen in Simplex<dim>::description(); these may still differ. It also does not test whether lower-dimensional faces are numbered identically (vertices, edges and so on); this routine is only concerned with top-dimensional simplices.
(At the time of writing, two identical triangulations will always number their lower-dimensional faces in the same way. However, it is conceivable that in future versions of Regina there may be situations in which identical triangulations can acquire different numberings for vertices, edges, and so on.)
In Regina 6.0.1 and earlier, this comparison was called isIdenticalTo().
other | the triangulation to compare with this. |
true
if and only if the two triangulations are combinatorially identical.
|
inherited |
Relabels the vertices of top-dimensional simplices in this triangulation so that all simplices are oriented consistently, if possible.
This routine works by flipping vertices (dim - 1) and dim of each top-dimensional simplices that has negative orientation. The result will be a triangulation where the top-dimensional simplices have their vertices labelled in a way that preserves orientation across adjacent facets. In particular, every gluing permutation will have negative sign.
If this triangulation includes both orientable and non-orientable components, the orientable components will be oriented as described above and the non-orientable components will be left untouched.
|
inherited |
Checks the eligibility of and/or performs a (dim + 1 - k)-(k + 1) Pachner move about the given k-face.
This involves replacing the (dim + 1 - k) top-dimensional simplices meeting that k-face with (k + 1) new top-dimensional simplices joined along a new internal (dim - k)-face. This can be done iff (i) the given k-face is valid and non-boundary; (ii) the (dim + 1 - k) top-dimensional simplices that contain it are distinct; and (iii) these simplices are joined in such a way that the link of the given k-face is the standard triangulation of the (dim - 1 - k)-sphere as the boundary of a (dim - k)-simplex.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal. In In the special case k = dim, the move is always legal and so the check argument will simply be ignored.
Note that after performing this move, all skeletal objects (facets, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument v) can no longer be used.
If this triangulation is currently oriented, then this Pachner move will label the new top-dimensional simplices in a way that preserves the orientation.
See the page on Pachner moves on triangulations for definitions and terminology relating to Pachner moves. After the move, the new belt face will be formed from vertices 0,1,...,(dim - k) of simplices().back()
.
simplices().back()->vertex(dim)
, and as of version 5.96 it is now simplices().back()->vertex(0)
.f | the k-face about which to perform the move. |
check | true if we are to check whether the move is allowed (defaults to true ). |
perform | true if we are to perform the move (defaults to true ). |
true
, the function returns true
if and only if the requested move may be performed without changing the topology of the manifold. If check is false
, the function simply returns true
.k | the dimension of the given face. This must be between 0 and (dim) inclusive. You can still perform a Pachner move about a 0-face dim-face, but these moves use specialised implementations (as opposed to this generic template implementation). |
|
inlineinherited |
Returns the packet that holds this data, if there is one.
If this object is being held by a packet p of type PacketOf<Held>, then that packet p will be returned. Otherwise, if this is a "standalone" object of type Held, then this routine will return null
.
There is a special case when dealing with a packet q that holds a SnapPea triangulation. Here q is of type PacketOf<SnapPeaTriangulation>, and it holds a Triangulation<3> "indirectly" in the sense that Packetof<SnapPeaTriangulation> derives from SnapPeaTriangulation, which in turn derives from Triangulation<3>. In this scenario:
null
, since there is no "direct" PacketOf<Triangulation<3>>;The function inAnyPacket() is specific to Triangulation<3>, and is not offered for other Held types.
null
if this data is not (directly) held by a packet.
|
inlineinherited |
Returns the packet that holds this data, if there is one.
See the non-const version of this function for further details, and in particular for how this functions operations in the special case of a packet that holds a SnapPea triangulation.
null
if this data is not (directly) held by a packet.
|
inlineinherited |
A dimension-specific alias for faces<4>(), or an alias for simplices() in dimension dim = 4.
This alias is available for dimensions dim ≥ 4.
See faces() for further information.
|
inlineinherited |
|
inlineinherited |
|
inherited |
Relabels the vertices of top-dimensional simplices in this triangulation so that all simplices reflect their orientation.
In particular, if this triangulation is oriented, then it will be converted into an isomorphic triangulation with the opposite orientation.
This routine works by flipping vertices (dim - 1) and dim of every top-dimensional simplex.
|
inlineinherited |
Removes all simplices from the triangulation.
As a result, this triangulation will become empty.
All of the simplices that belong to this triangulation will be destroyed immediately.
|
inlineinherited |
Removes the given top-dimensional simplex from this triangulation.
The given simplex will be unglued from any adjacent simplices (if any), and will be destroyed immediately.
simplex | the simplex to remove. |
|
inlineinherited |
Removes the top-dimensional simplex at the given index in this triangulation.
This is equivalent to calling removeSimplex(simplex(index))
.
The given simplex will be unglued from any adjacent simplices (if any), and will be destroyed immediately.
index | specifies which top-dimensionalsimplex to remove; this must be between 0 and size()-1 inclusive. |
|
inlineinherited |
Returns the top-dimensional simplex at the given index in the triangulation.
Note that indexing may change when a simplex is added to or removed from the triangulation.
index | specifies which simplex to return; this value should be between 0 and size()-1 inclusive. |
|
inlineinherited |
Returns the top-dimensional simplex at the given index in the triangulation.
Note that indexing may change when a simplex is added to or removed from the triangulation.
index | specifies which simplex to return; this value should be between 0 and size()-1 inclusive. |
|
inlineinherited |
Returns an object that allows iteration through and random access to all top-dimensional simplices in this triangulation.
The object that is returned is lightweight, and can be happily copied by value. The C++ type of the object is subject to change, so C++ users should use auto
(just like this declaration does).
The returned object is guaranteed to be an instance of ListView, which means it offers basic container-like functions and supports C++11 range-based for
loops. Note that the elements of the list will be pointers, so your code might look like:
The object that is returned will remain up-to-date and valid for as long as the triangulation exists: even as simplices are added and/or removed, it will always reflect the simplices that are currently in the triangulation. Nevertheless, it is recommended to treat this object as temporary only, and to call simplices() again each time you need it.
|
inlineinherited |
Notifies the triangulation that you have simplified the presentation of its fundamental group.
The old group presentation will be replaced by the (hopefully simpler) group that is passed.
This routine is useful for situations in which some external body (such as GAP) has simplified the group presentation better than Regina can.
Regina does not verify that the new group presentation is equivalent to the old, since this is - well, hard.
If the fundamental group has not yet been calculated for this triangulation, then this routine will store the new group as the fundamental group, under the assumption that you have worked out the group through some other clever means without ever having needed to call fundamentalGroup() at all.
Note that this routine will not fire a packet change event.
newGroup | a new (and hopefully simpler) presentation of the fundamental group of this triangulation. |
|
inlineinherited |
Returns the number of top-dimensional simplices in the triangulation.
|
inherited |
Returns a short text representation of this object.
This text should be human-readable, should use plain ASCII characters where possible, and should not contain any newlines.
Within these limits, this short text ouptut should be as information-rich as possible, since in most cases this forms the basis for the Python str()
and repr()
functions.
str()
will use precisely this function, and for most classes the Python repr()
function will incorporate this into its output.
|
inlineprotectednoexceptinherited |
Swap operation.
This should only be called when the entire type T contents of this object and other are being swapped. If one object has a current snapshot, then the other object will move in as the new image for that same snapshot. This avoids a deep copies of this object and/or other, even though both objects are changing.
In particular, if the swap function for T calls this base class function (as it should), then there is no need to call takeSnapshot() from either this object or src.
other | the snapshot image being swapped with this. |
void regina::Triangulation< dim >::swap | ( | Triangulation< dim > & | other | ) |
Swaps the contents of this and the given triangulation.
All top-dimensional simplices that belong to this triangulation will be moved to other, and all top-dimensional simplices that belong to other will be moved to this triangulation. Likewise, all skeletal objects (such as lower-dimensional faces, components, and boundary components) and all cached properties will be swapped.
In particular, any pointers or references to Simplex<dim> and/or Face<dim, subdim> objects will remain valid.
This routine will behave correctly if other is in fact this triangulation.
noexcept
, since it fires change events on both triangulations which may in turn call arbitrary code via any registered packet listeners.other | the triangulation whose contents should be swapped with this. |
|
protectedinherited |
Swaps all data that is managed by this base class, including simplices, skeletal data, cached properties and the snapshotting data, with the given triangulation.
Note that TriangulationBase never calls this routine itself. Typically swapBaseData() is only ever called by Triangulation<dim>::swap().
other | the triangulation whose data should be swapped with this. |
|
inline |
Deprecated routine that swaps the contents of this and the given triangulation.
other | the triangulation whose contents should be swapped with this. |
|
inlineprotectedinherited |
Must be called before modification and/or destruction of the type T contents.
See the Snapshot class notes for a full explanation of how this requirement works.
There are a few exceptions where takeSnapshot() does not need to be called: these are where type T move, copy and/or swap operations call the base class operations (as they should). See the Snapshottable move, copy and swap functions for details.
If this object has a current snapshot, then this function will trigger a deep copy with the snapshot.
After this function returns, this object is guaranteed to be completely unenrolled from the snapshotting machinery.
|
inlineinherited |
A dimension-specific alias for faces<3>(), or an alias for simplices() in dimension dim = 3.
This alias is available for dimensions dim ≥ 3.
See faces() for further information.
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
A dimension-specific alias for faces<2>(), or an alias for simplices() in dimension dim = 2.
This alias is available for all dimensions.
See faces() for further information.
|
inherited |
Returns the individual connected components of this triangulation.
This triangulation will not be modified.
This function is new to Regina 7.0, and it has two important changes of behaviour from the old splitIntoComponents() from Regina 6.0.1 and earlier:
|
inherited |
Returns a short text representation of this object using unicode characters.
Like str(), this text should be human-readable, should not contain any newlines, and (within these constraints) should be as information-rich as is reasonable.
Unlike str(), this function may use unicode characters to make the output more pleasant to read. The string that is returned will be encoded in UTF-8.
|
inlineinherited |
|
inlineinherited |
A dimension-specific alias for faces<0>().
This alias is available for all dimensions dim.
See faces() for further information.
|
inherited |
Writes a detailed text representation of this object to the given output stream.
out | the output stream to which to write. |
|
inherited |
Writes a short text representation of this object to the given output stream.
out | the output stream to which to write. |
|
protectedinherited |
Writes a chunk of XML containing properties of this triangulation.
This routine covers those properties that are managed by this base class TriangulationBase and that have already been computed for this triangulation.
This routine is typically called from within Triangulation<dim>::writeXMLPacketData(). The XML elements that it writes are child elements of the tri
element.
out | the output stream to which the XML should be written. |
|
protectedinherited |
The components that form the boundary of the triangulation.
|
staticconstexprinherited |
A compile-time constant that gives the dimension of the triangulation.
|
protectedinherited |
Indicates whether this Held object is in fact the inherited data for a PacketOf<Held>.
As a special case, this field is also used to indicate when a Triangulation<3> is in fact the inherited data for a SnapPeaTriangulation. See the PacketHeldBy enumeration for more details on the different values that this data member can take.
|
protectedinherited |
The top-dimensional simplices that form the triangulation.
|
protectedinherited |
If non-zero, this will cause Triangulation<dim>::clearAllProperties() to preserve any computed properties that related to the manifold (as opposed to the specific triangulation).
This allows you to avoid recomputing expensive invariants when the underlying manifold is retriangulated.
This property should be managed by creating and destroying TopologyLock objects. The precise value of topologyLock_ indicates the number of TopologyLock objects that currently exist for this triangulation.
|
protectedinherited |
Is this triangulation valid? See isValid() for details on what this means.