Regina Calculation Engine

Stores the triangulation of a 3manifold along with its various cellular structures and other information. More...
#include <triangulation/ntriangulation.h>
Public Types  
typedef std::vector < NTetrahedron * > ::const_iterator  TetrahedronIterator 
Used to iterate through tetrahedra. More...  
typedef std::vector< NTriangle * > ::const_iterator  TriangleIterator 
Used to iterate through triangles. More...  
typedef std::vector< NTriangle * > ::const_iterator  FaceIterator 
A deprecated alias for TriangleIterator. More...  
typedef std::vector< NEdge * > ::const_iterator  EdgeIterator 
Used to iterate through edges. More...  
typedef std::vector< NVertex * > ::const_iterator  VertexIterator 
Used to iterate through vertices. More...  
typedef std::vector < NComponent * > ::const_iterator  ComponentIterator 
Used to iterate through components. More...  
typedef std::vector < NBoundaryComponent * > ::const_iterator  BoundaryComponentIterator 
Used to iterate through boundary components. More...  
typedef std::map< std::pair < unsigned long, unsigned long > , double >  TuraevViroSet 
A map from (r, whichRoot) pairs to TuraevViro invariants. More...  
Public Types inherited from regina::NPacket  
typedef ChangeEventSpan  ChangeEventBlock 
A deprecated typedef for ChangeEventSpan. More...  
Public Member Functions  
Constructors and Destructors  
NTriangulation ()  
Default constructor. More...  
NTriangulation (const NTriangulation &cloneMe)  
Copy constructor. More...  
NTriangulation (const std::string &description)  
"Magic" constructor that tries to find some way to interpret the given string as a triangulation. More...  
virtual  ~NTriangulation () 
Destroys this triangulation. More...  
Packet Administration  
virtual void  writeTextShort (std::ostream &out) const 
Writes this object in short text format to the given output stream. More...  
virtual void  writeTextLong (std::ostream &out) const 
Writes this object in long text format to the given output stream. More...  
virtual bool  dependsOnParent () const 
Determines if this packet depends upon its parent. More...  
Tetrahedra  
unsigned long  getNumberOfTetrahedra () const 
Returns the number of tetrahedra in the triangulation. More...  
unsigned long  getNumberOfSimplices () const 
A dimensionagnostic alias for getNumberOfTetrahedra(). More...  
const std::vector < NTetrahedron * > &  getTetrahedra () const 
Returns all tetrahedra in the triangulation. More...  
const std::vector < NTetrahedron * > &  getSimplices () const 
A dimensionagnostic alias for getTetrahedra(). More...  
NTetrahedron *  getTetrahedron (unsigned long index) 
Returns the tetrahedron with the given index number in the triangulation. More...  
NTetrahedron *  getSimplex (unsigned long index) 
A dimensionagnostic alias for getTetrahedron(). More...  
const NTetrahedron *  getTetrahedron (unsigned long index) const 
Returns the tetrahedron with the given index number in the triangulation. More...  
const NTetrahedron *  getSimplex (unsigned long index) const 
A dimensionagnostic alias for getTetrahedron(). More...  
long  tetrahedronIndex (const NTetrahedron *tet) const 
Returns the index of the given tetrahedron in the triangulation. More...  
long  simplexIndex (const NTetrahedron *tet) const 
A dimensionagnostic alias for tetrahedronIndex(). More...  
NTetrahedron *  newTetrahedron () 
Creates a new tetrahedron and adds it to this triangulation. More...  
NTetrahedron *  newSimplex () 
A dimensionagnostic alias for newTetrahedron(). More...  
NTetrahedron *  newTetrahedron (const std::string &desc) 
Creates a new tetrahedron with the given description and adds it to this triangulation. More...  
NTetrahedron *  newSimplex (const std::string &desc) 
A dimensionagnostic alias for newTetrahedron(). More...  
void  addTetrahedron (NTetrahedron *tet) 
Inserts the given tetrahedron into the triangulation. More...  
void  removeTetrahedron (NTetrahedron *tet) 
Removes the given tetrahedron from the triangulation. More...  
void  removeSimplex (NTetrahedron *tet) 
A dimensionagnostic alias for removeTetrahedron(). More...  
void  removeTetrahedronAt (unsigned long index) 
Removes the tetrahedron with the given index number from the triangulation. More...  
void  removeSimplexAt (unsigned long index) 
A dimensionagnostic alias for removeTetrahedronAt(). More...  
void  removeAllTetrahedra () 
Removes all tetrahedra from the triangulation. More...  
void  removeAllSimplices () 
A dimensionagnostic alias for removeAllTetrahedra(). More...  
void  swapContents (NTriangulation &other) 
Swaps the contents of this and the given triangulation. More...  
void  moveContentsTo (NTriangulation &dest) 
Moves the contents of this triangulation into the given destination triangulation, without destroying any preexisting contents. More...  
void  gluingsHaveChanged () 
This routine now does nothing, and should not be used. More...  
Skeletal Queries  
unsigned long  getNumberOfBoundaryComponents () const 
Returns the number of boundary components in this triangulation. More...  
unsigned long  getNumberOfComponents () const 
Returns the number of components in this triangulation. More...  
unsigned long  getNumberOfVertices () const 
Returns the number of vertices in this triangulation. More...  
unsigned long  getNumberOfEdges () const 
Returns the number of edges in this triangulation. More...  
unsigned long  getNumberOfTriangles () const 
Returns the number of triangular faces in this triangulation. More...  
unsigned long  getNumberOfFaces () const 
A deprecated alias for getNumberOfTriangles(). More...  
template<int dim>  
unsigned long  getNumberOfFaces () const 
Returns the number of faces of the given dimension in this triangulation. More...  
const std::vector< NComponent * > &  getComponents () const 
Returns all components of this triangulation. More...  
const std::vector < NBoundaryComponent * > &  getBoundaryComponents () const 
Returns all boundary components of this triangulation. More...  
const std::vector< NVertex * > &  getVertices () const 
Returns all vertices of this triangulation. More...  
const std::vector< NEdge * > &  getEdges () const 
Returns all edges of this triangulation. More...  
const std::vector< NTriangle * > &  getTriangles () const 
Returns all triangular faces of this triangulation. More...  
const std::vector< NTriangle * > &  getFaces () const 
A deprecated alias for getTriangles(). More...  
NComponent *  getComponent (unsigned long index) const 
Returns the requested triangulation component. More...  
NBoundaryComponent *  getBoundaryComponent (unsigned long index) const 
Returns the requested triangulation boundary component. More...  
NVertex *  getVertex (unsigned long index) const 
Returns the requested vertex in this triangulation. More...  
NEdge *  getEdge (unsigned long index) const 
Returns the requested edge in this triangulation. More...  
NTriangle *  getTriangle (unsigned long index) const 
Returns the requested triangular face in this triangulation. More...  
NTriangle *  getFace (unsigned long index) const 
A deprecated alias for getTriangle(). More...  
long  componentIndex (const NComponent *component) const 
Returns the index of the given component in the triangulation. More...  
long  boundaryComponentIndex (const NBoundaryComponent *bc) const 
Returns the index of the given boundary component in the triangulation. More...  
long  vertexIndex (const NVertex *vertex) const 
Returns the index of the given vertex in the triangulation. More...  
long  edgeIndex (const NEdge *edge) const 
Returns the index of the given edge in the triangulation. More...  
long  triangleIndex (const NTriangle *triangle) const 
Returns the index of the given triangle in the triangulation. More...  
long  faceIndex (const NTriangle *triangle) const 
A deprecated alias for triangleIndex(). More...  
bool  hasTwoSphereBoundaryComponents () const 
Determines if this triangulation contains any twosphere boundary components. More...  
bool  hasNegativeIdealBoundaryComponents () const 
Determines if this triangulation contains any ideal boundary components with negative Euler characteristic. More...  
Isomorphism Testing  
std::auto_ptr< NIsomorphism >  isIsomorphicTo (const NTriangulation &other) const 
Determines if this triangulation is combinatorially isomorphic to the given triangulation. More...  
std::auto_ptr< NIsomorphism >  isContainedIn (const NTriangulation &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...  
unsigned long  findAllSubcomplexesIn (const NTriangulation &other, std::list< NIsomorphism * > &results) 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...  
Basic Properties  
long  getEulerCharTri () const 
Returns the Euler characteristic of this triangulation. More...  
long  getEulerCharManifold () const 
Returns the Euler characteristic of the corresponding compact 3manifold. More...  
long  getEulerCharacteristic () const 
A deprecated alias for getEulerCharTri(). More...  
bool  isValid () const 
Determines if this triangulation is valid. More...  
bool  isIdeal () const 
Determines if this triangulation is ideal. More...  
bool  isStandard () const 
Determines if this triangulation is standard. More...  
bool  hasBoundaryTriangles () const 
Determines if this triangulation has any boundary triangles. More...  
bool  hasBoundaryFaces () const 
A deprecated alias for hasBoundaryTriangles(). More...  
bool  isClosed () const 
Determines if this triangulation is closed. More...  
bool  isOrientable () const 
Determines if this triangulation is orientable. More...  
bool  isOriented () const 
Determines if this triangulation is oriented; that is, if tetrahedron vertices are labelled in a way that preserves orientation across adjacent tetrahedron faces. More...  
bool  isOrdered () const 
Determines if this triangulation is ordered; that is, if tetrahedron vertices are labelled so that all gluing permutations are orderpreserving on the tetrahedron faces. More...  
bool  isConnected () const 
Determines if this triangulation is connected. More...  
Algebraic Properties  
const NGroupPresentation &  getFundamentalGroup () const 
Returns the fundamental group of this triangulation. More...  
void  simplifiedFundamentalGroup (NGroupPresentation *newGroup) 
Notifies the triangulation that you have simplified the presentation of its fundamental group. More...  
const NAbelianGroup &  getHomologyH1 () const 
Returns the first homology group for this triangulation. More...  
const NAbelianGroup &  getHomologyH1Rel () const 
Returns the relative first homology group with respect to the boundary for this triangulation. More...  
const NAbelianGroup &  getHomologyH1Bdry () const 
Returns the first homology group of the boundary for this triangulation. More...  
const NAbelianGroup &  getHomologyH2 () const 
Returns the second homology group for this triangulation. More...  
unsigned long  getHomologyH2Z2 () const 
Returns the second homology group with coefficients in Z_2 for this triangulation. More...  
double  turaevViro (unsigned long r, unsigned long whichRoot) const 
Computes the TuraevViro state sum invariant of this 3manifold based upon the given initial data. More...  
const TuraevViroSet &  allCalculatedTuraevViro () const 
Returns the set of all TuraevViro state sum invariants that have already been calculated for this 3manifold. More...  
Normal Surface Properties  
bool  isZeroEfficient () 
Determines if this triangulation is 0efficient. More...  
bool  knowsZeroEfficient () const 
Is it already known whether or not this triangulation is 0efficient? See isZeroEfficient() for further details. More...  
bool  hasSplittingSurface () 
Determines whether this triangulation has a normal splitting surface. More...  
bool  knowsSplittingSurface () const 
Is it already known whether or not this triangulation has a splitting surface? See hasSplittingSurface() for further details. More...  
NNormalSurface *  hasNonTrivialSphereOrDisc () 
Searches for a nonvertexlinking normal sphere or disc within this triangulation. More...  
NNormalSurface *  hasOctagonalAlmostNormalSphere () 
Searches for an octagonal almost normal 2sphere within this triangulation. More...  
Skeletal Transformations  
void  maximalForestInBoundary (std::set< NEdge * > &edgeSet, std::set< NVertex * > &vertexSet) const 
Produces a maximal forest in the 1skeleton of the triangulation boundary. More...  
void  maximalForestInSkeleton (std::set< NEdge * > &edgeSet, bool canJoinBoundaries=true) const 
Produces a maximal forest in the triangulation's 1skeleton. More...  
void  maximalForestInDualSkeleton (std::set< NTriangle * > &triangleSet) const 
Produces a maximal forest in the triangulation's dual 1skeleton. More...  
bool  intelligentSimplify () 
Attempts to simplify the triangulation as intelligently as possible without further input. More...  
bool  simplifyToLocalMinimum (bool perform=true) 
Uses all known simplification moves to reduce the triangulation monotonically to some local minimum number of tetrahedra. More...  
bool  threeTwoMove (NEdge *e, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 32 move about the given edge. More...  
bool  twoThreeMove (NTriangle *t, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 23 move about the given triangle. More...  
bool  fourFourMove (NEdge *e, int newAxis, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 44 move about the given edge. More...  
bool  twoZeroMove (NEdge *e, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 20 move about the given edge of degree 2. More...  
bool  twoZeroMove (NVertex *v, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 20 move about the given vertex of degree 2. More...  
bool  twoOneMove (NEdge *e, int edgeEnd, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a 21 move about the given edge. More...  
bool  openBook (NTriangle *t, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a book opening move about the given triangle. More...  
bool  closeBook (NEdge *e, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a book closing move about the given boundary edge. More...  
bool  shellBoundary (NTetrahedron *t, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a boundary shelling move on the given tetrahedron. More...  
bool  collapseEdge (NEdge *e, bool check=true, bool perform=true) 
Checks the eligibility of and/or performs a collapse of an edge in such a way that the topology of the manifold does not change and the number of vertices of the triangulation decreases by one. More...  
void  reorderTetrahedraBFS (bool reverse=false) 
Reorders the tetrahedra of this triangulation using a breadthfirst search, so that smallnumbered tetrahedra are adjacent to other smallnumbered tetrahedra. More...  
void  orient () 
Relabels tetrahedron vertices in this triangulation so that all tetrahedra are oriented consistently, if possible. More...  
bool  order (bool forceOriented=false) 
Relabels tetrahedron vertices in this triangulation to give an ordered triangulation, if possible. More...  
Decompositions  
unsigned long  splitIntoComponents (NPacket *componentParent=0, bool setLabels=true) 
Splits a disconnected triangulation into many smaller triangulations, one for each component. More...  
unsigned long  connectedSumDecomposition (NPacket *primeParent=0, bool setLabels=true) 
Splits this triangulation into its connected sum decomposition. More...  
bool  isThreeSphere () const 
Determines whether this is a triangulation of a 3sphere. More...  
bool  knowsThreeSphere () const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a 3sphere? See isThreeSphere() for further details. More...  
bool  isBall () const 
Determines whether this is a triangulation of a 3dimensional ball. More...  
bool  knowsBall () const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a 3dimensional ball? See isBall() for further details. More...  
NPacket *  makeZeroEfficient () 
Converts this into a 0efficient triangulation of the same underlying 3manifold. More...  
bool  isSolidTorus () const 
Determines whether this is a triangulation of the solid torus; that is, the unknot complement. More...  
bool  knowsSolidTorus () const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a solid torus (that is, the unknot complement)? See isSolidTorus() for further details. More...  
bool  isIrreducible () const 
Determines whether the underlying 3manifold (which must be closed) is irreducible. More...  
bool  knowsIrreducible () const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold is irreducible? See isIrreducible() for further details. More...  
bool  hasCompressingDisc () const 
Searches for a compressing disc within the underlying 3manifold. More...  
bool  knowsCompressingDisc () const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold contains a compressing disc? See hasCompressingDisc() for further details. More...  
bool  isHaken () const 
Determines whether the underlying 3manifold (which must be closed and orientable) is Haken. More...  
bool  knowsHaken () const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold is Haken? See isHaken() for further details. More...  
bool  hasSimpleCompressingDisc () const 
Searches for a "simple" compressing disc inside this triangulation. More...  
Subdivisions, Extensions and Covers  
void  makeDoubleCover () 
Converts this triangulation into its double cover. More...  
bool  idealToFinite (bool forceDivision=false) 
Converts an ideal triangulation into a finite triangulation. More...  
bool  finiteToIdeal () 
Converts each real boundary component into a cusp (i.e., an ideal vertex). More...  
void  barycentricSubdivision () 
Does a barycentric subdivision of the triangulation. More...  
void  drillEdge (NEdge *e) 
Drills out a regular neighbourhood of the given edge of the triangulation. More...  
Building Triangulations  
NTetrahedron *  layerOn (NEdge *edge) 
Performs a layering upon the given boundary edge of the triangulation. More...  
NTetrahedron *  insertLayeredSolidTorus (unsigned long cuts0, unsigned long cuts1) 
Inserts a new layered solid torus into the triangulation. More...  
void  insertLayeredLensSpace (unsigned long p, unsigned long q) 
Inserts a new layered lens space L(p,q) into the triangulation. More...  
void  insertLayeredLoop (unsigned long length, bool twisted) 
Inserts a layered loop of the given length into this triangulation. More...  
void  insertAugTriSolidTorus (long a1, long b1, long a2, long b2, long a3, long b3) 
Inserts an augmented triangular solid torus with the given parameters into this triangulation. More...  
void  insertSFSOverSphere (long a1=1, long b1=0, long a2=1, long b2=0, long a3=1, long b3=0) 
Inserts an orientable Seifert fibred space with at most three exceptional fibres over the 2sphere into this triangulation. More...  
void  insertTriangulation (const NTriangulation &source) 
Inserts a copy of the given triangulation into this triangulation. More...  
bool  insertRehydration (const std::string &dehydration) 
Inserts the rehydration of the given string into this triangulation. More...  
void  insertConstruction (unsigned long nTetrahedra, const int adjacencies[][4], const int gluings[][4][4]) 
Inserts into this triangulation a set of tetrahedra and their gluings as described by the given integer arrays. More...  
Exporting Triangulations  
std::string  dehydrate () const 
Dehydrates this triangulation into an alphabetical string. More...  
std::string  isoSig (NIsomorphism **relabelling=0) const 
Constructs the isomorphism signature for this triangulation. More...  
std::string  dumpConstruction () const 
Returns C++ code that can be used with insertConstruction() to reconstruct this triangulation. More...  
std::string  snapPea () const 
Returns a string containing the full contents of a SnapPea data file that describes this triangulation. More...  
Public Member Functions inherited from regina::NPacket  
NPacket (NPacket *parent=0)  
Constructor that inserts the new packet into the overall tree structure. More...  
virtual  ~NPacket () 
Destructor that also orphans this packet and destroys all of its descendants. More...  
virtual PacketType  getPacketType () const =0 
Returns the unique integer ID representing this type of packet. More...  
virtual std::string  getPacketTypeName () const =0 
Returns an English name for this type of packet. More...  
const std::string &  getPacketLabel () const 
Returns the label associated with this individual packet. More...  
std::string  getHumanLabel () const 
Returns the label associated with this individual packet, adjusted if necessary for humanreadable output. More...  
void  setPacketLabel (const std::string &newLabel) 
Sets the label associated with this individual packet. More...  
std::string  getFullName () const 
Returns a descriptive text string for the packet. More...  
std::string  makeUniqueLabel (const std::string &base) const 
Returns a new label that cannot be found anywhere in the entire tree structure. More...  
bool  makeUniqueLabels (NPacket *reference) 
Ensures that all packet labels in both this and the given packet tree combined are distinct. More...  
bool  hasTag (const std::string &tag) const 
Determines whether this packet has the given associated tag. More...  
bool  hasTags () const 
Determines whether this packet has any associated tags at all. More...  
bool  addTag (const std::string &tag) 
Associates the given tag with this packet. More...  
bool  removeTag (const std::string &tag) 
Removes the association of the given tag with this packet. More...  
void  removeAllTags () 
Removes all associated tags from this packet. More...  
const std::set< std::string > &  getTags () const 
Returns the set of all tags associated with this packet. More...  
bool  listen (NPacketListener *listener) 
Registers the given packet listener to listen for events on this packet. More...  
bool  isListening (NPacketListener *listener) 
Determines whether the given packet listener is currently listening for events on this packet. More...  
bool  unlisten (NPacketListener *listener) 
Unregisters the given packet listener so that it no longer listens for events on this packet. More...  
NPacket *  getTreeParent () const 
Determines the parent packet in the tree structure. More...  
NPacket *  getFirstTreeChild () const 
Determines the first child of this packet in the tree structure. More...  
NPacket *  getLastTreeChild () const 
Determines the last child of this packet in the tree structure. More...  
NPacket *  getNextTreeSibling () const 
Determines the next sibling of this packet in the tree structure. More...  
NPacket *  getPrevTreeSibling () const 
Determines the previous sibling of this packet in the tree structure. More...  
NPacket *  getTreeMatriarch () const 
Determines the matriarch (the root) of the tree to which this packet belongs. More...  
unsigned  levelsDownTo (const NPacket *descendant) const 
Counts the number of levels between this packet and its given descendant in the tree structure. More...  
unsigned  levelsUpTo (const NPacket *ancestor) const 
Counts the number of levels between this packet and its given ancestor in the tree structure. More...  
bool  isGrandparentOf (const NPacket *descendant) const 
Determines if this packet is equal to or an ancestor of the given packet in the tree structure. More...  
unsigned long  getNumberOfChildren () const 
Returns the number of immediate children of this packet. More...  
unsigned long  getNumberOfDescendants () const 
Returns the total number of descendants of this packet. More...  
unsigned long  getTotalTreeSize () const 
Determines the total number of packets in the tree or subtree for which this packet is matriarch. More...  
void  insertChildFirst (NPacket *child) 
Inserts the given packet as the first child of this packet. More...  
void  insertChildLast (NPacket *child) 
Inserts the given packet as the last child of this packet. More...  
void  insertChildAfter (NPacket *newChild, NPacket *prevChild) 
Inserts the given packet as a child of this packet at the given location in this packet's child list. More...  
void  makeOrphan () 
Cuts this packet away from its parent in the tree structure and instead makes it matriarch of its own tree. More...  
void  reparent (NPacket *newParent, bool first=false) 
Cuts this packet away from its parent in the tree structure, and inserts it as a child of the given packet instead. More...  
void  swapWithNextSibling () 
Swaps this packet with its next sibling in the sequence of children beneath their common parent packet. More...  
void  moveUp (unsigned steps=1) 
Moves this packet the given number of steps towards the beginning of its sibling list. More...  
void  moveDown (unsigned steps=1) 
Moves this packet the given number of steps towards the end of its sibling list. More...  
void  moveToFirst () 
Moves this packet to be the first in its sibling list. More...  
void  moveToLast () 
Moves this packet to be the last in its sibling list. More...  
void  sortChildren () 
Sorts the immediate children of this packet according to their packet labels. More...  
NPacket *  nextTreePacket () 
Finds the next packet after this in a complete depthfirst iteration of the entire tree structure to which this packet belongs. More...  
const NPacket *  nextTreePacket () const 
Finds the next packet after this in a complete depthfirst iteration of the entire tree structure to which this packet belongs. More...  
NPacket *  firstTreePacket (const std::string &type) 
Finds the first packet of the requested type in a complete depthfirst iteration of the tree structure. More...  
const NPacket *  firstTreePacket (const std::string &type) const 
Finds the first packet of the requested type in a complete depthfirst iteration of the tree structure. More...  
NPacket *  nextTreePacket (const std::string &type) 
Finds the next packet after this of the requested type in a complete depthfirst iteration of the entire tree structure. More...  
const NPacket *  nextTreePacket (const std::string &type) const 
Finds the next packet after this of the requested type in a complete depthfirst iteration of the entire tree structure. More...  
NPacket *  findPacketLabel (const std::string &label) 
Finds the packet with the requested label in the tree or subtree for which this packet is matriarch. More...  
const NPacket *  findPacketLabel (const std::string &label) const 
Finds the packet with the requested label in the tree or subtree for which this packet is matriarch. More...  
bool  isPacketEditable () const 
Determines whether this packet can be altered without invalidating or otherwise upsetting any of its immediate children. More...  
NPacket *  clone (bool cloneDescendants=false, bool end=true) const 
Clones this packet (and possibly its descendants), assigns to it a suitable unused label and inserts the clone into the tree as a sibling of this packet. More...  
void  writeXMLFile (std::ostream &out) const 
Writes a complete XML file containing the subtree with this packet as matriarch. More...  
std::string  internalID () const 
Returns a unique string ID that identifies this packet. More...  
Public Member Functions inherited from regina::ShareableObject  
ShareableObject ()  
Default constructor that does nothing. More...  
virtual  ~ShareableObject () 
Default destructor that does nothing. More...  
std::string  str () const 
Returns the output from writeTextShort() as a string. More...  
std::string  toString () const 
A deprecated alias for str(), which returns the output from writeTextShort() as a string. More...  
std::string  detail () const 
Returns the output from writeTextLong() as a string. More...  
std::string  toStringLong () const 
A deprecated alias for detail(), which returns the output from writeTextLong() as a string. More...  
Static Public Member Functions  
static NXMLPacketReader *  getXMLReader (NPacket *parent, NXMLTreeResolver &resolver) 
Importing Triangulations  
static NTriangulation *  enterTextTriangulation (std::istream &in, std::ostream &out) 
Allows the user to interactively enter a triangulation in plain text. More...  
static NTriangulation *  rehydrate (const std::string &dehydration) 
Rehydrates the given alphabetical string into a new triangulation. More...  
static NTriangulation *  fromIsoSig (const std::string &signature) 
Recovers a full triangulation from an isomorphism signature. More...  
static NTriangulation *  fromSnapPea (const std::string &snapPeaData) 
Extracts a triangulation from a string that contains the full contents of a SnapPea data file. More...  
Static Public Member Functions inherited from regina::NPacket  
static NXMLPacketReader *  getXMLReader (NPacket *parent, NXMLTreeResolver &resolver) 
Returns a newly created XML element reader that will read the contents of a single XML packet element. More...  
Protected Member Functions  
virtual NPacket *  internalClonePacket (NPacket *parent) const 
Makes a newly allocated copy of this packet. More...  
virtual void  writeXMLPacketData (std::ostream &out) const 
Writes a chunk of XML containing the data for this packet only. More...  
void  cloneFrom (const NTriangulation &from) 
Turns this triangulation into a clone of the given triangulation. More...  
Protected Member Functions inherited from regina::NPacket  
void  writeXMLPacketTree (std::ostream &out) const 
Writes a chunk of XML containing the subtree with this packet as matriarch. More...  
Friends  
class  regina::NTetrahedron 
class  regina::NXMLTriangulationReader 
Additional Inherited Members  
Static Protected Member Functions inherited from regina::NGenericTriangulation< 3 >  
static std::string  isoSig (const typename DimTraits< dim >::Triangulation &tri, typename DimTraits< dim >::Isomorphism **relabelling=0) 
Constructs the isomorphism signature for the given triangulation. More...  
static DimTraits< dim > ::Triangulation *  fromIsoSig (const std::string &sig) 
Recovers a full triangulation from an isomorphism signature. More...  
static size_t  isoSigComponentSize (const std::string &sig) 
Deduces the number of topdimensional simplices in a connected triangulation from its isomorphism signature. More...  
Stores the triangulation of a 3manifold along with its various cellular structures and other information.
When the triangulation is deleted, the corresponding tetrahedra, the cellular structure and all other properties will be deallocated.
Triangles, edges, vertices and components are always temporary; whenever a change occurs with the triangulation, these will be deleted and a new skeletal structure will be calculated. The same is true of various other triangulation properties.
The management of tetrahedra within a triangulation has become simpler and safer as of Regina 4.90. In older versions (Regina 4.6 and earlier), users were required to create tetrahedra, individually add them to triangulations, and manually notify a triangulation whenever its tetrahedron gluings changed. As of Regina 4.90, new tetrahedra are created using NTriangulation::newTetrahedron() which automatically places them within a triangulation, and all gluing changes are likewise communicated to the triangulation automatically. These are part of a larger suite of changes (all designed to help the user avoid inconsistent states and accidental crashes); see the NTetrahedron class notes for further details.
Feature: Is the boundary incompressible?
Feature (longterm): Am I obviously a handlebody? (Simplify and see if there is nothing left). Am I obviously not a handlebody? (Compare homology with boundary homology).
Feature (longterm): Is the triangulation Haken?
Feature (longterm): What is the Heegaard genus?
Feature (longterm): Have a subcomplex as a child packet of a triangulation. Include routines to crush a subcomplex or to expand a subcomplex to a normal surface.
Feature (longterm): Implement writeTextLong() for skeletal objects.
typedef std::vector<NBoundaryComponent*>::const_iterator regina::NTriangulation::BoundaryComponentIterator 
Used to iterate through boundary components.
typedef std::vector<NComponent*>::const_iterator regina::NTriangulation::ComponentIterator 
Used to iterate through components.
typedef std::vector<NEdge*>::const_iterator regina::NTriangulation::EdgeIterator 
Used to iterate through edges.
typedef std::vector<NTriangle*>::const_iterator regina::NTriangulation::FaceIterator 
A deprecated alias for TriangleIterator.
typedef std::vector<NTetrahedron*>::const_iterator regina::NTriangulation::TetrahedronIterator 
Used to iterate through tetrahedra.
typedef std::vector<NTriangle*>::const_iterator regina::NTriangulation::TriangleIterator 
Used to iterate through triangles.
typedef std::map<std::pair<unsigned long, unsigned long>, double> regina::NTriangulation::TuraevViroSet 
A map from (r, whichRoot) pairs to TuraevViro invariants.
typedef std::vector<NVertex*>::const_iterator regina::NTriangulation::VertexIterator 
Used to iterate through vertices.

inline 
Default constructor.
Creates an empty triangulation.

inline 
Copy constructor.
Creates a new triangulation identical to the given triangulation. The packet tree structure and packet label are not copied.
cloneMe  the triangulation to clone. 
regina::NTriangulation::NTriangulation  (  const std::string &  description  ) 
"Magic" constructor that tries to find some way to interpret the given string as a triangulation.
At present, Regina understands the following types of strings (and attempts to parse them in the following order):
This list may grow in future versions of Regina.
Regina will also set the packet label accordingly.
If Regina cannot interpret the given string, this will be left as the empty triangulation.
description  a string that describes a 3manifold triangulation. 

inlinevirtual 
Destroys this triangulation.
The constituent tetrahedra, the cellular structure and all other properties will also be deallocated.
void regina::NTriangulation::addTetrahedron  (  NTetrahedron *  tet  ) 
Inserts the given tetrahedron into the triangulation.
No face gluings anywhere will be examined or altered.
The new tetrahedron will be assigned a higher index in the triangulation than all tetrahedra already present.
tet  the tetrahedron to insert. 

inline 
Returns the set of all TuraevViro state sum invariants that have already been calculated for this 3manifold.
TuraevViro invariants are described by an (r, whichRoot) pair as described in the turaevViro() notes. The set returned by this routine maps (r, whichRoot) pairs to the corresponding invariant values.
Each time turaevViro() is called, the result will be stored in this set (as well as being returned to the user). This set will be emptied whenever the triangulation is modified.
void regina::NTriangulation::barycentricSubdivision  (  ) 
Does a barycentric subdivision of the triangulation.
Each tetrahedron is divided into 24 tetrahedra by placing an extra vertex at the centroid of each tetrahedron, the centroid of each triangle and the midpoint of each edge.

inline 
Returns the index of the given boundary component in the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getBoundaryComponentIndex(). The name has been changed because, unlike the old routine, it requires that the given boundary component belongs to the triangulation (a consequence of some significant memory optimisations).
bc  specifies which boundary component to find in the triangulation. 

protected 
Turns this triangulation into a clone of the given triangulation.
The tree structure and label of this triangulation are not touched.
from  the triangulation from which this triangulation will be cloned. 
bool regina::NTriangulation::closeBook  (  NEdge *  e, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a book closing move about the given boundary edge.
This involves taking a boundary edge of the triangulation and folding together the two boundary triangles on either side. This move is the inverse of the openBook() move, and is used to simplify the boundary of the triangulation. This move can be done if:
There are in fact several other "distinctness" conditions on the edges e1, e2, f1 and f2, but they follow automatically from the "distinct vertices" condition above.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument f) can no longer be used.
e  the edge 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
. bool regina::NTriangulation::collapseEdge  (  NEdge *  e, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a collapse of an edge in such a way that the topology of the manifold does not change and the number of vertices of the triangulation decreases by one.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument e) can no longer be used.
The eligibility requirements for this move are somewhat involved, and are discussed in detail in the collapseEdge() source code for those who are interested.
e  the edge to collapse. 
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 given edge may be collapsed without changing the topology of the manifold. If check is false
, the function simply returns true
.

inline 
Returns the index of the given component in the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getComponentIndex(). The name has been changed because, unlike the old routine, it requires that the given component belongs to the triangulation (a consequence of some significant memory optimisations).
component  specifies which component to find in the triangulation. 
unsigned long regina::NTriangulation::connectedSumDecomposition  (  NPacket *  primeParent = 0 , 
bool  setLabels = true 

) 
Splits this triangulation into its connected sum decomposition.
The individual prime 3manifold triangulations that make up this decomposition will be inserted as children of the given parent packet. The original triangulation will be left unchanged.
Note that this routine is currently only available for closed orientable triangulations; see the list of preconditions for full details. The 0efficiency prime decomposition algorithm of Jaco and Rubinstein is used.
If the given parent packet is 0, the new prime summand triangulations will be inserted as children of this triangulation.
This routine can optionally assign unique (and sensible) packet labels to each of the new prime summand triangulations. Note however that uniqueness testing may be slow, so this assignment of labels should be disabled if the summand triangulations are only temporary objects used as part of a larger routine.
If this is a triangulation of a 3sphere, no prime summand triangulations will be created at all.
primeParent  the packet beneath which the new prime summand triangulations will be inserted, or 0 if they should be inserted directly beneath this triangulation. 
setLabels  true if the new prime summand triangulations should be assigned unique packet labels, or false if they should be left without labels at all. 
std::string regina::NTriangulation::dehydrate  (  )  const 
Dehydrates this triangulation into an alphabetical string.
A dehydration string is a compact text representation of a triangulation, introduced by Callahan, Hildebrand and Weeks for their cusped hyperbolic census (see below). The dehydration string of an ntetrahedron triangulation consists of approximately (but not precisely) 5n/2 lowercase letters.
Dehydration strings come with some restrictions:
The routine rehydrate() can be used to recover a triangulation from a dehydration string. Note that the triangulation recovered might not be identical to the original, but it is guaranteed to be an isomorphic copy.
For a full description of the dehydrated triangulation format, see A Census of Cusped Hyperbolic 3Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.

inlinevirtual 
Determines if this packet depends upon its parent.
This is true if the parent cannot be altered without invalidating or otherwise upsetting this packet.
true
if and only if this packet depends on its parent. Implements regina::NPacket.
void regina::NTriangulation::drillEdge  (  NEdge *  e  ) 
Drills out a regular neighbourhood of the given edge of the triangulation.
This is done by (i) performing two barycentric subdivisions, (ii) removing all tetrahedra that touch the original edge, and (iii) simplifying the resulting triangulation.
e  the edge to drill out. 
std::string regina::NTriangulation::dumpConstruction  (  )  const 
Returns C++ code that can be used with insertConstruction() to reconstruct this triangulation.
The code produced will consist of the following:
The main purpose of this routine is to generate the two integer arrays, which can be tedious and errorprone to code up by hand.
Note that the number of lines of code produced grows linearly with the number of tetrahedra. If this triangulation is very large, the returned string will be very large as well.

inline 
Returns the index of the given edge in the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getEdgeIndex(). The name has been changed because, unlike the old routine, it requires that the given edge belongs to the triangulation (a consequence of some significant memory optimisations).
edge  specifies which edge to find in the triangulation. 

static 
Allows the user to interactively enter a triangulation in plain text.
Prompts will be sent to the given output stream and information will be read from the given input stream.
in  the input stream from which text will be read. 
out  the output stream to which prompts will be written. 

inline 
A deprecated alias for triangleIndex().
This routine returns the index of the given triangle in the triangulation. See triangleIndex() for further details.
triangle  specifies which triangle to find in the triangulation. 
unsigned long regina::NTriangulation::findAllSubcomplexesIn  (  const NTriangulation &  other, 
std::list< NIsomorphism * > &  results  
)  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).
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 are returned.
See the isContainedIn() notes for additional information.
The isomorphisms that are found will be inserted into the given list. These isomorphisms will be newly created, and the caller of this routine is responsible for destroying them. The given list will not be emptied before the new isomorphisms are inserted.
other  the triangulation in which to search for isomorphic copies of this triangulation. 
results  the list in which any isomorphisms found will be stored. 
bool regina::NTriangulation::finiteToIdeal  (  ) 
Converts each real boundary component into a cusp (i.e., an ideal vertex).
Only boundary components formed from real tetrahedron faces will be affected; ideal boundary components are already cusps and so will not be changed.
One sideeffect of this operation is that all spherical boundary components will be filled in with balls.
This operation is performed by attaching a new tetrahedron to each boundary triangle and then gluing these new tetrahedra together in a way that mirrors the adjacencies of the underlying boundary triangles. Each boundary component will thereby be pushed up through the new tetrahedra and converted into a cusp formed using vertices of these new tetrahedra.
Note that this operation is a loose converse of idealToFinite().
true
if changes were made, or false
if the original triangulation contained no real boundary components. bool regina::NTriangulation::fourFourMove  (  NEdge *  e, 
int  newAxis,  
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 44 move about the given edge.
This involves replacing the four tetrahedra joined at that edge with four tetrahedra joined along a different edge. Consider the octahedron made up of the four original tetrahedra; this has three internal axes. The initial four tetrahedra meet along the given edge which forms one of these axes; the new tetrahedra will meet along a different axis. This move can be done iff (i) the edge is valid and nonboundary, and (ii) the four tetrahedra are distinct.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument e) can no longer be used.
e  the edge about which to perform the move. 
newAxis  Specifies which axis of the octahedron the new tetrahedra should meet along; this should be 0 or 1. Consider the four original tetrahedra in the order described by NEdge::getEmbeddings(); call these tetrahedra 0, 1, 2 and

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
.

inlinestatic 
Recovers a full triangulation from an isomorphism signature.
See isoSig() for more information on isomorphism signatures.
The triangulation that is returned will be newly created.
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.
For a full and precise description of the isomorphism signature format, see Simplification paths in the Pachner graphs of closed orientable 3manifold triangulations, Burton, 2011, arXiv:1110.6080
.
signature  the isomorphism signature of the triangulation to construct. Note that, unlike dehydration strings, case is important for isomorphism signatures. 

static 
Extracts a triangulation from a string that contains the full contents of a SnapPea data file.
This routine could, for instance, be used to receive a triangulation from SnapPy without writing to the filesystem.
If you wish to read a triangulation from a SnapPea file, you should use the global function readSnapPea() instead (which has better performance, and does not require you to construct an enormous intermediate string).
For details on how the triangulation will be extracted, see the documentation for readSnapPea().
The triangulation that is returned will be newly created. If the SnapPea data is not in the correct format, this routine will return 0 instead.
snapPeaData  a string containing the full contents of a SnapPea data file. 

inline 
Returns the requested triangulation boundary component.
Bear in mind that each time the triangulation changes, the boundary components will be deleted and replaced with new ones. Thus this object should be considered temporary only.
index  the index of the desired boundary component, ranging from 0 to getNumberOfBoundaryComponents()1 inclusive. 

inline 
Returns all boundary components of this triangulation.
Note that each ideal vertex forms its own boundary component.
Bear in mind that each time the triangulation changes, the boundary components will be deleted and replaced with new ones. Thus the objects contained in this list should be considered temporary only.
This reference to the list however will remain valid and uptodate for as long as the triangulation exists.

inline 
Returns the requested triangulation component.
Bear in mind that each time the triangulation changes, the components will be deleted and replaced with new ones. Thus this object should be considered temporary only.
index  the index of the desired component, ranging from 0 to getNumberOfComponents()1 inclusive. 

inline 
Returns all components of this triangulation.
Bear in mind that each time the triangulation changes, the components will be deleted and replaced with new ones. Thus the objects contained in this list should be considered temporary only.
This reference to the list however will remain valid and uptodate for as long as the triangulation exists.

inline 
Returns the requested edge in this triangulation.
Bear in mind that each time the triangulation changes, the edges will be deleted and replaced with new ones. Thus this object should be considered temporary only.
index  the index of the desired edge, ranging from 0 to getNumberOfEdges()1 inclusive. 

inline 
Returns all edges of this triangulation.
Bear in mind that each time the triangulation changes, the edges will be deleted and replaced with new ones. Thus the objects contained in this list should be considered temporary only.
This reference to the list however will remain valid and uptodate for as long as the triangulation exists.

inline 
A deprecated alias for getEulerCharTri().
This routine calculates the Euler characteristic of this triangulation. Since it treats cusps in a nonstandard way, it was renamed to getEulerCharTri() in Regina 4.4 to clarify that this might differ from the Euler characteristic of the corresponding compact manifold.
See getEulerCharTri() for further details.
long regina::NTriangulation::getEulerCharManifold  (  )  const 
Returns the Euler characteristic of the corresponding compact 3manifold.
Instead of simply calculating VE+FT, this routine also:
For ideal triangulations, this routine therefore computes the proper Euler characteristic of the manifold (unlike getEulerCharTri(), which does not).
For triangulations whose vertex links are all spheres or discs, this routine and getEulerCharTri() give identical results.

inline 
Returns the Euler characteristic of this triangulation.
This will be evaluated strictly as VE+FT.
Note that this routine handles cusps in a nonstandard way. Since it computes the Euler characteristic of the triangulation (and not the underlying manifold), this routine will treat each cusp as a single vertex, and not as a surface boundary component.
For a routine that handles cusps properly (i.e., treats them as surface boundary components when computing the Euler characteristic), see getEulerCharManifold() instead.
This routine was previously called getEulerCharacteristic() in Regina 4.3.1 and earlier. It was renamed in Regina 4.4 to clarify the nonstandard handling of cusps.

inline 
A deprecated alias for getTriangle().
This routine returns the requested triangular face in the triangulation. See getTriangle() for further details.
index  the index of the desired triangle, ranging from 0 to getNumberOfTriangles()1 inclusive. 

inline 
A deprecated alias for getTriangles().
This routine returns all triangular faces in this triangulation. See getTriangles() for further details.
const NGroupPresentation& regina::NTriangulation::getFundamentalGroup  (  )  const 
Returns the fundamental group of this triangulation.
If this triangulation contains any ideal or nonstandard vertices, the fundamental group will be calculated as if each such vertex had been truncated.
If this triangulation contains any invalid edges, the calculations will be performed without any truncation of the corresponding projective plane cusp. Thus if a barycentric subdivision is performed on the triangulation, the result of getFundamentalGroup() will change.
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, getFundamentalGroup() should be called again; this will be instantaneous if the group has already been calculated.
Note that this triangulation is not required to be valid (see isValid()).
const NAbelianGroup& regina::NTriangulation::getHomologyH1  (  )  const 
Returns the first homology group for this triangulation.
If this triangulation contains any ideal or nonstandard vertices, the homology group will be calculated as if each such vertex had been truncated.
If this triangulation contains any invalid edges, the calculations will be performed without any truncation of the corresponding projective plane cusp. Thus if a barycentric subdivision is performed on the triangulation, the result of getHomologyH1() will change.
Bear in mind that each time the triangulation changes, the homology groups will be deleted. Thus the reference that is returned from this routine should not be kept for later use. Instead, getHomologyH1() should be called again; this will be instantaneous if the group has already been calculated.
Note that this triangulation is not required to be valid (see isValid()).
const NAbelianGroup& regina::NTriangulation::getHomologyH1Bdry  (  )  const 
Returns the first homology group of the boundary for this triangulation.
Note that ideal vertices are considered part of the boundary.
Bear in mind that each time the triangulation changes, the homology groups will be deleted. Thus the reference that is returned from this routine should not be kept for later use. Instead, getHomologyH1Bdry() should be called again; this will be instantaneous if the group has already been calculated.
This routine is fairly fast, since it deduces the homology of each boundary component through knowing what kind of surface it is.
const NAbelianGroup& regina::NTriangulation::getHomologyH1Rel  (  )  const 
Returns the relative first homology group with respect to the boundary for this triangulation.
Note that ideal vertices are considered part of the boundary.
Bear in mind that each time the triangulation changes, the homology groups will be deleted. Thus the reference that is returned from this routine should not be kept for later use. Instead, getHomologyH1Rel() should be called again; this will be instantaneous if the group has already been calculated.
const NAbelianGroup& regina::NTriangulation::getHomologyH2  (  )  const 
Returns the second homology group for this triangulation.
If this triangulation contains any ideal vertices, the homology group will be calculated as if each such vertex had been truncated. The algorithm used calculates various first homology groups and uses homology and cohomology theorems to deduce the second homology group.
Bear in mind that each time the triangulation changes, the homology groups will be deleted. Thus the reference that is returned from this routine should not be kept for later use. Instead, getHomologyH2() should be called again; this will be instantaneous if the group has already been calculated.

inline 
Returns the second homology group with coefficients in Z_2 for this triangulation.
If this triangulation contains any ideal vertices, the homology group will be calculated as if each such vertex had been truncated. The algorithm used calculates the relative first homology group with respect to the boundary and uses homology and cohomology theorems to deduce the second homology group.
This group will simply be the direct sum of several copies of Z_2, so the number of Z_2 terms is returned.

inline 
Returns the number of boundary components in this triangulation.
Note that each ideal vertex forms its own boundary component.

inline 
Returns the number of components in this triangulation.

inline 
Returns the number of edges in this triangulation.

inline 
A deprecated alias for getNumberOfTriangles().
This routine returns the number of triangular faces in this triangulation. See getNumberOfTriangles() for further details.
Do not confuse this deprecated alias with the (nondeprecated) tempate function getNumberOfFaces<dim>().
unsigned long regina::NTriangulation::getNumberOfFaces  (  )  const 
Returns the number of faces of the given dimension in this triangulation.
This template function is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.

inline 
A dimensionagnostic alias for getNumberOfTetrahedra().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See getNumberOfTetrahedra() for further information.

inline 
Returns the number of tetrahedra in the triangulation.

inline 
Returns the number of triangular faces in this triangulation.

inline 
Returns the number of vertices in this triangulation.

inline 
A dimensionagnostic alias for getTetrahedron().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See getTetrahedron() for further information.

inline 
A dimensionagnostic alias for getTetrahedron().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See getTetrahedron() for further information.

inline 
A dimensionagnostic alias for getTetrahedra().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See getTetrahedra() for further information.

inline 
Returns all tetrahedra in the triangulation.
The reference returned will remain valid for as long as the triangulation exists, always reflecting the tetrahedra currently in the triangulation.

inline 
Returns the tetrahedron with the given index number in the triangulation.
Note that tetrahedron indexing may change when a tetrahedron is added or removed from the triangulation.
index  specifies which tetrahedron to return; this value should be between 0 and getNumberOfTetrahedra()1 inclusive. 
index
th tetrahedron in the triangulation.

inline 
Returns the tetrahedron with the given index number in the triangulation.
Note that tetrahedron indexing may change when a tetrahedron is added or removed from the triangulation.
index  specifies which tetrahedron to return; this value should be between 0 and getNumberOfTetrahedra()1 inclusive. 
index
th tetrahedron in the triangulation.

inline 
Returns the requested triangular face in this triangulation.
Bear in mind that each time the triangulation changes, the triangles will be deleted and replaced with new ones. Thus this object should be considered temporary only.
index  the index of the desired triangle, ranging from 0 to getNumberOfTriangles()1 inclusive. 

inline 
Returns all triangular faces of this triangulation.
Bear in mind that each time the triangulation changes, the triangles will be deleted and replaced with new ones. Thus the objects contained in this list should be considered temporary only.
This reference to the list however will remain valid and uptodate for as long as the triangulation exists.

inline 
Returns the requested vertex in this triangulation.
Bear in mind that each time the triangulation changes, the vertices will be deleted and replaced with new ones. Thus this object should be considered temporary only.
index  the index of the desired vertex, ranging from 0 to getNumberOfVertices()1 inclusive. 

inline 
Returns all vertices of this triangulation.
Bear in mind that each time the triangulation changes, the vertices will be deleted and replaced with new ones. Thus the objects contained in this list should be considered temporary only.
This reference to the list however will remain valid and uptodate for as long as the triangulation exists.

inline 
This routine now does nothing, and should not be used.

inline 
A deprecated alias for hasBoundaryTriangles().
This routine determines whether this triangulation has any boundary triangles. See hasBoundaryTriangles() for further details.
true
if and only if there are boundary triangles.

inline 
Determines if this triangulation has any boundary triangles.
true
if and only if there are boundary triangles. bool regina::NTriangulation::hasCompressingDisc  (  )  const 
Searches for a compressing disc within the underlying 3manifold.
Let M be the underlying 3manifold and let B be its boundary. By a compressing disc, we mean a disc D properly embedded in M, where the boundary of D lies in B but does not bound a disc in B.
This routine will first call the heuristic routine hasSimpleCompressingDisc() in the hope of obtaining a fast answer. If this fails, it will do one of two things:
This routine will work on a copy of this triangulation, not the original. In particular, the copy will be simplified, which means that there is no harm in calling this routine on an unsimplified triangulation.
If this triangulation has no boundary components, this routine will simply return false
.
true
if the underlying 3manifold contains a compressing disc, or false
if it does not.

inline 
Determines if this triangulation contains any ideal boundary components with negative Euler characteristic.
true
if and only if there is at least one such boundary component. NNormalSurface* regina::NTriangulation::hasNonTrivialSphereOrDisc  (  ) 
Searches for a nonvertexlinking normal sphere or disc within this triangulation.
If such a surface exists within this triangulation, this routine is guaranteed to find one.
Note that the surface returned (if any) depends upon this triangulation, and so the surface must be destroyed before this triangulation is destroyed.
NNormalSurface* regina::NTriangulation::hasOctagonalAlmostNormalSphere  (  ) 
Searches for an octagonal almost normal 2sphere within this triangulation.
If such a surface exists, this routine is guaranteed to find one.
Note that the surface returned (if any) depends upon this triangulation, and so the surface must be destroyed before this triangulation is destroyed.
bool regina::NTriangulation::hasSimpleCompressingDisc  (  )  const 
Searches for a "simple" compressing disc inside this triangulation.
Let M be the underlying 3manifold and let B be its boundary. By a compressing disc, we mean a disc D properly embedded in M, where the boundary of D lies in B but does not bound a disc in B.
By a simple compressing disc, we mean a compressing disc that has a very simple combinatorial structure (here "simple" is subject to change; see the warning below). Examples include the compressing disc inside a 1tetrahedron solid torus, or a compressing disc formed from a single internal triangle surrounded by three boundary edges.
The purpose of this routine is to avoid working with normal surfaces within a large triangulation where possible. This routine is relatively fast, and if it returns true
then this 3manifold definitely contains a compressing disc. If this routine returns false
then there might or might not be a compressing disc; the user will need to perform a full normal surface enumeration using hasCompressingDisc() to be sure.
This routine will work on a copy of this triangulation, not the original. In particular, the copy will be simplified, which means that there is no harm in calling this routine on an unsimplified triangulation.
If this triangulation has no boundary components, this routine will simply return false
.
For further information on this test, see "The WeberSeifert dodecahedral space is nonHaken", Benjamin A. Burton, J. Hyam Rubinstein and Stephan Tillmann, Trans. Amer. Math. Soc. 364:2 (2012), pp. 911932.
true
if a simple compressing disc was found, or false
if not. Note that even with a return value of false
, there might still be a compressing disc (just not one with a simple combinatorial structure). bool regina::NTriangulation::hasSplittingSurface  (  ) 
Determines whether this triangulation has a normal splitting surface.
See NNormalSurface::isSplitting() for details regarding normal splitting surfaces.
true
if and only if this triangulation has a normal splitting surface.

inline 
Determines if this triangulation contains any twosphere boundary components.
true
if and only if there is at least one twosphere boundary component. bool regina::NTriangulation::idealToFinite  (  bool  forceDivision = false  ) 
Converts an ideal triangulation into a finite triangulation.
All ideal or nonstandard vertices are truncated and thus converted into real boundary components made from unglued faces of tetrahedra.
Note that this operation is a loose converse of finiteToIdeal().
forceDivision  specifies what to do if the triangulation has no ideal or nonstandard vertices. If true , the triangulation will be subdivided anyway, as if all vertices were ideal. If false (the default), the triangulation will be left alone. 
true
if and only if the triangulation was changed. void regina::NTriangulation::insertAugTriSolidTorus  (  long  a1, 
long  b1,  
long  a2,  
long  b2,  
long  a3,  
long  b3  
) 
Inserts an augmented triangular solid torus with the given parameters into this triangulation.
Almost all augmented triangular solid tori represent Seifert fibred spaces with three or fewer exceptional fibres. Augmented triangular solid tori are described in more detail in the NAugTriSolidTorus class notes.
The resulting Seifert fibred space will be SFS((a1,b1) (a2,b2) (a3,b3) (1,1)), where the parameters a1, ..., b3 are passed as arguments to this routine. The three layered solid tori that are attached to the central triangular solid torus will be LST(a1, b1, a1b1), ..., LST(a3, b3, a3b3).
The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.
a1  a parameter describing the first layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
b1  a parameter describing the first layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
a2  a parameter describing the second layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
b2  a parameter describing the second layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
a3  a parameter describing the third layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
b3  a parameter describing the third layered solid torus in the augmented triangular solid torus; this may be either positive or negative. 
void regina::NTriangulation::insertConstruction  (  unsigned long  nTetrahedra, 
const int  adjacencies[][4],  
const int  gluings[][4][4]  
) 
Inserts into this triangulation a set of tetrahedra and their gluings as described by the given integer arrays.
This routine is provided to make it easy to hardcode a mediumsized triangulation in a C++ source file. All of the pertinent data can be hardcoded into a pair of integer arrays at the beginning of the source file, avoiding an otherwise tedious sequence of many joinTo() calls.
An additional nTetrahedra tetrahedra will be inserted into this triangulation. The relationships between these tetrahedra should be stored in the two arrays as follows. Note that the new tetrahedra are numbered from 0 to (nTetrahedra  1), and individual tetrahedron faces are numbered from 0 to 3.
The adjacencies array describes which tetrahedron faces are joined to which others. Specifically, adjacencies[t][f]
should contain the number of the tetrahedron joined to face f of tetrahedron t. If this face is to be left as a boundary triangle, adjacencies[t][f]
should be 1.
The gluings array describes the particular gluing permutations used when joining these tetrahedron faces together. Specifically, gluings[t][f][0..3]
should describe the permutation used to join face f of tetrahedron t to its adjacent tetrahedron. These four integers should be 0, 1, 2 and 3 in some order, so that gluings[t][f][i]
contains the image of i under this permutation. If face f of tetrahedron t is to be left as a boundary triangle, gluings[t][f][0..3]
may contain anything (and will be duly ignored).
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.
Note that, for an existing triangulation, dumpConstruction() will output a pair of C++ arrays that can be copied into a source file and used to reconstruct the triangulation via this routine.
nTetrahedra  the number of additional tetrahedra to insert. 
adjacencies  describes which of the new tetrahedron faces are to be identified. This array must have initial dimension at least nTetrahedra. 
gluings  describes the specific gluing permutations by which these new tetrahedron faces should be identified. This array must also have initial dimension at least nTetrahedra. 
void regina::NTriangulation::insertLayeredLensSpace  (  unsigned long  p, 
unsigned long  q  
) 
Inserts a new layered lens space L(p,q) into the triangulation.
The lens space will be created by gluing together two layered solid tori in a way that uses the fewest possible tetrahedra.
The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.
p  a parameter of the desired lens space. 
q  a parameter of the desired lens space. 
void regina::NTriangulation::insertLayeredLoop  (  unsigned long  length, 
bool  twisted  
) 
Inserts a layered loop of the given length into this triangulation.
Layered loops are described in more detail in the NLayeredLoop class notes.
The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.
length  the length of the new layered loop; this must be strictly positive. 
twisted  true if the new layered loop should be twisted, or false if it should be untwisted. 
NTetrahedron* regina::NTriangulation::insertLayeredSolidTorus  (  unsigned long  cuts0, 
unsigned long  cuts1  
) 
Inserts a new layered solid torus into the triangulation.
The meridinal disc of the layered solid torus will intersect the three edges of the boundary torus in cuts0, cuts1 and (cuts0 + cuts1) points respectively.
The boundary torus will always consist of faces 012 and 013 of the tetrahedron containing this boundary torus (this tetrahedron will be returned). In face 012, edges 12, 02 and 01 will meet the meridinal disc cuts0, cuts1 and (cuts0 + cuts1) times respectively. The only exceptions are if these three intersection numbers are (1,1,2) or (0,1,1), in which case edges 12, 02 and 01 will meet the meridinal disc (1, 2 and 1) or (1, 1 and 0) times respectively.
The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.
cuts0  the smallest of the three desired intersection numbers. 
cuts1  the second smallest of the three desired intersection numbers. 
bool regina::NTriangulation::insertRehydration  (  const std::string &  dehydration  ) 
Inserts the rehydration of the given string into this triangulation.
If you simply wish to convert a dehydration string into a new triangulation, use the static routine rehydrate() instead. See dehydrate() for more information on dehydration strings.
This routine will first rehydrate the given string into a proper triangulation. The tetrahedra from the rehydrated triangulation will then be inserted into this triangulation in the same order in which they appear in the rehydrated triangulation, and the numbering of their vertices (03) will not change.
The routine dehydrate() can be used to extract a dehydration string from an existing triangulation. Dehydration followed by rehydration might not produce a triangulation identical to the original, but it is guaranteed to produce an isomorphic copy. See dehydrate() for the reasons behind this.
For a full description of the dehydrated triangulation format, see A Census of Cusped Hyperbolic 3Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.
dehydration  a dehydrated representation of the triangulation to insert. Case is irrelevant; all letters will be treated as if they were lower case. 
true
if the insertion was successful, or false
if the given string could not be rehydrated.void regina::NTriangulation::insertSFSOverSphere  (  long  a1 = 1 , 
long  b1 = 0 , 

long  a2 = 1 , 

long  b2 = 0 , 

long  a3 = 1 , 

long  b3 = 0 

) 
Inserts an orientable Seifert fibred space with at most three exceptional fibres over the 2sphere into this triangulation.
The inserted Seifert fibred space will be SFS((a1,b1) (a2,b2) (a3,b3) (1,1)), where the parameters a1, ..., b3 are passed as arguments to this routine.
The three pairs of parameters (a,b) do not need to be normalised, i.e., the parameters can be positive or negative and b may lie outside the range [0..a). There is no separate twisting parameter; each additional twist can be incorporated into the existing parameters by replacing some pair (a,b) with the pair (a,a+b). For Seifert fibred spaces with less than three exceptional fibres, some or all of the parameter pairs may be (1,k) or even (1,0).
The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.
a1  a parameter describing the first exceptional fibre. 
b1  a parameter describing the first exceptional fibre. 
a2  a parameter describing the second exceptional fibre. 
b2  a parameter describing the second exceptional fibre. 
a3  a parameter describing the third exceptional fibre. 
b3  a parameter describing the third exceptional fibre. 
void regina::NTriangulation::insertTriangulation  (  const NTriangulation &  source  ) 
Inserts a copy of the given triangulation into this triangulation.
The new tetrahedra will be inserted into this triangulation in the order in which they appear in the given triangulation, and the numbering of their vertices (03) will not change. They will be given the same descriptions as appear in the given triangulation.
source  the triangulation whose copy will be inserted. 
bool regina::NTriangulation::intelligentSimplify  (  ) 
Attempts to simplify the triangulation as intelligently as possible without further input.
This routine will attempt to reduce both the number of tetrahedra and the number of boundary triangles (with the number of tetrahedra as its priority).
Currently this routine uses simplifyToLocalMinimum() in combination with random 44 moves, book opening moves and book closing moves.
true
if and only if the triangulation was changed.

inlineprotectedvirtual 
Makes a newly allocated copy of this packet.
This routine should not insert the new packet into the tree structure, clone the packet's associated tags or give the packet a label. It should also not clone any descendants of this packet.
You may assume that the new packet will eventually be inserted into the tree beneath either the same parent as this packet or a clone of that parent.
parent  the parent beneath which the new packet will eventually be inserted. 
Implements regina::NPacket.
bool regina::NTriangulation::isBall  (  )  const 
Determines whether this is a triangulation of a 3dimensional ball.
This routine is based on isThreeSphere(), which in turn combines Rubinstein's 3sphere recognition algorithm with Jaco and Rubinstein's 0efficiency prime decomposition algorithm.
true
if and only if this is a triangulation of a 3dimensional ball.

inline 
Determines if this triangulation is closed.
This is the case if and only if it has no boundary. Note that ideal triangulations are not closed.
true
if and only if this triangulation is closed.

inline 
Determines if this triangulation is connected.
true
if and only if this triangulation is connected. std::auto_ptr<NIsomorphism> regina::NTriangulation::isContainedIn  (  const NTriangulation &  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).
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 NIsomorphism class notes.
In particular, note that boundary triangles of this triangulation need not correspond to boundary triangles of other, and that other can contain more tetrahedra than this triangulation.
If a boundary incomplete isomorphism is found, the details of this isomorphism are returned. The isomorphism is newly constructed, and so to assist with memory management is returned as a std::auto_ptr. Thus, to test whether an isomorphism exists without having to explicitly deal with the isomorphism itself, you can call if (isContainedIn(other).get())
and the newly created isomorphism (if it exists) will be automatically destroyed.
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. 
bool regina::NTriangulation::isHaken  (  )  const 
Determines whether the underlying 3manifold (which must be closed and orientable) is Haken.
In other words, this routine determines whether the underlying 3manifold contains an embedded closed twosided incompressible surface.
Currently Hakenness testing is available only for irreducible manifolds. This routine will first test whether the manifold is irreducible and, if it is not, will return false
immediately.
true
if and only if the underlying 3manifold is irreducible and Haken.

inline 
Determines if this triangulation is ideal.
This is the case if and only if one of the vertex links is closed and not a 2sphere. Note that the triangulation is not required to be valid.
true
if and only if this triangulation is ideal. bool regina::NTriangulation::isIrreducible  (  )  const 
Determines whether the underlying 3manifold (which must be closed) is irreducible.
In other words, this routine determines whether every embedded sphere in the underlying 3manifold bounds a ball.
If the underlying 3manifold is orientable, this routine will use fast crushing and branchandbound methods. If the underlying 3manifold is nonorientable, it will use a (much slower) full enumeration of vertex normal surfaces.
true
if and only if the underlying 3manifold is irreducible. std::auto_ptr<NIsomorphism> regina::NTriangulation::isIsomorphicTo  (  const NTriangulation &  other  )  const 
Determines if this triangulation is combinatorially isomorphic to the given triangulation.
Specifically, this routine determines if there is a onetoone and onto boundary complete combinatorial isomorphism from this triangulation to other. Boundary complete isomorphisms are described in detail in the NIsomorphism class notes.
In particular, note that this triangulation and other must contain the same number of tetrahedra for such an isomorphism to exist.
If a boundary complete isomorphism is found, the details of this isomorphism are returned. The isomorphism is newly constructed, and so to assist with memory management is returned as a std::auto_ptr. Thus, to test whether an isomorphism exists without having to explicitly deal with the isomorphism itself, you can call if (isIsomorphicTo(other).get())
and the newly created isomorphism (if it exists) will be automatically destroyed.
other  the triangulation to compare with this one. 
bool regina::NTriangulation::isOrdered  (  )  const 
Determines if this triangulation is ordered; that is, if tetrahedron vertices are labelled so that all gluing permutations are orderpreserving on the tetrahedron faces.
Equivalently, this tests whether the edges of the triangulation can all be oriented such that they induce a consistent ordering on the vertices of each tetrahedron.
Triangulations are not ordered by default, and indeed some cannot be ordered at all. The routine order() will attempt to relabel tetrahedron vertices to give an ordered triangulation.
true
if and only if all gluing permutations are order preserving on the tetrahedron faces.

inline 
Determines if this triangulation is orientable.
true
if and only if this triangulation is orientable. bool regina::NTriangulation::isOriented  (  )  const 
Determines if this triangulation is oriented; that is, if tetrahedron vertices are labelled in a way that preserves orientation across adjacent tetrahedron faces.
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 tetrahedra to be oriented consistently as described above.
A nonorientable triangulation can never be oriented.
true
if and only if all tetrahedra are oriented consistently.

inline 
Constructs the isomorphism signature for this triangulation.
An isomorphism signature is a compact text representation of a triangulation. Unlike dehydrations, an isomorphism signature uniquely determines a triangulation up to combinatorial isomorphism. That is, two triangulations are combinatorially isomorphic if and only if their isomorphism signatures are the same.
The isomorphism signature is constructed entirely of printable characters, and has length proportional to n log n
, where n is the number of tetrahedra.
Isomorphism signatures are more general than dehydrations: they can be used with any triangulation (including closed, ideal, bounded, invalid and/or disconnected triangulations, as well as triangulations with large numbers of tetrahedra).
The time required to construct the isomorphism signature of a triangulation is O(n^2 log^2 n)
.
The routine fromIsoSig() can be used to recover a triangulation from an isomorphism signature. The triangulation recovered might not be identical to the original, but it will be combinatorially isomorphic.
If relabelling is nonnull (i.e., it points to some NIsomorphism pointer p), then it will be modified to point to a new NIsomorphism that describes the precise relationship between this triangulation and the reconstruction from fromIsoSig(). Specifically, the triangulation that is reconstructed from fromIsoSig() will be combinatorially identical to relabelling.apply(this)
.
For a full and precise description of the isomorphism signature format, see Simplification paths in the Pachner graphs of closed orientable 3manifold triangulations, Burton, 2011, arXiv:1110.6080
.
relabelling  if nonnull, this will be modified to point to a new isomorphism describing the relationship between this triangulation and that reconstructed from fromIsoSig(), as described above. 
bool regina::NTriangulation::isSolidTorus  (  )  const 
Determines whether this is a triangulation of the solid torus; that is, the unknot complement.
This routine can be used on a triangulation with real boundary triangles, or on an ideal triangulation (in which case all ideal vertices will be assumed to be truncated).
true
if and only if this is either a real (compact) or ideal (noncompact) triangulation of the solid torus.

inline 
Determines if this triangulation is standard.
This is the case if and only if every vertex is standard. See NVertex::isStandard() for further details.
true
if and only if this triangulation is standard. bool regina::NTriangulation::isThreeSphere  (  )  const 
Determines whether this is a triangulation of a 3sphere.
This routine relies upon a combination of Rubinstein's 3sphere recognition algorithm and Jaco and Rubinstein's 0efficiency prime decomposition algorithm.
true
if and only if this is a 3sphere triangulation.

inline 
Determines if this triangulation is valid.
A triangulation is valid unless there is some vertex whose link has boundary but is not a disc (i.e., a vertex for which NVertex::getLink() returns NVertex::NON_STANDARD_BDRY), or unless there is some edge glued to itself in reverse (i.e., an edge for which NEdge::isValid() returns false
).
true
if and only if this triangulation is valid. bool regina::NTriangulation::isZeroEfficient  (  ) 
Determines if this triangulation is 0efficient.
A triangulation is 0efficient if its only normal spheres and discs are vertex linking, and if it has no 2sphere boundary components.
true
if and only if this triangulation is 0efficient. bool regina::NTriangulation::knowsBall  (  )  const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a 3dimensional ball? See isBall() for further details.
If this property is indeed already known, future calls to isBall() will be very fast (simply returning the precalculated value).
If this property is not already known, this routine will nevertheless run some very fast preliminary tests to see if the answer is obviously no. If so, it will store false
as the precalculated value for isBall() and this routine will return true
.
Otherwise a call to isBall() may potentially require more significant work, and so this routine will return false
.
true
if and only if this property is already known or trivial to calculate. bool regina::NTriangulation::knowsCompressingDisc  (  )  const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold contains a compressing disc? See hasCompressingDisc() for further details.
If this property is indeed already known, future calls to hasCompressingDisc() will be very fast (simply returning the precalculated value).
If this property is not already known, this routine will nevertheless run some very fast preliminary tests to see if the answer is obviously no. If so, it will store false
as the precalculated value for hasCompressingDisc() and this routine will return true
.
Otherwise a call to hasCompressingDisc() may potentially require more significant work, and so this routine will return false
.
true
if and only if this property is already known or trivial to calculate. bool regina::NTriangulation::knowsHaken  (  )  const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold is Haken? See isHaken() for further details.
If this property is indeed already known, future calls to isHaken() will be very fast (simply returning the precalculated value).
true
if and only if this property is already known or trivial to calculate. bool regina::NTriangulation::knowsIrreducible  (  )  const 
Is it already known (or trivial to determine) whether or not the underlying 3manifold is irreducible? See isIrreducible() for further details.
If this property is indeed already known, future calls to isIrreducible() will be very fast (simply returning the precalculated value).
true
if and only if this property is already known or trivial to calculate. bool regina::NTriangulation::knowsSolidTorus  (  )  const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a solid torus (that is, the unknot complement)? See isSolidTorus() for further details.
If this property is indeed already known, future calls to isSolidTorus() will be very fast (simply returning the precalculated value).
If this property is not already known, this routine will nevertheless run some very fast preliminary tests to see if the answer is obviously no. If so, it will store false
as the precalculated value for isSolidTorus() and this routine will return true
.
Otherwise a call to isSolidTorus() may potentially require more significant work, and so this routine will return false
.
true
if and only if this property is already known or trivial to calculate.

inline 
Is it already known whether or not this triangulation has a splitting surface? See hasSplittingSurface() for further details.
If this property is already known, future calls to hasSplittingSurface() will be very fast (simply returning the precalculated value).
true
if and only if this property is already known. bool regina::NTriangulation::knowsThreeSphere  (  )  const 
Is it already known (or trivial to determine) whether or not this is a triangulation of a 3sphere? See isThreeSphere() for further details.
If this property is indeed already known, future calls to isThreeSphere() will be very fast (simply returning the precalculated value).
If this property is not already known, this routine will nevertheless run some very fast preliminary tests to see if the answer is obviously no. If so, it will store false
as the precalculated value for isThreeSphere() and this routine will return true
.
Otherwise a call to isThreeSphere() may potentially require more significant work, and so this routine will return false
.
true
if and only if this property is already known or trivial to calculate.

inline 
Is it already known whether or not this triangulation is 0efficient? See isZeroEfficient() for further details.
If this property is already known, future calls to isZeroEfficient() will be very fast (simply returning the precalculated value).
true
if and only if this property is already known. NTetrahedron* regina::NTriangulation::layerOn  (  NEdge *  edge  ) 
Performs a layering upon the given boundary edge of the triangulation.
See the NLayering class notes for further details on what a layering entails.
edge  the boundary edge upon which to layer. 
void regina::NTriangulation::makeDoubleCover  (  ) 
Converts this triangulation into its double cover.
Each orientable component will be duplicated, and each nonorientable component will be converted into its orientable double cover.
NPacket* regina::NTriangulation::makeZeroEfficient  (  ) 
Converts this into a 0efficient triangulation of the same underlying 3manifold.
A triangulation is 0efficient if its only normal spheres and discs are vertex linking, and if it has no 2sphere boundary components.
Note that this routine is currently only available for closed orientable triangulations; see the list of preconditions for details. The 0efficiency algorithm of Jaco and Rubinstein is used.
If the underlying 3manifold is prime, it can always be made 0efficient (with the exception of the special cases RP3 and S2xS1 as noted below). In this case the original triangulation will be modified directly and 0 will be returned.
If the underyling 3manifold is RP3 or S2xS1, it cannot be made 0efficient; in this case the original triangulation will be reduced to a twotetrahedron minimal triangulation and 0 will again be returned.
If the underlying 3manifold is not prime, it cannot be made 0efficient. In this case the original triangulation will remain unchanged and a new connected sum decomposition will be returned. This will be presented as a newly allocated container packet with one child triangulation for each prime summand.
void regina::NTriangulation::maximalForestInBoundary  (  std::set< NEdge * > &  edgeSet, 
std::set< NVertex * > &  vertexSet  
)  const 
Produces a maximal forest in the 1skeleton of the triangulation boundary.
Both given sets will be emptied and the edges and vertices of the maximal forest will be placed into them. A vertex that forms its own boundary component (such as an ideal vertex) will still be placed in vertexSet
.
Note that the edge and vertex pointers returned will become invalid once the triangulation has changed.
edgeSet  the set to be emptied and into which the edges of the maximal forest will be placed. 
vertexSet  the set to be emptied and into which the vertices of the maximal forest will be placed. 
void regina::NTriangulation::maximalForestInDualSkeleton  (  std::set< NTriangle * > &  triangleSet  )  const 
Produces a maximal forest in the triangulation's dual 1skeleton.
The given set will be emptied and will have the triangles corresponding to the edges of the maximal forest in the dual 1skeleton placed into it.
Note that the triangle pointers returned will become invalid once the triangulation has changed.
triangleSet  the set to be emptied and into which the triangles representing the maximal forest will be placed. 
void regina::NTriangulation::maximalForestInSkeleton  (  std::set< NEdge * > &  edgeSet, 
bool  canJoinBoundaries = true 

)  const 
Produces a maximal forest in the triangulation's 1skeleton.
The given set will be emptied and will have the edges of the maximal forest placed into it. It can be specified whether or not different boundary components may be joined by the maximal forest.
An edge leading to an ideal vertex is still a candidate for inclusion in the maximal forest. For the purposes of this algorithm, any ideal vertex will be treated as any other vertex (and will still be considered part of its own boundary component).
Note that the edge pointers returned will become invalid once the triangulation has changed.
edgeSet  the set to be emptied and into which the edges of the maximal forest will be placed. 
canJoinBoundaries  true if and only if different boundary components are allowed to be joined by the maximal forest. 
void regina::NTriangulation::moveContentsTo  (  NTriangulation &  dest  ) 
Moves the contents of this triangulation into the given destination triangulation, without destroying any preexisting contents.
That is, all tetrahedra that currently belong to dest will remain there, and all tetrahedra that belong to this triangulation will be moved across as additional tetrahedra in dest.
All NTetrahedron pointers or references will remain valid. After this operation, this triangulation will be empty.
dest  the triangulation to which tetrahedra should be moved. 

inline 
A dimensionagnostic alias for newTetrahedron().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See newTetrahedron() for further information.

inline 
A dimensionagnostic alias for newTetrahedron().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See newTetrahedron() for further information.

inline 
Creates a new tetrahedron and adds it to this triangulation.
The new tetrahedron will have an empty description. All four faces of the new tetrahedron will be boundary triangles.
The new tetrahedron will become the last tetrahedron in this triangulation.

inline 
Creates a new tetrahedron with the given description and adds it to this triangulation.
All four faces of the new tetrahedron will be boundary triangles.
desc  the description to assign to the new tetrahedron. 
bool regina::NTriangulation::openBook  (  NTriangle *  t, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a book opening move about the given triangle.
This involves taking a triangle meeting the boundary along two edges, and ungluing it to create two new boundary triangles (thus exposing the tetrahedra it initially joined). This move is the inverse of the closeBook() move, and is used to open the way for new shellBoundary() moves.
This move can be done if:
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument f) can no longer be used.
t  the triangle 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
. bool regina::NTriangulation::order  (  bool  forceOriented = false  ) 
Relabels tetrahedron vertices in this triangulation to give an ordered triangulation, if possible.
To be an ordered triangulation, all face gluings (when restricted to the tetrahedron face) must be order preserving. In other words, it must be possible to orient all edges of the triangulation in such a fashion that they are consistent with the ordering of the vertices in each tetrahedron.
If it is possible to order this triangulation, the vertices of each tetrahedron will be relabelled accordingly and this routine will return true
. Otherwise, this routine will return false
and the triangulation will not be changed.
forceOriented  true if the triangulation must be both ordered and oriented, in which case this routine will return false if the triangulation cannot be oriented and ordered at the same time. See orient() for further details. 
true
if the triangulation has been successfully ordered as described above, or false
if not.void regina::NTriangulation::orient  (  ) 
Relabels tetrahedron vertices in this triangulation so that all tetrahedra are oriented consistently, if possible.
This routine works by flipping vertices 2 and 3 of each tetrahedron with negative orientation. The result will be a triangulation where the tetrahedron vertices are labelled in a way that preserves orientation across adjacent tetrahedron faces. In particular, every gluing permutation will have negative sign.
If this triangulation includes both orientable and nonorientable components, the orientable components will be oriented as described above and the nonorientable components will be left untouched.

static 
Rehydrates the given alphabetical string into a new triangulation.
See dehydrate() for more information on dehydration strings.
This routine will rehydrate the given string into a new triangulation, and return this new triangulation.
The converse routine dehydrate() can be used to extract a dehydration string from an existing triangulation. Dehydration followed by rehydration might not produce a triangulation identical to the original, but it is guaranteed to produce an isomorphic copy. See dehydrate() for the reasons behind this.
For a full description of the dehydrated triangulation format, see A Census of Cusped Hyperbolic 3Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.
dehydration  a dehydrated representation of the triangulation to construct. Case is irrelevant; all letters will be treated as if they were lower case. 

inline 
A dimensionagnostic alias for removeAllTetrahedra().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See removeAllTetrahedra() for further information.

inline 
Removes all tetrahedra from the triangulation.
All tetrahedra will be deallocated.

inline 
A dimensionagnostic alias for removeTetrahedron().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See removeTetrahedron() for further information.

inline 
A dimensionagnostic alias for removeTetrahedronAt().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See removeTetrahedronAt() for further information.

inline 
Removes the given tetrahedron from the triangulation.
All faces glued to this tetrahedron will be unglued. The tetrahedron will be deallocated.
tet  the tetrahedron to remove. 

inline 
Removes the tetrahedron with the given index number from the triangulation.
Note that tetrahedron indexing may change when a tetrahedron is added or removed from the triangulation.
All faces glued to this tetrahedron will be unglued. The tetrahedron will be deallocated.
index  specifies which tetrahedron to remove; this should be between 0 and getNumberOfTetrahedra()1 inclusive. 
void regina::NTriangulation::reorderTetrahedraBFS  (  bool  reverse = false  ) 
Reorders the tetrahedra of this triangulation using a breadthfirst search, so that smallnumbered tetrahedra are adjacent to other smallnumbered tetrahedra.
Specifically, the reordering will operate as follows. Tetrahedron 0 will remain tetrahedron 0. Its immediate neighbours will be numbered 1, 2, 3 and 4 (though if these neighbours are not distinct then of course fewer labels will be required). Their immediate neighbours will in turn be numbered 5, 6, and so on, ultimately following a breadthfirst search throughout the entire triangulation.
If the optional argument reverse is true
, then tetrahedron numbers will be assigned in reverse order. That is, tetrahedron 0 will become tetrahedron n1, its neighbours will become tetrahedra n2 down to n5, and so on.
reverse  true if the new tetrahedron numbers should be assigned in reverse order, as described above. 
bool regina::NTriangulation::shellBoundary  (  NTetrahedron *  t, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a boundary shelling move on the given tetrahedron.
This involves simply popping off a tetrahedron that touches the boundary. This can be done if:
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects can no longer be used.
t  the tetrahedron upon 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
.

inline 
A dimensionagnostic alias for tetrahedronIndex().
This is to assist with writing dimensionagnostic code that can be reused to work in different dimensions.
Here "simplex" refers to a topdimensional simplex (which for 3manifold triangulations means a tetrahedron).
See tetrahedronIndex() for further information.

inline 
Notifies the triangulation that you have simplified the presentation of its fundamental group.
The old group presentation will be destroyed, and this triangulation will take ownership of the new (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, this routine will nevertheless take ownership of the new group, under the assumption that you have worked out the group through some other clever means without ever having needed to call getFundamentalGroup() 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. 
bool regina::NTriangulation::simplifyToLocalMinimum  (  bool  perform = true  ) 
Uses all known simplification moves to reduce the triangulation monotonically to some local minimum number of tetrahedra.
Note that this will probably not give a globally minimal triangulation; see intelligentSimplify() for further assistance in achieving this goal.
The moves used include 32, 20 (edge and vertex), 21 and boundary shelling moves.
Note that moves that do not reduce the number of tetrahedra (such as 44 moves or book opening moves) are not used in this routine. Such moves do however feature in intelligentSimplify().
perform  true if we are to perform the simplifications, or false if we are only to investigate whether simplifications are possible (defaults to true ). 
true
, this routine returns true
if and only if the triangulation was changed to reduce the number of tetrahedra; if perform is false
, this routine returns true
if and only if it determines that it is capable of performing such a change. std::string regina::NTriangulation::snapPea  (  )  const 
Returns a string containing the full contents of a SnapPea data file that describes this triangulation.
This string can, for instance, be used to pass the triangulation to SnapPy without writing to the filesystem.
If you wish to export a triangulation to a SnapPea file, you should use the global function writeSnapPea() instead (which has better performance, and does not require you to construct an enormous intermediate string).
For details on how the SnapPea file will be constructed and what will be included, see the documentation for writeSnapPea().
unsigned long regina::NTriangulation::splitIntoComponents  (  NPacket *  componentParent = 0 , 
bool  setLabels = true 

) 
Splits a disconnected triangulation into many smaller triangulations, one for each component.
The new component triangulations will be inserted as children of the given parent packet. The original triangulation will be left unchanged.
If the given parent packet is 0, the new component triangulations will be inserted as children of this triangulation.
This routine can optionally assign unique (and sensible) packet labels to each of the new component triangulations. Note however that uniqueness testing may be slow, so this assignment of labels should be disabled if the component triangulations are only temporary objects used as part of a larger routine.
componentParent  the packet beneath which the new component triangulations will be inserted, or 0 if they should be inserted directly beneath this triangulation. 
setLabels  true if the new component triangulations should be assigned unique packet labels, or false if they should be left without labels at all. 
void regina::NTriangulation::swapContents  (  NTriangulation &  other  ) 
Swaps the contents of this and the given triangulation.
That is, all tetrahedra that belong to this triangulation will be moved to other, and all tetrahedra that belong to other will be moved to this triangulation.
All NTetrahedron pointers or references will remain valid.
other  the triangulation whose contents should be swapped with this. 

inline 
Returns the index of the given tetrahedron in the triangulation.
Note that tetrahedron indexing may change when a tetrahedron is added or removed from the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getTetrahedronIndex(). The name has been changed because, unlike the old routine, it requires that the given tetrahedron belongs to the triangulation (a consequence of some significant memory optimisations).
tet  specifies which tetrahedron to find in the triangulation. 
bool regina::NTriangulation::threeTwoMove  (  NEdge *  e, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 32 move about the given edge.
This involves replacing the three tetrahedra joined at that edge with two tetrahedra joined by a triangle. This can be done iff (i) the edge is valid and nonboundary, and (ii) the three tetrahedra are distinct.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument e) can no longer be used.
e  the edge 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
.

inline 
Returns the index of the given triangle in the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getFaceIndex(). The name has been changed because, unlike the old routine, it requires that the given triangle belongs to the triangulation (a consequence of some significant memory optimisations).
triangle  specifies which triangle to find in the triangulation. 
double regina::NTriangulation::turaevViro  (  unsigned long  r, 
unsigned long  whichRoot  
)  const 
Computes the TuraevViro state sum invariant of this 3manifold based upon the given initial data.
The initial data is as described in the paper of Turaev and Viro, "State sum invariants of 3manifolds and quantum 6jsymbols", Topology, vol. 31, no. 4, 1992, pp 865902.
In particular, Section 7 describes the initial data as determined by an integer r >=3 and a root of unity q0 of degree 2r for which q0^2 is a primitive root of unity of degree r.
These invariants, although computed in the complex field, should all be reals. Thus the return type is an ordinary double.
r  the integer r as described above; this must be at least 3. 
whichRoot  determines q0 to be the root of unity e^(2i * Pi * whichRoot / 2r); this argument must be strictly between 0 and 2r and must have no common factors with r. 
bool regina::NTriangulation::twoOneMove  (  NEdge *  e, 
int  edgeEnd,  
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 21 move about the given edge.
This involves taking an edge meeting only one tetrahedron just once and merging that tetrahedron with one of the tetrahedra joining it.
This can be done assuming the following conditions:
e
to the vertex of the second tetrahedron not touching the original tetrahedron. These edges must be distinct and may not both be in the boundary.There are additional "distinct and not both boundary" conditions on faces of the second tetrahedron, but those follow automatically from the final condition above.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument e) can no longer be used.
e  the edge about which to perform the move. 
edgeEnd  the end of the edge opposite that at which the second tetrahedron (to be merged) is joined. The end is 0 or 1, corresponding to the labelling (0,1) of the vertices of the edge as described in NEdgeEmbedding::getVertices(). 
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
. bool regina::NTriangulation::twoThreeMove  (  NTriangle *  t, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 23 move about the given triangle.
This involves replacing the two tetrahedra joined at that triangle with three tetrahedra joined by an edge. This can be done iff the two tetrahedra are distinct.
If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument f) can no longer be used.
t  the triangle 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
. bool regina::NTriangulation::twoZeroMove  (  NEdge *  e, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 20 move about the given edge of degree 2.
This involves taking the two tetrahedra joined at that edge and squashing them flat. This can be done if:
e
in each tetrahedron are distinct and not both boundary;If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument e) can no longer be used.
e  the edge 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
. bool regina::NTriangulation::twoZeroMove  (  NVertex *  v, 
bool  check = true , 

bool  perform = true 

) 
Checks the eligibility of and/or performs a 20 move about the given vertex of degree 2.
This involves taking the two tetrahedra joined at that vertex and squashing them flat. This can be done if:
v
in each tetrahedron are distinct and not both boundary;If the routine is asked to both check and perform, the move will only be performed if the check shows it is legal.
Note that after performing this move, all skeletal objects (triangles, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument v) can no longer be used.
v  the vertex 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
.

inline 
Returns the index of the given vertex in the triangulation.
This routine was introduced in Regina 4.5, and replaces the old getVertexIndex(). The name has been changed because, unlike the old routine, it requires that the given vertex belongs to the triangulation (a consequence of some significant memory optimisations).
vertex  specifies which vertex to find in the triangulation. 

virtual 
Writes this object in long text format to the given output stream.
The output should provide the user with all the information they could want. The output should be humanreadable, should not contain extremely long lines (so users can read the output in a terminal), and should end with a final newline.
The default implementation of this routine merely calls writeTextShort() and adds a newline.
out  the output stream to which to write. 
Reimplemented from regina::ShareableObject.

inlinevirtual 
Writes this object in short text format to the given output stream.
The output should be humanreadable, should fit on a single line, and should not end with a newline.
out  the output stream to which to write. 
Implements regina::ShareableObject.

protectedvirtual 
Writes a chunk of XML containing the data for this packet only.
You may assume that the packet opening tag (including the packet type and label) has already been written, and that all child packets followed by the corresponding packet closing tag will be written immediately after this routine is called. This routine need only write the internal data stored in this specific packet.
out  the output stream to which the XML should be written. 
Implements regina::NPacket.