3-Manifold Triangulations

## Classes

class | regina::BoundaryComponent< 3 >
| A component of the boundary of a 3-manifold triangulation. More...
class | regina::Component< 3 >
| Represents a connected component of a 3-manifold triangulation. More...
class | regina::Face< 3, 3 >
| Represents a tetrahedron within a 3-manifold triangulation. More...
class | regina::Face< 3, 2 >
| Represents a triangle in the skeleton of a 3-manifold triangulation. More...
class | regina::Triangulation< 3 >
| Represents a 3-dimensional triangulation, typically of a 3-manifold. More...
class | regina::Face< 3, 0 >
| Represents a vertex in the skeleton of a 3-manifold triangulation. More...

## Typedefs

typedef BoundaryComponent< 3 > | regina::NBoundaryComponent
| Deprecated typedef for backward compatibility. More...
typedef Component< 3 > | regina::NComponent
| Deprecated typedef for backward compatibility. More...
typedef Simplex< 3 > | regina::NTetrahedron
| Deprecated typedef for backward compatibility. More...
typedef FaceEmbedding< 3, 2 > | regina::NTriangleEmbedding
| Deprecated typedef for backward compatibility. More...
typedef Face< 3, 2 > | regina::NTriangle
| Deprecated typedef for backward compatibility. More...
typedef std::vector< Tetrahedron< 3 > * >::const_iterator | regina::Triangulation< 3 >::TetrahedronIterator
| A dimension-specific alias for SimplexIterator, used to iterate through tetrahedra. More...
typedef FaceList< 3, 2 >::Iterator | regina::Triangulation< 3 >::TriangleIterator
| Used to iterate through triangles. More...
typedef FaceList< 3, 1 >::Iterator | regina::Triangulation< 3 >::EdgeIterator
| Used to iterate through edges. More...
typedef FaceList< 3, 0 >::Iterator | regina::Triangulation< 3 >::VertexIterator
| Used to iterate through vertices. More...
typedef std::map< std::pair< unsigned long, bool >, Cyclotomic > | regina::Triangulation< 3 >::TuraevViroSet
| A map from (r, parity) pairs to Turaev-Viro invariants, as described by turaevViro(). More...
typedef Triangulation< 3 > | regina::NTriangulation
| Deprecated typedef for backward compatibility. More...
typedef FaceEmbedding< 3, 1 > | regina::NEdgeEmbedding
| Deprecated typedef for backward compatibility. More...
typedef Face< 3, 1 > | regina::NEdge
| Deprecated typedef for backward compatibility. More...
typedef FaceEmbedding< 3, 0 > | regina::NVertexEmbedding
| Deprecated typedef for backward compatibility. More...
typedef Face< 3, 0 > | regina::NVertex
| Deprecated typedef for backward compatibility. More...

## Enumerations

enum | regina::Face< 3, 2 >::Type { regina::Face< 3, 2 >::UNKNOWN_TYPE = 0, regina::Face< 3, 2 >::TRIANGLE = 1, regina::Face< 3, 2 >::SCARF = 2, regina::Face< 3, 2 >::PARACHUTE = 3, regina::Face< 3, 2 >::CONE = 4, regina::Face< 3, 2 >::MOBIUS = 5, regina::Face< 3, 2 >::HORN = 6, regina::Face< 3, 2 >::DUNCEHAT = 7, regina::Face< 3, 2 >::L31 = 8 }
| The type of a triangle, which indicates how the vertices and edges of the triangle are identified together. More...
enum | regina::TuraevViroAlg { regina::TV_DEFAULT = 0, regina::TV_BACKTRACK = 1, regina::TV_TREEWIDTH = 2, regina::TV_NAIVE = 3 }
| Represents the various algorithms available for computing Turaev-Viro invariants. More...
enum | regina::Face< 3, 0 >::LinkType { regina::Face< 3, 0 >::SPHERE = 1, regina::Face< 3, 0 >::DISC = 2, regina::Face< 3, 0 >::TORUS = 3, regina::Face< 3, 0 >::KLEIN_BOTTLE = 4, regina::Face< 3, 0 >::NON_STANDARD_CUSP = 5, regina::Face< 3, 0 >::INVALID = 6 }
| Categorises the possible links of a vertex into a small number of common types. More...

## Functions

long | regina::BoundaryComponent< 3 >::eulerChar () const
| Returns the Euler characteristic of this boundary component. More...
template<int subdim>
size_t | regina::Component< 3 >::countFaces () const
| Returns the number of subdim-faces in this component. More...
template<int subdim>
const std::vector< Face< 3, subdim > * > & | regina::Component< 3 >::faces () const
| Returns a reference to the list of all subdim-faces in this component. More...
template<int subdim>
Face< 3, subdim > * | regina::Component< 3 >::face (size_t index) const
| Returns the requested subdim-face in this component. More...
bool | regina::Component< 3 >::isIdeal () const
| Determines if this component is ideal. More...
bool | regina::Component< 3 >::isClosed () const
| Determines if this component is closed. More...
Simplex< 3 > * | regina::Face< 3, 3 >::adjacentTetrahedron (int face) const
| A dimension-specific alias for adjacentSimplex(). More...
int | regina::Face< 3, 3 >::adjacentFace (int face) const
| A dimension-specific alias for adjacentFacet(). More...
Type | regina::Face< 3, 2 >::type ()
| Returns a description of the triangle type. More...
int | regina::Face< 3, 2 >::subtype ()
| Return the triangle vertex or triangle edge that plays a special role for the triangle type of this triangle. More...
bool | regina::Face< 3, 2 >::isMobiusBand ()
| Determines whether this triangle is wrapped up to form a Mobius band. More...
bool | regina::Face< 3, 2 >::isCone ()
| Determines whether this triangle is wrapped up to form a cone. More...
| regina::Face< 3, 0 >::~Face ()
| Default destructor. More...
LinkType | regina::Face< 3, 0 >::link () const
| Returns a broad categorisation of the link of the vertex. More...
const Triangulation< 2 > * | regina::Face< 3, 0 >::buildLink () const
| Returns a full 2-manifold triangulation describing the link of this vertex. More...
Triangulation< 2 > * | regina::Face< 3, 0 >::buildLinkDetail (bool labels=true, Isomorphism< 3 > **inclusion=0) const
| Returns a full 2-manifold triangulation describing the link of this vertex. More...
bool | regina::Face< 3, 0 >::isLinkClosed () const
| Determines if the link of this vertex is closed. More...
bool | regina::Face< 3, 0 >::isIdeal () const
| Determines if this vertex is an ideal vertex. More...
bool | regina::Face< 3, 0 >::isStandard () const
| Determines if this vertex is standard. More...
REGINA_INLINE_REQUIRED long | regina::Face< 3, 0 >::linkEulerChar () const
| Returns the Euler characteristic of the vertex link. More...
void | regina::Face< 3, 0 >::writeTextShort (std::ostream &out) const
| Writes a short text representation of this object to the given output stream. More...

## Friends

class | regina::BoundaryComponent< 3 >::Triangulation< 3 >
class | regina::BoundaryComponent< 3 >::detail::TriangulationBase< 3 >
class | regina::Component< 3 >::Triangulation< 3 >
class | regina::Component< 3 >::detail::TriangulationBase< 3 >
class | regina::Face< 3, 3 >::Triangulation< 3 >
class | regina::Face< 3, 3 >::detail::TriangulationBase< 3 >
| Allow access to private members. More...
class | regina::Face< 3, 2 >::Triangulation< 3 >
class | regina::Face< 3, 2 >::detail::TriangulationBase< 3 >
class | regina::Face< 3, 0 >::Triangulation< 3 >
class | regina::Face< 3, 0 >::detail::TriangulationBase< 3 >

## Constructors and Destructors

| regina::Triangulation< 3 >::Triangulation ()
| Default constructor. More...
| regina::Triangulation< 3 >::Triangulation (const Triangulation< 3 > &copy)
| Creates a new copy of the given triangulation. More...
| regina::Triangulation< 3 >::Triangulation (const Triangulation &copy, bool cloneProps)
| Creates a new copy of the given triangulation, with the option of whether or not to clone its computed properties also. More...
| regina::Triangulation< 3 >::Triangulation (const std::string &description)
| "Magic" constructor that tries to find some way to interpret the given string as a triangulation. More...
virtual REGINA_INLINE_REQUIRED | regina::Triangulation< 3 >::~Triangulation ()
| Destroys this triangulation. More...

## Packet Administration

virtual void | regina::Triangulation< 3 >::writeTextShort (std::ostream &out) const
| Writes a short text representation of this object to the given output stream. More...
virtual void | regina::Triangulation< 3 >::writeTextLong (std::ostream &out) const
| Writes a detailed text representation of this object to the given output stream. More...
virtual bool | regina::Triangulation< 3 >::dependsOnParent () const
| Determines if this packet depends upon its parent. More...

## Tetrahedra

Tetrahedron< 3 > * | regina::Triangulation< 3 >::newTetrahedron ()
| A dimension-specific alias for newSimplex(). More...
Tetrahedron< 3 > * | regina::Triangulation< 3 >::newTetrahedron (const std::string &desc)
| A dimension-specific alias for newSimplex(). More...
void | regina::Triangulation< 3 >::removeTetrahedron (Tetrahedron< 3 > *tet)
| A dimension-specific alias for removeSimplex(). More...
void | regina::Triangulation< 3 >::removeTetrahedronAt (size_t index)
| A dimension-specific alias for removeSimplexAt(). More...
void | regina::Triangulation< 3 >::removeAllTetrahedra ()
| A dimension-specific alias for removeAllSimplices(). More...

## Skeletal Queries

bool | regina::Triangulation< 3 >::hasTwoSphereBoundaryComponents () const
| Determines if this triangulation contains any two-sphere boundary components. More...
bool | regina::Triangulation< 3 >::hasNegativeIdealBoundaryComponents () const
| Determines if this triangulation contains any ideal boundary components with negative Euler characteristic. More...

## Basic Properties

long | regina::Triangulation< 3 >::eulerCharManifold () const
| Returns the Euler characteristic of the corresponding compact 3-manifold. More...
bool | regina::Triangulation< 3 >::isIdeal () const
| Determines if this triangulation is ideal. More...
bool | regina::Triangulation< 3 >::isStandard () const
| Determines if this triangulation is standard. More...
bool | regina::Triangulation< 3 >::isClosed () const
| Determines if this triangulation is closed. More...
bool | regina::Triangulation< 3 >::isOrdered () const
| Determines if this triangulation is ordered; that is, if tetrahedron vertices are labelled so that all gluing permutations are order-preserving on the tetrahedron faces. More...

## Algebraic Properties

const AbelianGroup & | regina::Triangulation< 3 >::homologyRel () const
| Returns the relative first homology group with respect to the boundary for this triangulation. More...
const AbelianGroup & | regina::Triangulation< 3 >::homologyBdry () const
| Returns the first homology group of the boundary for this triangulation. More...
const AbelianGroup & | regina::Triangulation< 3 >::homologyH2 () const
| Returns the second homology group for this triangulation. More...
unsigned long | regina::Triangulation< 3 >::homologyH2Z2 () const
| Returns the second homology group with coefficients in Z_2 for this triangulation. More...
Cyclotomic | regina::Triangulation< 3 >::turaevViro (unsigned long r, bool parity=true, TuraevViroAlg alg=TV_DEFAULT, ProgressTracker *tracker=0) const
| Computes the given Turaev-Viro state sum invariant of this 3-manifold using exact arithmetic. More...
double | regina::Triangulation< 3 >::turaevViroApprox (unsigned long r, unsigned long whichRoot=1, TuraevViroAlg alg=TV_DEFAULT) const
| Computes the given Turaev-Viro state sum invariant of this 3-manifold using a fast but inexact floating-point approximation. More...
const TuraevViroSet & | regina::Triangulation< 3 >::allCalculatedTuraevViro () const
| Returns the cache of all Turaev-Viro state sum invariants that have been calculated for this 3-manifold. More...

## Normal Surfaces and Angle Structures

bool | regina::Triangulation< 3 >::isZeroEfficient ()
| Determines if this triangulation is 0-efficient. More...
bool | regina::Triangulation< 3 >::knowsZeroEfficient () const
| Is it already known whether or not this triangulation is 0-efficient? See isZeroEfficient() for further details. More...
bool | regina::Triangulation< 3 >::hasSplittingSurface ()
| Determines whether this triangulation has a normal splitting surface. More...
bool | regina::Triangulation< 3 >::knowsSplittingSurface () const
| Is it already known whether or not this triangulation has a splitting surface? See hasSplittingSurface() for further details. More...
NormalSurface * | regina::Triangulation< 3 >::hasNonTrivialSphereOrDisc ()
| Searches for a non-vertex-linking normal sphere or disc within this triangulation. More...
NormalSurface * | regina::Triangulation< 3 >::hasOctagonalAlmostNormalSphere ()
| Searches for an octagonal almost normal 2-sphere within this triangulation. More...
const AngleStructure * | regina::Triangulation< 3 >::findStrictAngleStructure () const
| Searches for a strict angle structure on this triangulation. More...
bool | regina::Triangulation< 3 >::hasStrictAngleStructure () const
| Determines whether this triangulation supports a strict angle structure. More...
bool | regina::Triangulation< 3 >::knowsStrictAngleStructure () const
| Is it already known (or trivial to determine) whether or not this triangulation supports a strict angle structure? See hasStrictAngleStructure() for further details. More...

## Skeletal Transformations

void | regina::Triangulation< 3 >::maximalForestInBoundary (std::set< Edge< 3 > * > &edgeSet, std::set< Vertex< 3 > * > &vertexSet) const
| Produces a maximal forest in the 1-skeleton of the triangulation boundary. More...
void | regina::Triangulation< 3 >::maximalForestInSkeleton (std::set< Edge< 3 > * > &edgeSet, bool canJoinBoundaries=true) const
| Produces a maximal forest in the triangulation's 1-skeleton. More...
bool | regina::Triangulation< 3 >::intelligentSimplify ()
| Attempts to simplify the triangulation using fast and greedy heuristics. More...
bool | regina::Triangulation< 3 >::simplifyToLocalMinimum (bool perform=true)
| Uses all known simplification moves to reduce the triangulation monotonically to some local minimum number of tetrahedra. More...
bool | regina::Triangulation< 3 >::simplifyExhaustive (int height=1, unsigned nThreads=1, ProgressTrackerOpen *tracker=0)
| Attempts to simplify this triangulation using a slow but exhaustive search through the Pachner graph. More...
template<typename Action , typename... Args>
bool | regina::Triangulation< 3 >::retriangulate (int height, unsigned nThreads, ProgressTrackerOpen *tracker, Action &&action, Args &&... args) const
| Explores all triangulations that can be reached from this via Pachner moves, without exceeding a given number of additional tetrahedra. More...
bool | regina::Triangulation< 3 >::threeTwoMove (Edge< 3 > *e, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 3-2 move about the given edge. More...
bool | regina::Triangulation< 3 >::twoThreeMove (Triangle< 3 > *t, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 2-3 move about the given triangle. More...
bool | regina::Triangulation< 3 >::oneFourMove (Tetrahedron< 3 > *t, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 1-4 move upon the given tetrahedron. More...
bool | regina::Triangulation< 3 >::fourFourMove (Edge< 3 > *e, int newAxis, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 4-4 move about the given edge. More...
bool | regina::Triangulation< 3 >::twoZeroMove (Edge< 3 > *e, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 2-0 move about the given edge of degree 2. More...
bool | regina::Triangulation< 3 >::twoZeroMove (Vertex< 3 > *v, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 2-0 move about the given vertex of degree 2. More...
bool | regina::Triangulation< 3 >::twoOneMove (Edge< 3 > *e, int edgeEnd, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a 2-1 move about the given edge. More...
bool | regina::Triangulation< 3 >::openBook (Triangle< 3 > *t, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a book opening move about the given triangle. More...
bool | regina::Triangulation< 3 >::closeBook (Edge< 3 > *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 | regina::Triangulation< 3 >::shellBoundary (Tetrahedron< 3 > *t, bool check=true, bool perform=true)
| Checks the eligibility of and/or performs a boundary shelling move on the given tetrahedron. More...
bool | regina::Triangulation< 3 >::collapseEdge (Edge< 3 > *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 | regina::Triangulation< 3 >::reorderTetrahedraBFS (bool reverse=false)
| Reorders the tetrahedra of this triangulation using a breadth-first search, so that small-numbered tetrahedra are adjacent to other small-numbered tetrahedra. More...
bool | regina::Triangulation< 3 >::order (bool forceOriented=false)
| Relabels tetrahedron vertices in this triangulation to give an ordered triangulation, if possible. More...

## Decompositions

long | regina::Triangulation< 3 >::connectedSumDecomposition (Packet *primeParent=0, bool setLabels=true)
| Splits this triangulation into its connected sum decomposition. More...
bool | regina::Triangulation< 3 >::isThreeSphere () const
| Determines whether this is a triangulation of a 3-sphere. More...
bool | regina::Triangulation< 3 >::knowsThreeSphere () const
| Is it already known (or trivial to determine) whether or not this is a triangulation of a 3-sphere? See isThreeSphere() for further details. More...
bool | regina::Triangulation< 3 >::isBall () const
| Determines whether this is a triangulation of a 3-dimensional ball. More...
bool | regina::Triangulation< 3 >::knowsBall () const
| Is it already known (or trivial to determine) whether or not this is a triangulation of a 3-dimensional ball? See isBall() for further details. More...
Packet * | regina::Triangulation< 3 >::makeZeroEfficient ()
| Converts this into a 0-efficient triangulation of the same underlying 3-manifold. More...
bool | regina::Triangulation< 3 >::isSolidTorus () const
| Determines whether this is a triangulation of the solid torus; that is, the unknot complement. More...
bool | regina::Triangulation< 3 >::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 | regina::Triangulation< 3 >::isIrreducible () const
| Determines whether the underlying 3-manifold (which must be closed) is irreducible. More...
bool | regina::Triangulation< 3 >::knowsIrreducible () const
| Is it already known (or trivial to determine) whether or not the underlying 3-manifold is irreducible? See isIrreducible() for further details. More...
bool | regina::Triangulation< 3 >::hasCompressingDisc () const
| Searches for a compressing disc within the underlying 3-manifold. More...
bool | regina::Triangulation< 3 >::knowsCompressingDisc () const
| Is it already known (or trivial to determine) whether or not the underlying 3-manifold contains a compressing disc? See hasCompressingDisc() for further details. More...
bool | regina::Triangulation< 3 >::isHaken () const
| Determines whether the underlying 3-manifold (which must be closed and orientable) is Haken. More...
bool | regina::Triangulation< 3 >::knowsHaken () const
| Is it already known (or trivial to determine) whether or not the underlying 3-manifold is Haken? See isHaken() for further details. More...
bool | regina::Triangulation< 3 >::hasSimpleCompressingDisc () const
| Searches for a "simple" compressing disc inside this triangulation. More...
const TreeDecomposition & | regina::Triangulation< 3 >::niceTreeDecomposition () const
| Returns a nice tree decomposition of the face pairing graph of this triangulation. More...

## Subdivisions, Extensions and Covers

bool | regina::Triangulation< 3 >::idealToFinite ()
| Converts an ideal triangulation into a finite triangulation. More...
void | regina::Triangulation< 3 >::drillEdge (Edge< 3 > *e)
| Drills out a regular neighbourhood of the given edge of the triangulation. More...
void | regina::Triangulation< 3 >::puncture (Tetrahedron< 3 > *tet=0)
| Punctures this manifold by removing a 3-ball from the interior of the given tetrahedron. More...

## Building Triangulations

Tetrahedron< 3 > * | regina::Triangulation< 3 >::layerOn (Edge< 3 > *edge)
| Performs a layering upon the given boundary edge of the triangulation. More...
Tetrahedron< 3 > * | regina::Triangulation< 3 >::insertLayeredSolidTorus (unsigned long cuts0, unsigned long cuts1)
| Inserts a new layered solid torus into the triangulation. More...
void | regina::Triangulation< 3 >::insertLayeredLensSpace (unsigned long p, unsigned long q)
| Inserts a new layered lens space L(p,q) into the triangulation. More...
void | regina::Triangulation< 3 >::insertLayeredLoop (unsigned long length, bool twisted)
| Inserts a layered loop of the given length into this triangulation. More...
void | regina::Triangulation< 3 >::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 | regina::Triangulation< 3 >::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 2-sphere into this triangulation. More...
void | regina::Triangulation< 3 >::connectedSumWith (const Triangulation &other)
| Forms the connected sum of this triangulation with the given triangulation. More...
bool | regina::Triangulation< 3 >::insertRehydration (const std::string &dehydration)
| Inserts the rehydration of the given string into this triangulation. More...

## Exporting Triangulations

std::string | regina::Triangulation< 3 >::dehydrate () const
| Dehydrates this triangulation into an alphabetical string. More...
virtual std::string | regina::Triangulation< 3 >::snapPea () const
| Returns a string containing the full contents of a SnapPea data file that describes this triangulation. More...
virtual void | regina::Triangulation< 3 >::snapPea (std::ostream &out) const
| Writes the full contents of a SnapPea data file describing this triangulation to the given output stream. More...
virtual bool | regina::Triangulation< 3 >::saveSnapPea (const char *filename) const
| Writes this triangulation to the given file using SnapPea's native file format. More...
std::string | regina::Triangulation< 3 >::recogniser () const
| Returns a string that expresses this triangulation in Matveev's 3-manifold recogniser format. More...
std::string | regina::Triangulation< 3 >::recognizer () const
| A synonym for recogniser(). More...
void | regina::Triangulation< 3 >::recogniser (std::ostream &out) const
| Writes a string expressing this triangulation in Matveev's 3-manifold recogniser format to the given output stream. More...
void | regina::Triangulation< 3 >::recognizer (std::ostream &out) const
| A synonym for recognizer(std::ostream&). More...
bool | regina::Triangulation< 3 >::saveRecogniser (const char *filename) const
| Writes this triangulation to the given file in Matveev's 3-manifold recogniser format. More...
bool | regina::Triangulation< 3 >::saveRecognizer (const char *filename) const
| A synonym for saveRecogniser(). More...

## Importing Triangulations

class | regina::Face< 3, 3 >
class | regina::detail::SimplexBase< 3 >
class | regina::detail::TriangulationBase< 3 >
class | regina::XMLTriangulationReader< 3 >
static Triangulation< 3 > * | regina::Triangulation< 3 >::enterTextTriangulation (std::istream &in, std::ostream &out)
| Allows the user to interactively enter a triangulation in plain text. More...
static Triangulation< 3 > * | regina::Triangulation< 3 >::rehydrate (const std::string &dehydration)
| Rehydrates the given alphabetical string into a new triangulation. More...
static Triangulation< 3 > * | regina::Triangulation< 3 >::fromSnapPea (const std::string &snapPeaData)
| Extracts the tetrahedron gluings from a string that contains the full contents of a SnapPea data file. More...
static XMLPacketReader * | regina::Triangulation< 3 >::xmlReader (Packet *parent, XMLTreeResolver &resolver)
virtual Packet * | regina::Triangulation< 3 >::internalClonePacket (Packet *parent) const
| Makes a newly allocated copy of this packet. More...
virtual void | regina::Triangulation< 3 >::writeXMLPacketData (std::ostream &out) const
| Writes a chunk of XML containing the data for this packet only. More...

## Detailed Description

Details for implementing triangulations of 3-manifolds.

## Typedef Documentation

## EdgeIterator

typedef FaceList<3, 1>::Iterator regina::Triangulation< 3 >::EdgeIterator

Used to iterate through edges.

## NBoundaryComponent

typedef BoundaryComponent<3> regina::NBoundaryComponent

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NBoundaryComponent, you should use the real class name BoundaryComponent<3>.

## NComponent

typedef Component<3> regina::NComponent

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NComponent, you should use the real class name Component<3>.

## NEdge

typedef Face<3, 1> regina::NEdge

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NEdge, you should use either the new alias Edge<3>, or the full class name Face<3, 1>.

## NEdgeEmbedding

typedef FaceEmbedding<3, 1> regina::NEdgeEmbedding

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NEdgeEmbedding, you should use either the new alias EdgeEmbedding<3>, or the full class name FaceEmbedding<3, 1>.

## NTetrahedron

typedef Simplex<3> regina::NTetrahedron

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NTetrahedron, you should use the new alias Simplex<3> (or, if you prefer, the full class name Face<3, 3>).

## NTriangle

typedef Face<3, 2> regina::NTriangle

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NTriangle, you should use either the new alias Triangle<3>, or the full class name Face<3, 2>.

## NTriangleEmbedding

typedef FaceEmbedding<3, 2> regina::NTriangleEmbedding

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NTriangleEmbedding, you should use either the new alias TriangleEmbedding<3>, or the full class name FaceEmbedding<3, 2>.

## NTriangulation

typedef Triangulation<3> regina::NTriangulation

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NTriangulation, you should use the templated class name Triangulation<3>.

## NVertex

typedef Face<3, 0> regina::NVertex

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NVertex, you should use either the new alias Vertex<3>, or the full class name Face<3, 0>.

## NVertexEmbedding

typedef FaceEmbedding<3, 0> regina::NVertexEmbedding

Deprecated typedef for backward compatibility.

This typedef will be removed in a future release of Regina.

Deprecated:
  Instead of the old typedef NVertexEmbedding, you should use either the new alias VertexEmbedding<3>, or the full class name FaceEmbedding<3, 0>.

## TetrahedronIterator

typedef std::vector<Tetrahedron<3>*>::const_iterator regina::Triangulation< 3 >::TetrahedronIterator

A dimension-specific alias for SimplexIterator, used to iterate through tetrahedra.

## TriangleIterator

typedef FaceList<3, 2>::Iterator regina::Triangulation< 3 >::TriangleIterator

Used to iterate through triangles.

## TuraevViroSet

typedef std::map<std::pair<unsigned long, bool>, Cyclotomic> regina::Triangulation< 3 >::TuraevViroSet

A map from (r, parity) pairs to Turaev-Viro invariants, as described by turaevViro().

## VertexIterator

typedef FaceList<3, 0>::Iterator regina::Triangulation< 3 >::VertexIterator

Used to iterate through vertices.

## Enumeration Type Documentation

## LinkType

enum regina::Face< 3, 0 >::LinkType

Categorises the possible links of a vertex into a small number of common types.

Here a vertex link is considered only up to its topology (not the combinatorics of its triangulation).

See also
  link

Enumerator
SPHERE | Specifies a vertex link that is a sphere. In other words, the vertex is internal.
DISC | Specifies a vertex link that is a disc. In other words, the vertex lies on a real boundary component.
TORUS | Specifies a vertex link that is a torus. In other words, this is an ideal vertex representing a torus cusp.
KLEIN_BOTTLE | Specifies a vertex link that is a Klein bottle. In other words, this is an ideal vertex representing a Klein bottle cusp.
NON_STANDARD_CUSP | Specifies a vertex link that is closed and is not a sphere, torus or Klein bottle. In other words, this is an ideal vertex but not one of the standard ideal vertex types.
INVALID | Specifies a vertex link that has boundary and is not a disc. In other words, this vertex makes the triangulation invalid.

## TuraevViroAlg

enum regina::TuraevViroAlg

Represents the various algorithms available for computing Turaev-Viro invariants.

Enumerator
TV_DEFAULT | The default algorithm. Here Regina will choose whichever algorithm it thinks (rightly or wrongly) is most appropriate.
TV_BACKTRACK | An optimised backtracking algorithm. This enumerates edge colourings and sums their corresponding weights. This can be slow in general (since there could be exponentially many edge colourings), but it has very small memory usage.
TV_TREEWIDTH | A treewidth-based algorithm. This uses dynamic programming over a tree decomposition of the face pairing graph. This can be fast for triangulations whose face pairing graphs have small treewidth, but it may require extremely large amounts of memory.

TV_NAIVE

An unoptimised backtracking algorithm.

Like TV_BACKTRACK, this enumerates edge colourings and sums weights. However, the implementation is more naive.

Warning
  This algorithm should only be used for comparison and experimentation. Due to its slow performance, it is not suitable for "real" applications.

## Type

enum regina::Face< 3, 2 >::Type

The type of a triangle, which indicates how the vertices and edges of the triangle are identified together.

Here the vertices of a triangle are considered unlabelled (so a relabelling will not change the triangle type).

See also
  type

Enumerator
UNKNOWN_TYPE | Indicates that the triangle type has not yet been determined.
TRIANGLE | Specifies a triangle with no identified vertices or edges.
SCARF | Specifies a triangle with two identified vertices.
PARACHUTE | Specifies a triangle with three identified vertices.
CONE | Specifies a triangle with two edges identified to form a cone.
MOBIUS | Specifies a triangle with two edges identified to form a mobius band.
HORN | Specifies a triangle with two edges identified to form a cone with all three vertices identified.
DUNCEHAT | Specifies a triangle with all three edges identified, some via orientable and some via non-orientable gluings.
L31 | Specifies a triangle with all three edges identified using non-orientable gluings. Note that this forms a spine for the Lens space L(3,1).

## Function Documentation

## adjacentFace()

int regina::Face< 3, 3 >::adjacentFace | ( | int | face | ) | const

inline

A dimension-specific alias for adjacentFacet().

See adjacentFacet() for further information.

## adjacentTetrahedron()

Simplex< 3 > * regina::Face< 3, 3 >::adjacentTetrahedron | ( | int | face | ) | const

inline

A dimension-specific alias for adjacentSimplex().

See adjacentSimplex() for further information.

## allCalculatedTuraevViro()

const Triangulation< 3 >::TuraevViroSet & regina::Triangulation< 3 >::allCalculatedTuraevViro | ( |  | ) | const

inline

Returns the cache of all Turaev-Viro state sum invariants that have been calculated for this 3-manifold.

This cache is updated every time turaevViro() is called, and is emptied whenever the triangulation is modified.

Turaev-Viro invariants are identified by an (r, parity) pair as described in the turaevViro() documentation. The cache is just a set that maps (r, parity) pairs to the corresponding invariant values.

For even values of r, the parity is ignored when calling turaevViro() (since the even and odd versions of the invariant contain essentially the same information). Therefore, in this cache, all even values of r will have the corresponding parities set to `false`.

Note
  All invariants in this cache are now computed using exact arithmetic, as elements of a cyclotomic field. This is a change from Regina 4.96 and earlier, which computed floating-point approximations instead.

Python:\n Not present.

Returns
  the cache of all Turaev-Viro invariants that have already been calculated.

See also
  turaevViro

## buildLink()

const Triangulation< 2 > * regina::Face< 3, 0 >::buildLink | ( |  | ) | const

inline

Returns a full 2-manifold triangulation describing the link of this vertex.

This routine is fast (it uses a pre-computed triangulation if possible). The downside is that the triangulation is read-only, and does not contain any information on how the triangles in the link correspond to tetrahedra in the original triangulation (though this is easily deduced; see below). If you want a writable triangulation, or one with this extra information, then call buildLinkDetail() instead.

The triangulation of the vertex link is built as follows. Let i lie between 0 and degree()-1 inclusive, let tet represent `embedding(i).tetrahedron()`, and let v represent `embedding(i).vertex()`. Then `buildLink()->triangle(i)` is the triangle in the vertex link that "slices off" vertex v from tetrahedron tet. In other words, `buildLink()->triangle(i)` in the vertex link is parallel to triangle `tet->triangle(v)` in the surrounding 3-manifold triangulation.

The vertices of each triangle in the vertex link are numbered as follows. Following the discussion above, suppose that `buildLink()->triangle(i)` sits within `tet` and is parallel to `tet->triangle(v)`. Then vertices 0,1,2 of the triangle in the link will be parallel to vertices 0,1,2 of the corresponding Triangle<3>. The permutation `tet->triangleMapping(v)` will map vertices 0,1,2 of the triangle in the link to the corresponding vertices of `tet` (those opposite `v`), and will map 3 to `v` itself.

This Vertex<3> object will retain ownership of the triangulation that is returned. If you wish to edit the triangulation, you should make a new clone and edit the clone instead.

Python:\n Since Python does not distinguish between const and
  non-const, this routine will make a deep copy of the vertex link. You are free to modify the triangulation that is returned.

Returns
  the read-only triangulated link of the vertex.

## buildLinkDetail()

Triangulation<2>* regina::Face< 3, 0 >::buildLinkDetail | ( | bool | labels = `true`,
|  | Isomorphism< 3 > ** | inclusion = `0`
| ) |  | const

Returns a full 2-manifold triangulation describing the link of this vertex.

This routine is heavyweight (it computes a new triangulation each time). The benefit is that the triangulation is writeable, and optionally contain detailed information on how the triangles in the link correspond to tetrahedra in the original triangulation. If you do not need this extra information, consider using the faster buildLink() instead.

See the buildLink() documentation for an explanation of exactly how the triangulation will be constructed.

If labels is passed as `true`, each triangle of the new vertex link will be given a text description of the form `t (v)`, where `t` is the index of the tetrahedron the triangle is from, and `v` is the vertex of that tetrahedron that this triangle links.

If inclusion is non-null (i.e., it points to some Isomorphism<3> pointer p), then it will be modified to point to a new Isomorphism<3> that describes in detail how the individual triangles of the link sit within tetrahedra of the original triangulation. Specifically, after this routine is called, `p->tetImage(i)` will indicate which tetrahedron tet of the 3-manifold triangulation contains the ith triangle of the link. Moreover, `p->facePerm(i)` will indicate exactly where the ith triangle sits within tet: it will send 3 to the vertex of t that the triangle links, and it will send 0,1,2 to the vertices of tet that are parallel to vertices 0,1,2 of this triangle.

The triangulation that is returned, as well as the isomorphism if one was requested, will be newly allocated. The caller of this routine is responsible for destroying these objects.

Strictly speaking, this is an abuse of the Isomorphism<3> class (the domain is a triangulation of the wrong dimension, and the map is not 1-to-1 into the range tetrahedra). We use it anyway, but you should not attempt to call any high-level routines (such as Isomorphism<3>::apply).

Python:\n The second (isomorphism) argument is not present.
  Instead this routine returns a pair (triangulation, isomorphism). As a side-effect, the isomorphism will always be constructed (i.e., it is not optional).

Python:\n Since Python does not distinguish between const and
  non-const, this routine will make a deep copy of the vertex link. You are free to modify the triangulation that is returned.

Returns
  a newly constructed triangulation of the link of this vertex.

## closeBook()

bool regina::Triangulation< 3 >::closeBook | ( | Edge< 3 > * | 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:

- the edge e is a boundary edge;
- the two boundary triangles that it joins are distinct;
- the two vertices opposite e in each of these boundary triangles are valid and distinct;
- if edges e1 and e2 of one boundary triangle are to be folded onto edges f1 and f2 of the other boundary triangle respectively, then we do not have both e1 = e2 and f1 = f2.

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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## collapseEdge()

bool regina::Triangulation< 3 >::collapseEdge | ( | Edge< 3 > * | 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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## connectedSumDecomposition()

long regina::Triangulation< 3 >::connectedSumDecomposition | ( | Packet * | primeParent = `0`,
|  | bool | setLabels = `true`
| ) |  |

Splits this triangulation into its connected sum decomposition.

The individual prime 3-manifold triangulations that make up this decomposition will be inserted as children of the given parent packet. The original triangulation will be left unchanged.

For non-orientable triangulations, this routine is only guaranteed to succeed if the original manifold contains no embedded two-sided projective planes. If the manifold does contain embedded two-sided projective planes, then this routine might still succeed but it might fail; however, such a failure will always be detected, and in such a case this routine will return -1 instead (without building any prime summands at all).

Note that this routine is currently only available for closed triangulations; see the list of preconditions for full details.

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 3-sphere then no prime summand triangulations will be created at all, and this routine will return 0.

The underlying algorithm appears in "A new approach to crushing 3-manifold triangulations", Discrete and Computational Geometry 52:1 (2014), pp. 116-139. This algorithm is based on the Jaco-Rubinstein 0-efficiency algorithm, and works in both orientable and non-orientable settings.

Warning
  Users are strongly advised to check the return value if embedded two-sided projective planes are a possibility, since in such a case this routine might fail (as explained above). Note however that this routine might still succeed, and so success is not a proof that no embedded two-sided projective planes exist.
  The algorithms used in this routine rely on normal surface theory and so can be very slow for larger triangulations. For 3-sphere testing, see the routine isThreeSphere() which uses faster methods where possible.

Precondition
  This triangulation is valid, closed and connected.

Parameters

  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.

Returns
  the number of prime summands created, 0 if this triangulation is a 3-sphere, or -1 if this routine failed because this is a non-orientable triangulation with embedded two-sided projective planes.

## connectedSumWith()

void regina::Triangulation< 3 >::connectedSumWith | ( | const Triangulation< 3 > & | other | ) |

Forms the connected sum of this triangulation with the given triangulation.

This triangulation will be altered directly.

If this and the given triangulation are both oriented, then the result will be oriented also, and the connected sum will respect these orientations.

This and/or the given triangulation may be bounded or ideal, or even invalid; in all cases the connected sum will be formed correctly. Note, however, that the result might possibly contain internal vertices (even if the original triangulations do not).

Precondition
  This triangulation is connected and non-empty.

Parameters

  other | the triangulation to sum with this.

## countFaces()

template<int subdim>

size_t regina::Component< 3 >::countFaces | ( |  | ) | const

Returns the number of subdim-faces in this component.

Precondition
  The template argument subdim is between 0 and 2 inclusive.

Python:\n Python does not support templates. Instead,
  Python users should call this function in the form `countFaces(subdim)`; that is, the template parameter subdim becomes the first argument of the function.

Returns
  the number of subdim-faces.

## dehydrate()

std::string regina::Triangulation< 3 >::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 n-tetrahedron triangulation consists of approximately (but not precisely) 5n/2 lower-case letters.

Dehydration strings come with some restrictions:

- They rely on the triangulation being "canonical" in some combinatorial sense. This is not enforced here; instead a combinatorial isomorphism is applied to make the triangulation canonical, and this isomorphic triangulation is dehydrated instead. Note that the original triangulation is not changed.
- They require the triangulation to be connected.
- They require the triangulation to have no boundary triangles (though ideal triangulations are fine).
- They can only support triangulations with at most 25 tetrahedra.

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 3-Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.

Returns
  a dehydrated representation of this triangulation (or an isomorphic variant of this triangulation), or the empty string if dehydration is not possible because the triangulation is disconnected, has boundary triangles or contains too many tetrahedra.

See also
  rehydrate
  insertRehydration

## dependsOnParent()

bool regina::Triangulation< 3 >::dependsOnParent | ( |  | ) | const

inline virtual

Determines if this packet depends upon its parent.

This is true if the parent cannot be altered without invalidating or otherwise upsetting this packet.

Returns
  `true` if and only if this packet depends on its parent.

Implements regina::Packet.

Reimplemented in regina::SnapPeaTriangulation.

## drillEdge()

void regina::Triangulation< 3 >::drillEdge | ( | Edge< 3 > * | 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.

Warning
  The second barycentric subdivision will multiply the number of tetrahedra by 576; as a result this routine might be slow, and the number of tetrahedra at the end might be large (even taking the simplification into account).

Parameters

  e | the edge to drill out.

## enterTextTriangulation()

static Triangulation<3>* regina::Triangulation< 3 >::enterTextTriangulation | ( | std::istream & | in,
|  | std::ostream & | out
| ) |  |

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.

Python:\n This routine is a member of class Engine.
  It takes no parameters; in and out are always assumed to be standard input and standard output respectively.

Parameters

  in | the input stream from which text will be read.
  out | the output stream to which prompts will be written.

Returns
  the triangulation entered in by the user.

## eulerChar()

long regina::BoundaryComponent< 3 >::eulerChar | ( |  | ) | const

inline

Returns the Euler characteristic of this boundary component.

If this boundary component is ideal, the Euler characteristic of the link of the corresponding ideal vertex is returned.

Returns
  the Euler characteristic.

## eulerCharManifold()

long regina::Triangulation< 3 >::eulerCharManifold | ( |  | ) | const

Returns the Euler characteristic of the corresponding compact 3-manifold.

Instead of simply calculating V-E+F-T, this routine also:

- treats ideal vertices as surface boundary components (i.e., effectively truncates them);
- truncates invalid boundary vertices (i.e., boundary vertices whose links are not discs);
- truncates the projective plane cusps at the midpoints of invalid edges (edges identified with themselves in reverse).

For ideal triangulations, this routine therefore computes the proper Euler characteristic of the manifold (unlike eulerCharTri(), which does not).

For triangulations whose vertex links are all spheres or discs, this routine and eulerCharTri() give identical results.

Returns
  the Euler characteristic of the corresponding compact manifold.

## face()

template<int subdim>

Face<3, subdim>* regina::Component< 3 >::face | ( | size_t | index | ) | const

Returns the requested subdim-face in this component.

Note that the index of a face in the component need not be the index of the same face in the overall triangulation.

Precondition
  The template argument subdim is between 0 and 2 inclusive.

Python:\n Python does not support templates. Instead,
  Python users should call this function in the form `face(subdim, index)`; that is, the template parameter subdim becomes the first argument of the function.

Parameters

  index | the index of the desired face, ranging from 0 to countFaces<subdim>()-1 inclusive.

Returns
  the requested face.

## faces()

template<int subdim>

const std::vector<Face<3, subdim>*>& regina::Component< 3 >::faces | ( |  | ) | const

Returns a reference to the list of all subdim-faces in this component.

Precondition
  The template argument subdim is between 0 and 2 inclusive.

Python:\n Python users should call this function in the
  form `faces(subdim)`. It will then return a Python list containing all the subdim-faces of the triangulation.

Returns
  the list of all subdim-faces.

## findStrictAngleStructure()

const AngleStructure* regina::Triangulation< 3 >::findStrictAngleStructure | ( |  | ) | const

Searches for a strict angle structure on this triangulation.

Recall that a strict angle structure is one in which every angle is strictly between 0 and π. If a strict angle structure does exist, then this routine is guaranteed to find one.

The underlying algorithm runs a single linear program (it does not enumerate all vertex angle structures). This means that it is likely to be fast even for large triangulations.

If you are only interested in whether a strict angle structure exists (i.e., you are not interested in the specific angles themselves), then you may call hasStrictAngleStructure() instead.

The angle structure returned (if any) is cached internally alongside this triangulation. This means that, as long as the triangulation does not change, subsequent calls to findStrictAngleStructure() will return identical pointers and will be essentially instantaneous.

If the triangulation changes however, then the cached angle structure will be deleted. This means that you should not store the returned pointer for later use; instead you should just call findStrictAngleStructure() again.

Returns
  a strict angle structure on this triangulation, or 0 if none exists.

## fourFourMove()

bool regina::Triangulation< 3 >::fourFourMove | ( | Edge< 3 > * | e,
|  | int | newAxis,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 4-4 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 non-boundary, 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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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 Edge<3>::embedding(0,...,3); call these tetrahedra 0, 1, 2 and
  1. If newAxis is 0, the new axis will separate tetrahedra 0 and 1 from 2 and 3. If newAxis is 1, the new axis will separate tetrahedra 1 and 2 from 3 and 0.

  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`).

Returns
  If check is `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`.

## fromSnapPea()

static Triangulation<3>* regina::Triangulation< 3 >::fromSnapPea | ( | const std::string & | snapPeaData | ) |

static

Extracts the tetrahedron gluings from a string that contains the full contents of a SnapPea data file.

All other SnapPea-specific information (such as peripheral curves) will be ignored, since Regina's Triangulation<3> class does not track such information itself.

If you wish to preserve all SnapPea-specific information from the data file, you should work with the SnapPeaTriangulation class instead (which uses the SnapPea kernel directly, and can therefore store anything that SnapPea can).

If you wish to read a triangulation from a SnapPea file, you should likewise call the SnapPeaTriangulation constructor, giving the filename as argument. This will read all SnapPea-specific information (as described above), and also avoids constructing an enormous intermediate string.

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.

Warning
  This routine is "lossy", in that drops SnapPea-specific information (as described above). Unless you specifically need an Triangulation<3> (not an SnapPeaTriangulation) or you need to avoid calling routines from the SnapPea kernel, it is highly recommended that you create a SnapPeaTriangulation from the given file contents instead. See the string-based SnapPeaTriangulation constructor for how to do this.

Parameters

  snapPeaData | a string containing the full contents of a SnapPea data file.

Returns
  a new triangulation extracted from the given data, or 0 on error.

## hasCompressingDisc()

bool regina::Triangulation< 3 >::hasCompressingDisc | ( |  | ) | const

Searches for a compressing disc within the underlying 3-manifold.

Let M be the underlying 3-manifold 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:

- If the triangulation is orientable and 1-vertex, it will use the linear programming and crushing machinery outlined in "Computing closed essential surfaces in knot complements", Burton, Coward and Tillmann, SCG '13, p405-414, 2013. This is often extremely fast, even for triangulations with many tetrahedra.
- If the triangulation is non-orientable or has multiple vertices then it will run a full enumeration of vertex normal surfaces, as described in "Algorithms for the complete decomposition of a closed 3-manifold", Jaco and Tollefson, Illinois J. Math. 39 (1995), 358-406. As the number of tetrahedra grows, this can become extremely slow.

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`.

Precondition
  This triangulation is valid and is not ideal.
  The underlying 3-manifold is irreducible.

Warning
  This routine can be infeasibly slow for large triangulations (particularly those that are non-orientable or have multiple vertices), since it may need to perform a full enumeration of vertex normal surfaces, and since it might perform "large" operations on these surfaces such as cutting along them. See hasSimpleCompressingDisc() for a "heuristic shortcut" that is faster but might not give a definitive answer.

Returns
  `true` if the underlying 3-manifold contains a compressing disc, or `false` if it does not.

## hasNegativeIdealBoundaryComponents()

bool regina::Triangulation< 3 >::hasNegativeIdealBoundaryComponents | ( |  | ) | const

inline

Determines if this triangulation contains any ideal boundary components with negative Euler characteristic.

Returns
  `true` if and only if there is at least one such boundary component.

## hasNonTrivialSphereOrDisc()

NormalSurface* regina::Triangulation< 3 >::hasNonTrivialSphereOrDisc | ( |  | ) |

Searches for a non-vertex-linking 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.

Warning
  This routine may, in some scenarios, temporarily modify the packet tree by creating and then destroying a normal surface list.

Returns
  a newly allocated non-vertex-linking normal sphere or disc, or 0 if none exists.

## hasOctagonalAlmostNormalSphere()

NormalSurface* regina::Triangulation< 3 >::hasOctagonalAlmostNormalSphere | ( |  | ) |

Searches for an octagonal almost normal 2-sphere 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.

Precondition
  This triangulation is valid, closed, orientable, connected, and 0-efficient. These preconditions are almost certainly more restrictive than they need to be, but we stay safe for now.

Warning
  This routine may, in some scenarios, temporarily modify the packet tree by creating and then destroying a normal surface list.

Returns
  a newly allocated non-vertex-linking normal sphere or disc, or 0 if none exists.

## hasSimpleCompressingDisc()

bool regina::Triangulation< 3 >::hasSimpleCompressingDisc | ( |  | ) | const

Searches for a "simple" compressing disc inside this triangulation.

Let M be the underlying 3-manifold 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 1-tetrahedron 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 3-manifold 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 Weber-Seifert dodecahedral space is non-Haken", Benjamin A. Burton, J. Hyam Rubinstein and Stephan Tillmann, Trans. Amer. Math. Soc. 364:2 (2012), pp. 911-932.

Warning
  The definition of "simple" is subject to change in future releases of Regina. That is, this routine may be expanded over time to identify more types of compressing discs (thus making it more useful as a "heuristic shortcut").

Precondition
  This triangulation is valid and is not ideal.

Returns
  `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).

## hasSplittingSurface()

bool regina::Triangulation< 3 >::hasSplittingSurface | ( |  | ) |

Determines whether this triangulation has a normal splitting surface.

See NormalSurface::isSplitting() for details regarding normal splitting surfaces.

Precondition
  This triangulation is connected. If the triangulation is not connected, this routine will still return a result but that result will be unreliable.

Returns
  `true` if and only if this triangulation has a normal splitting surface.

## hasStrictAngleStructure()

bool regina::Triangulation< 3 >::hasStrictAngleStructure | ( |  | ) | const

inline

Determines whether this triangulation supports a strict angle structure.

Recall that a strict angle structure is one in which every angle is strictly between 0 and π.

This routine is equivalent to calling findStrictAngleStructure() and testing whether the return value is non-null.

The underlying algorithm runs a single linear program (it does not enumerate all vertex angle structures). This means that it is likely to be fast even for large triangulations.

Returns
  `true` if a strict angle structure exists on this triangulation, or 0 if not.

## hasTwoSphereBoundaryComponents()

bool regina::Triangulation< 3 >::hasTwoSphereBoundaryComponents | ( |  | ) | const

inline

Determines if this triangulation contains any two-sphere boundary components.

Returns
  `true` if and only if there is at least one two-sphere boundary component.

## homologyBdry()

const AbelianGroup& regina::Triangulation< 3 >::homologyBdry | ( |  | ) | 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, homologyBdry() 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.

Precondition
  This triangulation is valid.

Returns
  the first homology group of the boundary.

## homologyH2()

const AbelianGroup& regina::Triangulation< 3 >::homologyH2 | ( |  | ) | 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, homologyH2() should be called again; this will be instantaneous if the group has already been calculated.

Precondition
  This triangulation is valid.

Returns
  the second homology group.

## homologyH2Z2()

unsigned long regina::Triangulation< 3 >::homologyH2Z2 | ( |  | ) | const

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.

Precondition
  This triangulation is valid.

Returns
  the number of Z_2 terms in the second homology group with coefficients in Z_2.

## homologyRel()

const AbelianGroup& regina::Triangulation< 3 >::homologyRel | ( |  | ) | 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, homologyRel() should be called again; this will be instantaneous if the group has already been calculated.

Precondition
  This triangulation is valid.

Returns
  the relative first homology group with respect to the boundary.

## idealToFinite()

bool regina::Triangulation< 3 >::idealToFinite | ( |  | ) |

Converts an ideal triangulation into a finite triangulation.

All ideal or invalid 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().

Warning
  Currently, this routine subdivides all tetrahedra as if all vertices (not just some) were ideal. This may lead to more tetrahedra than are necessary.
  Currently, the presence of an invalid edge will force the triangulation to be subdivided regardless of the value of parameter forceDivision. The final triangulation will still have the projective plane cusp caused by the invalid edge.

Todo:
  Optimise (long-term): Have this routine only use as many tetrahedra as are necessary, leaving finite vertices alone.

Returns
  `true` if and only if the triangulation was changed.

Author
  David Letscher

## insertAugTriSolidTorus()

void regina::Triangulation< 3 >::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 AugTriSolidTorus 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|, |-a1-b1|), ..., LST(|a3|, |b3|, |-a3-b3|).

The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.

Precondition
  gcd(a1, b1) = 1.
  gcd(a2, b2) = 1.
  gcd(a3, b3) = 1.

Parameters

  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.

## insertLayeredLensSpace()

void regina::Triangulation< 3 >::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.

Precondition
  p > q >= 0 unless (p,q) = (0,1);
  gcd(p, q) = 1.

Parameters

  p | a parameter of the desired lens space.
  q | a parameter of the desired lens space.

See also
  LayeredLensSpace

## insertLayeredLoop()

void regina::Triangulation< 3 >::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 LayeredLoop class notes.

The new tetrahedra will be inserted at the end of the list of tetrahedra in the triangulation.

Parameters

  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.

See also
  LayeredLoop

## insertLayeredSolidTorus()

Tetrahedron<3>* regina::Triangulation< 3 >::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.

Precondition
  0 <= cuts0 <= cuts1;
  cuts1 is non-zero;
  gcd(cuts0, cuts1) = 1.

Parameters

  cuts0 | the smallest of the three desired intersection numbers.
  cuts1 | the second smallest of the three desired intersection numbers.

Returns
  the tetrahedron containing the boundary torus.

See also
  LayeredSolidTorus

## insertRehydration()

bool regina::Triangulation< 3 >::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 (0-3) 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 3-Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.

Parameters

  dehydration | a dehydrated representation of the triangulation to insert. Case is irrelevant; all letters will be treated as if they were lower case.

Returns
  `true` if the insertion was successful, or `false` if the given string could not be rehydrated.

See also
  dehydrate
  rehydrate

## insertSFSOverSphere()

void regina::Triangulation< 3 >::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 2-sphere 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.

Precondition
  None of a1, a2 or a3 are 0.
  gcd(a1, b1) = 1.
  gcd(a2, b2) = 1.
  gcd(a3, b3) = 1.

Parameters

  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.

## intelligentSimplify()

bool regina::Triangulation< 3 >::intelligentSimplify | ( |  | ) |

Attempts to simplify the triangulation using fast and greedy heuristics.

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 4-4 moves, book opening moves and book closing moves.

Although intelligentSimplify() works very well most of the time, it can occasionally get stuck; in such cases you may wish to try the more powerful but (much) slower simplifyExhaustive() instead.

Warning
  The specific behaviour of this routine may well change between releases.

Todo:
  Optimise: Include random 2-3 moves to get out of wells.

Returns
  `true` if and only if the triangulation was successfully simplified. Otherwise this triangulation will not be changed.

## internalClonePacket()

Packet * regina::Triangulation< 3 >::internalClonePacket | ( | Packet * | parent | ) | const

inline protected virtual

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.

Parameters

  parent | the parent beneath which the new packet will eventually be inserted.

Returns
  the newly allocated packet.

Implements regina::Packet.

Reimplemented in regina::SnapPeaTriangulation.

## isBall()

bool regina::Triangulation< 3 >::isBall | ( |  | ) | const

Determines whether this is a triangulation of a 3-dimensional ball.

This routine is based on isThreeSphere(), which in turn combines Rubinstein's 3-sphere recognition algorithm with Jaco and Rubinstein's 0-efficiency prime decomposition algorithm.

Warning
  The algorithms used in this routine rely on normal surface theory and so can be very slow for larger triangulations (although faster tests are used where possible). The routine knowsBall() can be called to see if this property is already known or if it happens to be very fast to calculate for this triangulation.

Returns
  `true` if and only if this is a triangulation of a 3-dimensional ball.

## isClosed() [1/2]

bool regina::Component< 3 >::isClosed | ( |  | ) | const

inline

Determines if this component is closed.

This is the case if and only if it has no boundary. Note that ideal components are not closed.

Returns
  `true` if and only if this component is closed.

## isClosed() [2/2]

bool regina::Triangulation< 3 >::isClosed | ( |  | ) | const

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.

Returns
  `true` if and only if this triangulation is closed.

## isCone()

bool regina::Face< 3, 2 >::isCone | ( |  | ) |

inline

Determines whether this triangle is wrapped up to form a cone.

Note that several different triangle types (as returned by type()) can produce this result. Note also that a triangle can be both a Mobius band and a cone.

Returns
  `true` if and only if this triangle is a cone.

## isHaken()

bool regina::Triangulation< 3 >::isHaken | ( |  | ) | const

Determines whether the underlying 3-manifold (which must be closed and orientable) is Haken.

In other words, this routine determines whether the underlying 3-manifold contains an embedded closed two-sided 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.

Precondition
  This triangulation is valid, closed, orientable and connected.

Warning
  This routine could be very slow for larger triangulations.

Returns
  `true` if and only if the underlying 3-manifold is irreducible and Haken.

## isIdeal() [1/3]

bool regina::Component< 3 >::isIdeal | ( |  | ) | const

inline

Determines if this component is ideal.

This is the case if and only if it contains an ideal vertex as described by Vertex<3>::isIdeal().

Returns
  `true` if and only if this component is ideal.

## isIdeal() [2/3]

bool regina::Face< 3, 0 >::isIdeal | ( |  | ) | const

inline

Determines if this vertex is an ideal vertex.

This requires the vertex link to be closed and not a 2-sphere.

Returns
  `true` if and only if this is an ideal vertex.

## isIdeal() [3/3]

bool regina::Triangulation< 3 >::isIdeal | ( |  | ) | const

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 2-sphere. Note that the triangulation is not required to be valid.

Returns
  `true` if and only if this triangulation is ideal.

## isIrreducible()

bool regina::Triangulation< 3 >::isIrreducible | ( |  | ) | const

Determines whether the underlying 3-manifold (which must be closed) is irreducible.

In other words, this routine determines whether every embedded sphere in the underlying 3-manifold bounds a ball.

If the underlying 3-manifold is orientable, this routine will use fast crushing and branch-and-bound methods. If the underlying 3-manifold is non-orientable, it will use a (much slower) full enumeration of vertex normal surfaces.

Warning
  The algorithms used in this routine rely on normal surface theory and might be slow for larger triangulations.

Precondition
  This triangulation is valid, closed, orientable and connected.

Returns
  `true` if and only if the underlying 3-manifold is irreducible.

## isLinkClosed()

bool regina::Face< 3, 0 >::isLinkClosed | ( |  | ) | const

inline

Determines if the link of this vertex is closed.

Returns
  `true` if and only if the link of this vertex is closed.

## isMobiusBand()

bool regina::Face< 3, 2 >::isMobiusBand | ( |  | ) |

inline

Determines whether this triangle is wrapped up to form a Mobius band.

Note that several different triangle types (as returned by type()) can produce this result. Note also that a triangle can be both a Mobius band and a cone.

Returns
  `true` if and only if this triangle is a Mobius band.

## isOrdered()

bool regina::Triangulation< 3 >::isOrdered | ( |  | ) | const

Determines if this triangulation is ordered; that is, if tetrahedron vertices are labelled so that all gluing permutations are order-preserving 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.

Returns
  `true` if and only if all gluing permutations are order preserving on the tetrahedron faces.

Author
  Matthias Goerner

## isSolidTorus()

bool regina::Triangulation< 3 >::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).

Warning
  The algorithms used in this routine rely on normal surface theory and so might be very slow for larger triangulations (although faster tests are used where possible). The routine knowsSolidTorus() can be called to see if this property is already known or if it happens to be very fast to calculate for this triangulation.

Returns
  `true` if and only if this is either a real (compact) or ideal (non-compact) triangulation of the solid torus.

## isStandard() [1/2]

bool regina::Face< 3, 0 >::isStandard | ( |  | ) | const

inline

Determines if this vertex is standard.

This requires the vertex link to be a sphere, disc, torus or Klein bottle.

Returns
  `true` if and only if this vertex is standard.

## isStandard() [2/2]

bool regina::Triangulation< 3 >::isStandard | ( |  | ) | const

inline

Determines if this triangulation is standard.

This is the case if and only if every vertex is standard. See Vertex<3>::isStandard() for further details.

Returns
  `true` if and only if this triangulation is standard.

## isThreeSphere()

bool regina::Triangulation< 3 >::isThreeSphere | ( |  | ) | const

Determines whether this is a triangulation of a 3-sphere.

This routine relies upon a combination of Rubinstein's 3-sphere recognition algorithm and Jaco and Rubinstein's 0-efficiency prime decomposition algorithm.

Warning
  The algorithms used in this routine rely on normal surface theory and so can be very slow for larger triangulations (although faster tests are used where possible). The routine knowsThreeSphere() can be called to see if this property is already known or if it happens to be very fast to calculate for this triangulation.

Returns
  `true` if and only if this is a 3-sphere triangulation.

## isZeroEfficient()

bool regina::Triangulation< 3 >::isZeroEfficient | ( |  | ) |

Determines if this triangulation is 0-efficient.

A triangulation is 0-efficient if its only normal spheres and discs are vertex linking, and if it has no 2-sphere boundary components.

Returns
  `true` if and only if this triangulation is 0-efficient.

## knowsBall()

bool regina::Triangulation< 3 >::knowsBall | ( |  | ) | const

Is it already known (or trivial to determine) whether or not this is a triangulation of a 3-dimensional 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`.

Warning
  This routine does not actually tell you whether this triangulation forms a ball; it merely tells you whether the answer has already been computed (or is very easily computed).

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsCompressingDisc()

bool regina::Triangulation< 3 >::knowsCompressingDisc | ( |  | ) | const

Is it already known (or trivial to determine) whether or not the underlying 3-manifold 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`.

Warning
  This routine does not actually tell you whether the underlying 3-manifold has a compressing disc; it merely tells you whether the answer has already been computed (or is very easily computed).

Precondition
  This triangulation is valid and is not ideal.
  The underlying 3-manifold is irreducible.

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsHaken()

bool regina::Triangulation< 3 >::knowsHaken | ( |  | ) | const

Is it already known (or trivial to determine) whether or not the underlying 3-manifold 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).

Warning
  This routine does not actually tell you whether the underlying 3-manifold is Haken; it merely tells you whether the answer has already been computed (or is very easily computed).

Precondition
  This triangulation is valid, closed, orientable and connected.

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsIrreducible()

bool regina::Triangulation< 3 >::knowsIrreducible | ( |  | ) | const

Is it already known (or trivial to determine) whether or not the underlying 3-manifold 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).

Warning
  This routine does not actually tell you whether the underlying 3-manifold is irreducible; it merely tells you whether the answer has already been computed (or is very easily computed).

Precondition
  This triangulation is valid, closed, orientable and connected.

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsSolidTorus()

bool regina::Triangulation< 3 >::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`.

Warning
  This routine does not actually tell you whether this triangulation forms a solid torus; it merely tells you whether the answer has already been computed (or is very easily computed).

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsSplittingSurface()

bool regina::Triangulation< 3 >::knowsSplittingSurface | ( |  | ) | const

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).

Warning
  This routine does not actually tell you whether this triangulation has a splitting surface; it merely tells you whether the answer has already been computed.

Returns
  `true` if and only if this property is already known.

## knowsStrictAngleStructure()

bool regina::Triangulation< 3 >::knowsStrictAngleStructure | ( |  | ) | const

Is it already known (or trivial to determine) whether or not this triangulation supports a strict angle structure? See hasStrictAngleStructure() for further details.

If this property is indeed already known, future calls to findStrictAngleStructure() and hasStrictAngleStructure() will be very fast (simply returning the precalculated solution).

Warning
  This routine does not actually tell you whether the triangulation supports a strict angle structure; it merely tells you whether the answer has already been computed (or is very easily computed).

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsThreeSphere()

bool regina::Triangulation< 3 >::knowsThreeSphere | ( |  | ) | const

Is it already known (or trivial to determine) whether or not this is a triangulation of a 3-sphere? 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`.

Warning
  This routine does not actually tell you whether this triangulation forms a 3-sphere; it merely tells you whether the answer has already been computed (or is very easily computed).

Returns
  `true` if and only if this property is already known or trivial to calculate.

## knowsZeroEfficient()

bool regina::Triangulation< 3 >::knowsZeroEfficient | ( |  | ) | const

inline

Is it already known whether or not this triangulation is 0-efficient? See isZeroEfficient() for further details.

If this property is already known, future calls to isZeroEfficient() will be very fast (simply returning the precalculated value).

Warning
  This routine does not actually tell you whether this triangulation is 0-efficient; it merely tells you whether the answer has already been computed.

Returns
  `true` if and only if this property is already known.

## layerOn()

Tetrahedron<3>* regina::Triangulation< 3 >::layerOn | ( | Edge< 3 > * | edge | ) |

Performs a layering upon the given boundary edge of the triangulation.

See the Layering class notes for further details on what a layering entails.

Precondition
  The given edge is a boundary edge of this triangulation, and the two boundary triangles on either side of it are distinct.

Parameters

  edge | the boundary edge upon which to layer.

Returns
  the new tetrahedron provided by the layering.

## link()

Vertex< 3 >::LinkType regina::Face< 3, 0 >::link | ( |  | ) | const

inline

Returns a broad categorisation of the link of the vertex.

This considers topological information only, not the combinatorics of how the link is triangulated.

This routine does not require a full triangulation of the vertex link, and so can be much faster than analysing the result of buildLink().

Returns
  a broad categorisation of the vertex link.

## linkEulerChar()

long regina::Face< 3, 0 >::linkEulerChar | ( |  | ) | const

inline

Returns the Euler characteristic of the vertex link.

This routine does not require a full triangulation of the vertex link, and so can be much faster than calling buildLink().eulerChar().

Returns
  the Euler characteristic of the vertex link.

## makeZeroEfficient()

Packet* regina::Triangulation< 3 >::makeZeroEfficient | ( |  | ) |

Converts this into a 0-efficient triangulation of the same underlying 3-manifold.

A triangulation is 0-efficient if its only normal spheres and discs are vertex linking, and if it has no 2-sphere boundary components.

Note that this routine is currently only available for closed orientable triangulations; see the list of preconditions for details. The 0-efficiency algorithm of Jaco and Rubinstein is used.

If the underlying 3-manifold is prime, it can always be made 0-efficient (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 3-manifold is RP3 or S2xS1, it cannot be made 0-efficient; in this case the original triangulation will be reduced to a two-tetrahedron minimal triangulation and 0 will again be returned.

If the underlying 3-manifold is not prime, it cannot be made 0-efficient. 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.

Warning
  The algorithms used in this routine rely on normal surface theory and so can be very slow for larger triangulations.

Precondition
  This triangulation is valid, closed, orientable and connected.

Returns
  0 if the underlying 3-manifold is prime (in which case the original triangulation was modified directly), or a newly allocated connected sum decomposition if the underlying 3-manifold is composite (in which case the original triangulation was not changed).

## maximalForestInBoundary()

void regina::Triangulation< 3 >::maximalForestInBoundary | ( | std::set< Edge< 3 > * > & | edgeSet,
|  | std::set< Vertex< 3 > * > & | vertexSet
| ) |  | const

Produces a maximal forest in the 1-skeleton 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.

Python:\n Not present.

Parameters

  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.

## maximalForestInSkeleton()

void regina::Triangulation< 3 >::maximalForestInSkeleton | ( | std::set< Edge< 3 > * > & | edgeSet,
|  | bool | canJoinBoundaries = `true`
| ) |  | const

Produces a maximal forest in the triangulation's 1-skeleton.

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.

Python:\n Not present.

Parameters

  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.

## newTetrahedron() [1/2]

Tetrahedron< 3 > * regina::Triangulation< 3 >::newTetrahedron | ( |  | ) |

inline

A dimension-specific alias for newSimplex().

See newSimplex() for further information.

## newTetrahedron() [2/2]

Tetrahedron< 3 > * regina::Triangulation< 3 >::newTetrahedron | ( | const std::string & | desc | ) |

inline

A dimension-specific alias for newSimplex().

See newSimplex() for further information.

## niceTreeDecomposition()

const TreeDecomposition & regina::Triangulation< 3 >::niceTreeDecomposition | ( |  | ) | const

inline

Returns a nice tree decomposition of the face pairing graph of this triangulation.

This can (for example) be used in implementing algorithms that are fixed-parameter tractable in the treewidth of the face pairing graph.

See TreeDecomposition for further details on tree decompositions, and see TreeDecomposition::makeNice() for details on what it means to be a nice tree decomposition.

This routine is fast: it will use a greedy algorithm to find a tree decomposition with (hopefully) small width, but with no guarantees that the width of this tree decomposition is the smallest possible.

The tree decomposition will be cached, so that if this routine is called a second time (and the underlying triangulation has not been changed) then the same tree decomposition will be returned immediately.

Returns
  a nice tree decomposition of the face pairing graph of this triangulation.

## oneFourMove()

bool regina::Triangulation< 3 >::oneFourMove | ( | Tetrahedron< 3 > * | t,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 1-4 move upon the given tetrahedron.

This involves replacing one tetrahedron with four tetrahedra: each new tetrahedron runs from one face of the original tetrahedron to a new common internal degree four vertex.

This move can always be performed. The check argument is present (as for other moves), but is simply ignored (since the move is always legal). The perform argument is also present for consistency with other moves, but if it is set to `false` then this routine does nothing and returns no useful information.

Note that after performing this move, all skeletal objects (edges, components, etc.) will be reconstructed, which means any pointers to old skeletal objects (such as the argument t) can no longer be used.

Precondition
  The given tetrahedron is a tetrahedron of this triangulation.

Parameters

  t | the tetrahedron about which to perform the move.
  check | this argument is ignored, since this move is always legal (see the notes above).
  perform | `true` if we are to perform the move (defaults to `true`).

Returns
  `true` always.

## openBook()

bool regina::Triangulation< 3 >::openBook | ( | Triangle< 3 > * | 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:

- the triangle meets the boundary in precisely two edges (and thus also joins two tetrahedra);
- the vertex between these two edges is a standard boundary vertex (its link is a disc);
- the remaining edge of the triangle (which is internal to the triangulation) is valid.

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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given triangle is a triangle of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## order()

bool regina::Triangulation< 3 >::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.

Warning
  This routine may be slow, since it backtracks through all possible edge orientations until a consistent one has been found.

Parameters

  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.

Returns
  `true` if the triangulation has been successfully ordered as described above, or `false` if not.

Author
  Matthias Goerner

## puncture()

void regina::Triangulation< 3 >::puncture | ( | Tetrahedron< 3 > * | tet = `0` | ) |

Punctures this manifold by removing a 3-ball from the interior of the given tetrahedron.

If no tetrahedron is specified (i.e., the tetrahedron pointer is `null`), then the puncture will be taken from the interior of tetrahedron 0.

The puncture will not meet the boundary of the tetrahedron, so nothing will go wrong if the tetrahedron has boundary facets and/or ideal vertices. A side-effect of this, however, is that the resulting triangulation will contain additional vertices, and will almost certainly be far from minimal. It is highly recommended that you run intelligentSimplify() if you do not need to preserve the combinatorial structure of the new triangulation.

The puncturing is done by subdividing the original tetrahedron. The new tetrahedra will have orientations consistent with the original tetrahedra, so if the triangulation was originally oriented then it will also be oriented after this routine has been called. See isOriented() for further details on oriented triangulations.

The new sphere boundary will be formed from two triangles; specifically, face 0 of the last and second-last tetrahedra of the triangulation. These two triangles will be joined so that vertex 1 of each tetrahedron coincides, and vertices 2,3 of one map to vertices 3,2 of the other.

Precondition
  This triangulation is non-empty, and if `tet` is non-null then it is in fact a tetrahedron of this triangulation.

Parameters

  tet | the tetrahedron inside which the puncture will be taken. This may be `null` (the default), in which case the first tetrahedron will be used.

## recogniser() [1/2]

std::string regina::Triangulation< 3 >::recogniser | ( |  | ) | const

Returns a string that expresses this triangulation in Matveev's 3-manifold recogniser format.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Returns
  a string containing the 3-manifold recogniser data.

## recogniser() [2/2]

void regina::Triangulation< 3 >::recogniser | ( | std::ostream & | out | ) | const

Writes a string expressing this triangulation in Matveev's 3-manifold recogniser format to the given output stream.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Python:\n Not present.

Parameters

  out | the output stream to which the recogniser data file will be written.

## recognizer() [1/2]

std::string regina::Triangulation< 3 >::recognizer | ( |  | ) | const

A synonym for recogniser().

This returns a string that expresses this triangulation in Matveev's 3-manifold recogniser format.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Returns
  a string containing the 3-manifold recogniser data.

## recognizer() [2/2]

void regina::Triangulation< 3 >::recognizer | ( | std::ostream & | out | ) | const

inline

A synonym for recognizer(std::ostream&).

This writes a string expressing this triangulation in Matveev's 3-manifold recogniser format to the given output stream.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Python:\n Not present.

Parameters

  out | the output stream to which the recogniser data file will be written.

## rehydrate()

static Triangulation<3>* regina::Triangulation< 3 >::rehydrate | ( | const std::string & | dehydration | ) |

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 3-Manifolds, Callahan, Hildebrand and Weeks, Mathematics of Computation 68/225, 1999.

Parameters

  dehydration | a dehydrated representation of the triangulation to construct. Case is irrelevant; all letters will be treated as if they were lower case.

Returns
  a newly allocated triangulation if the rehydration was successful, or null if the given string could not be rehydrated.

See also
  dehydrate
  insertRehydration

## removeAllTetrahedra()

void regina::Triangulation< 3 >::removeAllTetrahedra | ( |  | ) |

inline

A dimension-specific alias for removeAllSimplices().

See removeAllSimplices() for further information.

## removeTetrahedron()

void regina::Triangulation< 3 >::removeTetrahedron | ( | Tetrahedron< 3 > * | tet | ) |

inline

A dimension-specific alias for removeSimplex().

See removeSimplex() for further information.

## removeTetrahedronAt()

void regina::Triangulation< 3 >::removeTetrahedronAt | ( | size_t | index | ) |

inline

A dimension-specific alias for removeSimplexAt().

See removeSimplexAt() for further information.

## reorderTetrahedraBFS()

void regina::Triangulation< 3 >::reorderTetrahedraBFS | ( | bool | reverse = `false` | ) |

Reorders the tetrahedra of this triangulation using a breadth-first search, so that small-numbered tetrahedra are adjacent to other small-numbered 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 breadth-first 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 n-1, its neighbours will become tetrahedra n-2 down to n-5, and so on.

Parameters

  reverse | `true` if the new tetrahedron numbers should be assigned in reverse order, as described above.

## retriangulate()

template<typename Action , typename... Args>

bool regina::Triangulation< 3 >::retriangulate | ( | int | height,
|  | unsigned | nThreads,
|  | ProgressTrackerOpen * | tracker,
|  | Action && | action,
|  | Args &&... | args
| ) |  | const

inline

Explores all triangulations that can be reached from this via Pachner moves, without exceeding a given number of additional tetrahedra.

Specifically, this routine will iterate through all triangulations that can be reached from this triangulation via 2-3 and 3-2 Pachner moves, without ever exceeding height additional tetrahedra beyond the original number.

For every such triangulation (including this starting triangulation), this routine will call action (which must be a function or some other callable object).

- action must take at least one argument. The first argument will be of type Triangulation<3>&, and will reference the triangulation that has been found. If there are any additional arguments supplied in the list args, then these will be passed as subsequent arguments to action.
- action must return a boolean. If action ever returns `true`, then this indicates that processing should stop immediately (i.e., no more triangulations will be processed).
- action may, if it chooses, make changes to this triangulation (i.e., the original triangulation upon which retriangulate() was called). This will not affect the search: all triangulations that this routine visits will be obtained via Pachner moves from the original form of this triangulation, before any subsequent changes (if any) were made.
- action may, if it chooses, make changes to the triangulation that is passed in its argument (though it must not delete it). This will likewise not affect the search, since the triangulation that is passed to action will be destroyed immediately after action is called.
- action will only be called once for each triangulation (including this starting triangulation). In other words, no triangulation will be revisited a second time in a single call to retriangulate().

This routine can be very slow and very memory-intensive, since the number of triangulations it visits may be superexponential in the number of tetrahedra, and it records every triangulation that it visits (so as to avoid revisiting the same triangulation again). It is highly recommended that you begin with height = 1, and if necessary try increasing height one at a time until this routine becomes too expensive to run.

If a progress tracker is passed, then the exploration of triangulations will take place in a new thread and this routine will return immediately.

To assist with performance, this routine can run in parallel (multithreaded) mode; simply pass the number of parallel threads in the argument nThreads. Even in multithreaded mode, if no progress tracker is passed then this routine will not return until processing has finished (i.e., either action returned `true`, or the search was exhausted). All calls to action will be protected by a mutex (i.e., different threads will never be calling action at the same time).

If height is negative, then this routine will do nothing and immediately return `false`, and any progress tracker that was passed will immediately be marked as finished.

Warning
  By default, the arguments args will be copied (or moved) when they are passed to action. If you need to pass some argument(s) by reference, you must wrap them in std::ref or std::cref.

Precondition
  This triangulation is connected.

Warning
  The API for this class has not yet been finalised. This means that the class interface may change in new versions of Regina, without maintaining backward compatibility. If you use this class directly in your own code, please watch the detailed changelogs upon new releases to see if you need to make changes to your code.

Python:\n Not present.

Parameters

  height | the maximum number of additional tetrahedra to allow, beyond the number of tetrahedra originally present in the triangulation.
  nThreads | the number of threads to use. If this is 1 or smaller then the routine will run single-threaded.
  tracker | a progress tracker through which progress will be reported, or 0 if no progress reporting is required.
  action | a function (or other callable object) to call upon each triangulation that is found.
  args | any additional arguments that should be passed to action, following the initial triangulation argument.

Returns
  If a progress tracker is passed, then this routine will return `true` or `false` immediately according to whether a new thread could or could not be started. If no progress tracker is passed, then this routine will return `true` if some call to action returned `true` (thereby terminating the search early), or `false` if the search ran to completion.

## saveRecogniser()

bool regina::Triangulation< 3 >::saveRecogniser | ( | const char * | filename | ) | const

Writes this triangulation to the given file in Matveev's 3-manifold recogniser format.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Internationalisation:\n This routine makes no assumptions about the
  character encoding used in the given file name, and simply passes it through unchanged to low-level C/C++ file I/O routines. The contents of the file will be written using UTF-8.

Parameters

  filename | the name of the Recogniser file to which to write.

Returns
  `true` if and only if the file was successfully written.

## saveRecognizer()

bool regina::Triangulation< 3 >::saveRecognizer | ( | const char * | filename | ) | const

inline

A synonym for saveRecogniser().

This writes this triangulation to the given file in Matveev's 3-manifold recogniser format.

Precondition
  This triangulation is not invalid, and does not contain any boundary triangles.

Internationalisation:\n This routine makes no assumptions about the
  character encoding used in the given file name, and simply passes it through unchanged to low-level C/C++ file I/O routines. The contents of the file will be written using UTF-8.

Parameters

  filename | the name of the Recogniser file to which to write.

Returns
  `true` if and only if the file was successfully written.

## saveSnapPea()

virtual bool regina::Triangulation< 3 >::saveSnapPea | ( | const char * | filename | ) | const

virtual

Writes this triangulation to the given file using SnapPea's native file format.

Regarding what gets stored in the SnapPea data file:

- If you are calling this from one of Regina's own Triangulation<3> objects, then only the tetrahedron gluings and the manifold name will be stored (the name will be derived from the packet label). All other SnapPea-specific information (such as peripheral curves) will be marked as unknown (since Regina does not track such information itself), and of course other Regina-specific information (such as the Turaev-Viro invariants) will not be written to the SnapPea file at all.
- If you are calling this from the subclass SnapPeaTriangulation, then all additional SnapPea-specific information will be written to the file (indeed, the SnapPea kernel itself will be used to produce the file contents).

If this triangulation is empty, invalid, or contains boundary triangles (which SnapPea cannot represent), then the file will not be written and this routine will return `false`.

Internationalisation:\n This routine makes no assumptions about the
  character encoding used in the given file name, and simply passes it through unchanged to low-level C/C++ file I/O routines. The contents of the file will be written using UTF-8.

Parameters

  filename | the name of the SnapPea file to which to write.

Returns
  `true` if and only if the file was successfully written.

Reimplemented in regina::SnapPeaTriangulation.

## shellBoundary()

bool regina::Triangulation< 3 >::shellBoundary | ( | Tetrahedron< 3 > * | 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:

- all edges of the tetrahedron are valid;
- precisely one, two or three faces of the tetrahedron lie in the boundary;
- if one face lies in the boundary, then the opposite vertex does not lie in the boundary, and no two of the remaining three edges are identified;
- if two faces lie in the boundary, then the remaining edge does not lie in the boundary, and the remaining two faces of the tetrahedron are not identified.

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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given tetrahedron is a tetrahedron of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## simplifyExhaustive()

bool regina::Triangulation< 3 >::simplifyExhaustive | ( | int | height = `1`,
|  | unsigned | nThreads = `1`,
|  | ProgressTrackerOpen * | tracker = `0`
| ) |  |

Attempts to simplify this triangulation using a slow but exhaustive search through the Pachner graph.

This routine is more powerful but much slower than intelligentSimplify().

Specifically, this routine will iterate through all triangulations that can be reached from this triangulation via 2-3 and 3-2 Pachner moves, without ever exceeding height additional tetrahedra beyond the original number.

If at any stage it finds a triangulation with fewer tetrahedra than the original, then this routine will call intelligentSimplify() to shrink the triangulation further if possible and will then return `true`. If it cannot find a triangulation with fewer tetrahedra then it will leave this triangulation unchanged and return `false`.

This routine can be very slow and very memory-intensive: the number of triangulations it visits may be superexponential in the number of tetrahedra, and it records every triangulation that it visits (so as to avoid revisiting the same triangulation again). It is highly recommended that you begin with height = 1, and if this fails then try increasing height one at a time until either you find a simplification or the routine becomes too expensive to run.

If you want a fast simplification routine, you should call intelligentSimplify() instead. The benefit of simplifyExhaustive() is that, for very stubborn triangulations where intelligentSimplify() finds itself stuck at a local minimum, simplifyExhaustive() is able to "climb out" of such wells.

If a progress tracker is passed, then the exhaustive simplification will take place in a new thread and this routine will return immediately. In this case, you will need to use some other means to determine whether the triangulation was eventually simplified (e.g., by examining size() after the tracker indicates that the operation has finished).

To assist with performance, this routine can run in parallel (multithreaded) mode; simply pass the number of parallel threads in the argument nThreads. Even in multithreaded mode, if no progress tracker is passed then this routine will not return until processing has finished (i.e., either the triangulation was simplified or the search was exhausted).

If this routine is unable to simplify the triangulation, then the triangulation will not be changed.

Precondition
  This triangulation is connected.

Parameters

  height | the maximum number of additional tetrahedra to allow, beyond the number of tetrahedra originally present in the triangulation.
  nThreads | the number of threads to use. If this is 1 or smaller then the routine will run single-threaded.
  tracker | a progress tracker through which progress will be reported, or 0 if no progress reporting is required.

Returns
  If a progress tracker is passed, then this routine will return `true` or `false` immediately according to whether a new thread could or could not be started. If no progress tracker is passed, then this routine will return `true` if and only if the triangulation was successfully simplified to fewer tetrahedra.

## simplifyToLocalMinimum()

bool regina::Triangulation< 3 >::simplifyToLocalMinimum | ( | bool | perform = `true` | ) |

Uses all known simplification moves to reduce the triangulation monotonically to some local minimum number of tetrahedra.

End users will probably not want to call this routine. You should call intelligentSimplify() if you want a fast (and usually effective) means of simplifying a triangulation, or you should call simplifyExhaustive() if you are still stuck and you want to try a slower but more powerful method instead.

The moves used by this routine include 3-2, 2-0 (edge and vertex), 2-1 and boundary shelling moves.

Moves that do not reduce the number of tetrahedra (such as 4-4 moves or book opening moves) are not used in this routine. Such moves do however feature in intelligentSimplify().

Warning
  The specific behaviour of this routine is very likely to change between releases.

Parameters

  perform | `true` if we are to perform the simplifications, or `false` if we are only to investigate whether simplifications are possible (defaults to `true`).

Returns
  if perform is `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.

## snapPea() [1/2]

virtual std::string regina::Triangulation< 3 >::snapPea | ( |  | ) | const

virtual

Returns a string containing the full contents of a SnapPea data file that describes this triangulation.

In particular, this string can be used in a Python session to pass the triangulation directly to SnapPy (without writing to the filesystem).

Regarding what gets stored in the SnapPea data file:

- If you are calling this from one of Regina's own Triangulation<3> objects, then only the tetrahedron gluings and the manifold name will be stored (the name will be derived from the packet label). All other SnapPea-specific information (such as peripheral curves) will be marked as unknown (since Regina does not track such information itself), and of course other Regina-specific information (such as the Turaev-Viro invariants) will not be written to the SnapPea file at all.
- If you are calling this from the subclass SnapPeaTriangulation, then all additional SnapPea-specific information will be written to the file (indeed, the SnapPea kernel itself will be used to produce the file contents).

If you wish to export a triangulation to a SnapPea file, you should call saveSnapPea() instead (which has better performance, and does not require you to construct an enormous intermediate string).

If this triangulation is empty, invalid, or contains boundary triangles (which SnapPea cannot represent), then the resulting string will be empty.

Returns
  a string containing the contents of the corresponding SnapPea data file.

Reimplemented in regina::SnapPeaTriangulation.

## snapPea() [2/2]

virtual void regina::Triangulation< 3 >::snapPea | ( | std::ostream & | out | ) | const

virtual

Writes the full contents of a SnapPea data file describing this triangulation to the given output stream.

Regarding what gets stored in the SnapPea data file:

- If you are calling this from one of Regina's own Triangulation<3> objects, then only the tetrahedron gluings and the manifold name will be stored (the name will be derived from the packet label). All other SnapPea-specific information (such as peripheral curves) will be marked as unknown (since Regina does not track such information itself), and of course other Regina-specific information (such as the Turaev-Viro invariants) will not be written to the SnapPea file at all.
- If you are calling this from the subclass SnapPeaTriangulation, then all additional SnapPea-specific information will be written to the file (indeed, the SnapPea kernel itself will be used to produce the file contents).

If you wish to extract the SnapPea data file as a string, you should call the zero-argument routine snapPea() instead. If you wish to write to a real SnapPea data file on the filesystem, you should call saveSnapPea() (which is also available in Python).

If this triangulation is empty, invalid, or contains boundary triangles (which SnapPea cannot represent), then nothing will be written to the output stream.

Python:\n Not present.

Parameters

  out | the output stream to which the SnapPea data file will be written.

Reimplemented in regina::SnapPeaTriangulation.

## subtype()

int regina::Face< 3, 2 >::subtype | ( |  | ) |

inline

Return the triangle vertex or triangle edge that plays a special role for the triangle type of this triangle.

Note that this routine is only relevant for some triangle types. The triangle type is returned by type().

Returns
  The vertex or edge that plays a special role (this will be 0, 1 or 2), or -1 if this triangle type has no special vertex or edge.

## threeTwoMove()

bool regina::Triangulation< 3 >::threeTwoMove | ( | Edge< 3 > * | e,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 3-2 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 non-boundary, 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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## Triangulation() [1/4]

regina::Triangulation< 3 >::Triangulation | ( |  | ) |

inline

Default constructor.

Creates an empty triangulation.

## Triangulation() [2/4]

regina::Triangulation< 3 >::Triangulation | ( | 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):

- isomorphism signatures (see fromIsoSig());
- dehydration strings (see rehydrate());
- the contents of a SnapPea data file (see fromSnapPea()).

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.

Warning
  If you pass the contents of a SnapPea data file, then only the tetrahedron gluings will be read; all other SnapPea-specific information (such as peripheral curves) will be lost. See fromSnapPea() for details, and for other alternatives that preserve SnapPea-specific data.

Parameters

  description | a string that describes a 3-manifold triangulation.

## Triangulation() [3/4]

regina::Triangulation< 3 >::Triangulation | ( | const Triangulation< 3 > & | copy,
|  | bool | cloneProps
| ) |  |

Creates a new copy of the given triangulation, with the option of whether or not to clone its computed properties also.

Parameters

  copy | the triangulation to copy.
  cloneProps | `true` if this should also clone any computed properties of the given triangulation (such as homology, fundamental group, and so on), or `false` if the new triangulation should have all properties marked as unknown.

## Triangulation() [4/4]

regina::Triangulation< 3 >::Triangulation | ( | const Triangulation< 3 > & | copy | ) |

inline

Creates a new copy of the given triangulation.

The packet tree structure and packet label are not copied.

This will clone any computed properties (such as homology, fundamental group, and so on) of the given triangulation also. If you want a "clean" copy that resets all properties to unknown, you can use the two-argument copy constructor instead.

Parameters

  copy | the triangulation to copy.

## turaevViro()

Cyclotomic regina::Triangulation< 3 >::turaevViro | ( | unsigned long | r,
|  | bool | parity = `true`,
|  | TuraevViroAlg | alg = `TV_DEFAULT`,
|  | ProgressTracker * | tracker = `0`
| ) |  | const

Computes the given Turaev-Viro state sum invariant of this 3-manifold using exact arithmetic.

The initial data for the Turaev-Viro invariant is as described in the paper of Turaev and Viro, "State sum invariants of 3-manifolds and quantum 6j-symbols", Topology, vol. 31, no. 4, 1992, pp 865-902. In particular, Section 7 of this paper 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. There are several cases to consider:

- r may be even. In this case q0 must be a primitive (2r)th root of unity, and the invariant is computed as an element of the cyclotomic field of order 2r. There is no need to specify which root of unity is used, since switching between different roots of unity corresponds to an automorphism of the underlying cyclotomic field (i.e., it does not yield any new information). Therefore, if r is even, the additional argument parity is ignored.
- r may be odd, and q0 may be a primitive (2r)th root of unity. This case corresponds to passing the argument parity as `true`. Here the invariant is again computed as an element of the cyclotomic field of order 2r. As before, there is no need to give further information as to which root of unity is used, since switching between roots of unity does not yield new information.
- r may be odd, and q0 may be a primitive (r)th root of unity. This case corresponds to passing the argument parity as `false`. In this case the invariant is computed as an element of the cyclotomic field of order r. Again, there is no need to give further information as to which root of unity is used.

This routine works entirely within the relevant cyclotomic field, which yields exact results but adds a significant overhead to the running time. If you want a fast floating-point approximation, you can call turaevViroApprox() instead.

Unlike this routine, turaevViroApprox() requires a precise specification of which root of unity is used (since it returns a numerical real value). The numerical value obtained by calling `turaevViroApprox(r, whichRoot)` should be the same as `turaevViro(r, parity).evaluate(whichRoot)`, where parity is `true` or `false` according to whether whichRoot is odd or even respectively. Of course in practice the numerical values might be very different, since turaevViroApprox() performs significantly more floating point operations, and so is subject to a much larger potential numerical error.

If the requested Turaev-Viro invariant has already been computed, then the result will be cached and so this routine will be very fast (since it just returns the previously computed result). Otherwise the computation could be quite slow, particularly for larger triangulations and/or larger values of r. This (potentially) long computation can be managed by passing a progress tracker:

- If a progress tracker is passed and the requested invariant has not yet been computed, then the calculation will take place in a new thread and this routine will return immediately. Once the progress tracker indicates that the calculation has finished, you can call turaevViro() again with the same arguments for r and parity to retrieve the value of the invariant.
- If no progress tracker is passed and the requested invariant has not yet been computed, the calculation will run in the current thread and this routine will not return until it is complete.
- If the requested invariant has already been computed, then this routine will return immediately with the pre-computed value. If a progress tracker is passed then it will be marked as finished.

Precondition
  This triangulation is valid, closed and non-empty.

Parameters

  r | the integer r as described above; this must be at least 3.
  parity | determines for odd r whether q0 is a primitive 2rth or rth root of unity, as described above.
  alg | the algorithm with which to compute the invariant. If you are not sure, the default value (TV_DEFAULT) is a safe choice.
  tracker | a progress tracker through will progress will be reported, or 0 if no progress reporting is required.

Returns
  the requested Turaev-Viro invariant. As an exception, if tracker is non-null and the value of this invariant has not been computed before, then (since the calculation will still be running in a new thread) the return value is undefined.

See also
  allCalculatedTuraevViro

## turaevViroApprox()

double regina::Triangulation< 3 >::turaevViroApprox | ( | unsigned long | r,
|  | unsigned long | whichRoot = `1`,
|  | TuraevViroAlg | alg = `TV_DEFAULT`
| ) |  | const

Computes the given Turaev-Viro state sum invariant of this 3-manifold using a fast but inexact floating-point approximation.

The initial data for the Turaev-Viro invariant is as described in the paper of Turaev and Viro, "State sum invariants of 3-manifolds and quantum 6j-symbols", Topology, vol. 31, no. 4, 1992, pp 865-902. 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.

The argument whichRoot specifies which root of unity is used for q0. Specifically, q0 will be the root of unity `e^(2i * Pi * whichRoot / 2r)`. There are additional preconditions on whichRoot to ensure that q0^2 is a primitive root of unity of degree r; see below for details.

This same invariant can be computed by calling `turaevViro(r, parity).evaluate(whichRoot)`, where parity is `true` or `false` according to whether whichRoot is odd or even respectively. Calling turaevViroApprox() is significantly faster (since it avoids the overhead of working in cyclotomic fields), but may also lead to a much larger numerical error (since this routine might perform an exponential number of floating point operations, whereas the alternative only uses floating point for the final call to Cyclotomic::evaluate()).

These invariants, although computed in the complex field, should all be reals. Thus the return type is an ordinary double.

Precondition
  This triangulation is valid, closed and non-empty.
  The argument whichRoot is strictly between 0 and 2r, and has no common factors with r.

Parameters

  r | the integer r as described above; this must be at least 3.
  whichRoot | specifies which root of unity is used for q0, as described above.
  alg | the algorithm with which to compute the invariant. If you are not sure, the default value (TV_DEFAULT) is a safe choice.

Returns
  the requested Turaev-Viro invariant.

See also
  allCalculatedTuraevViro

## twoOneMove()

bool regina::Triangulation< 3 >::twoOneMove | ( | Edge< 3 > * | e,
|  | int | edgeEnd,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 2-1 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:

- The edge must be valid and non-boundary.
- The two remaining faces of the tetrahedron are not joined, and the tetrahedron face opposite the given endpoint of the edge is not boundary.
- Consider the second tetrahedron to be merged (the one joined along the face opposite the given endpoint of the edge). Moreover, consider the two edges of this second tetrahedron that run from the (identical) vertices of the original tetrahedron not touching `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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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 EdgeEmbedding<3>::vertices().
  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`).

Returns
  If check is `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`.

## twoThreeMove()

bool regina::Triangulation< 3 >::twoThreeMove | ( | Triangle< 3 > * | t,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 2-3 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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given triangle is a triangle of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## twoZeroMove() [1/2]

bool regina::Triangulation< 3 >::twoZeroMove | ( | Edge< 3 > * | e,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 2-0 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:

- the edge is valid and non-boundary;
- the two tetrahedra are distinct;
- the edges opposite `e` in each tetrahedron are distinct and not both boundary;
- if triangles f1 and f2 from one tetrahedron are to be flattened onto triangles g1 and g2 of the other respectively, then (a) f1 and g1 are distinct, (b) f2 and g2 are distinct, (c) we do not have both f1 = g2 and g1 = f2, (d) we do not have both f1 = f2 and g1 = g2, and (e) we do not have two of the triangles boundary and the other two identified.

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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given edge is an edge of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## twoZeroMove() [2/2]

bool regina::Triangulation< 3 >::twoZeroMove | ( | Vertex< 3 > * | v,
|  | bool | check = `true`,
|  | bool | perform = `true`
| ) |  |

Checks the eligibility of and/or performs a 2-0 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:

- the vertex is non-boundary and has a 2-sphere vertex link;
- the two tetrahedra are distinct;
- the triangles opposite `v` in each tetrahedron are distinct and not both boundary;
- the two tetrahedra meet each other on all three faces touching the vertex (as opposed to meeting each other on one face and being glued to themselves along the other two).

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.

Precondition
  If the move is being performed and no check is being run, it must be known in advance that the move is legal.
  The given vertex is a vertex of this triangulation.

Parameters

  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`).

Returns
  If check is `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`.

## type()

Type regina::Face< 3, 2 >::type | ( |  | ) |

Returns a description of the triangle type.

This will be one of the eight shapes described by the Type enumeration, indicating how the edges and vertices of the triangle are identified.

Returns
  the type of this triangle. This routine will never return UNKNOWN_TYPE.

## writeTextLong()

virtual void regina::Triangulation< 3 >::writeTextLong | ( | std::ostream & | out | ) | const

virtual

Writes a detailed text representation of this object to the given output stream.

This may be reimplemented by subclasses, but the parent Packet class offers a reasonable default implementation.

Python:\n Not present.

Parameters

  out | the output stream to which to write.

Reimplemented from regina::Packet.

Reimplemented in regina::SnapPeaTriangulation.

## writeTextShort() [1/2]

void regina::Face< 3, 0 >::writeTextShort | ( | std::ostream & | out | ) | const

Writes a short text representation of this object to the given output stream.

Python:\n Not present.

Parameters

  out | the output stream to which to write.

## writeTextShort() [2/2]

void regina::Triangulation< 3 >::writeTextShort | ( | std::ostream & | out | ) | const

inline virtual

Writes a short text representation of this object to the given output stream.

This must be reimplemented by subclasses.

Python:\n Not present.

Parameters

  out | the output stream to which to write.

Implements regina::Packet.

Reimplemented in regina::SnapPeaTriangulation.

## writeXMLPacketData()

virtual void regina::Triangulation< 3 >::writeXMLPacketData | ( | std::ostream & | out | ) | const

protected virtual

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.

Parameters

  out | the output stream to which the XML should be written.

Implements regina::Packet.

Reimplemented in regina::SnapPeaTriangulation.

## ~Face()

regina::Face< 3, 0 >::~Face | ( |  | ) |

Default destructor.

## ~Triangulation()

regina::Triangulation< 3 >::~Triangulation | ( |  | ) |

inline virtual

Destroys this triangulation.

The constituent tetrahedra, the cellular structure and all other properties will also be destroyed.

## Friends

## detail::TriangulationBase< 3 >

friend class detail::TriangulationBase< 3 >

friend

Allow access to private members.

Copyright © 1999-2016, The Regina development team
This software is released under the GNU General Public License, with some additional permissions; see the source code for details.
For further information, or to submit a bug or other problem, please contact Ben Burton (bab@maths.uq.edu.au).