Regina Calculation Engine
Public Member Functions | Static Public Member Functions | Protected Attributes | List of all members
regina::detail::IsomorphismBase< dim > Class Template Reference


Provides core functionality for combinatorial isomorphisms between dim-manifold triangulations. More...

#include <triangulation/detail/isomorphism.h>

Inheritance diagram for regina::detail::IsomorphismBase< dim >:
regina::Output< IsomorphismBase< dim > > regina::alias::IsomorphismImage< IsomorphismBase< dim >, dim > regina::Isomorphism< 3 > regina::Isomorphism< dim >

Public Member Functions

 IsomorphismBase (unsigned nSimplices)
 Creates a new isomorphism with no initialisation. More...
 
 IsomorphismBase (const IsomorphismBase< dim > &src)
 Creates a new copy of the given isomorphism. More...
 
 IsomorphismBase (IsomorphismBase< dim > &&src) noexcept
 Moves the given isomorphism into this new isomorphism. More...
 
 ~IsomorphismBase ()
 Destroys this isomorphism. More...
 
IsomorphismBaseoperator= (const IsomorphismBase &src)
 Copies the given isomorphism into this isomorphism. More...
 
IsomorphismBaseoperator= (IsomorphismBase &&src) noexcept
 Moves the given isomorphism into this isomorphism. More...
 
unsigned size () const
 Returns the number of simplices in the source triangulation associated with this isomorphism. More...
 
int & simpImage (unsigned sourceSimp)
 
Determines the image of the given source simplex under this isomorphism. More...
 
int simpImage (unsigned sourceSimp) const
 Determines the image of the given source simplex under this isomorphism. More...
 
Perm< dim+1 > & facetPerm (unsigned sourceSimp)
 
Returns a read-write reference to the permutation that is applied to the (dim + 1) facets of the given source simplex under this isomorphism. More...
 
Perm< dim+1 > facetPerm (unsigned sourceSimp) const
 Determines the permutation that is applied to the (dim + 1) facets of the given source simplex under this isomorphism. More...
 
FacetSpec< dim > operator[] (const FacetSpec< dim > &source) const
 Determines the image of the given source simplex facet under this isomorphism. More...
 
bool isIdentity () const
 Determines whether or not this is an identity isomorphism. More...
 
Triangulation< dim > * apply (const Triangulation< dim > *original) const
 Applies this isomorphism to the given triangulation, and returns the result as a new triangulation. More...
 
void applyInPlace (Triangulation< dim > *tri) const
 Applies this isomorphism to the given triangulation, modifying the given triangulation directly. More...
 
void writeTextShort (std::ostream &out) const
 
Writes a short text representation of this object to the given output stream. More...
 
void writeTextLong (std::ostream &out) const
 
Writes a detailed text representation of this object to the given output stream. More...
 
std::string str () const
 
Returns a short text representation of this object. More...
 
std::string utf8 () const
 Returns a short text representation of this object using unicode characters. More...
 
std::string detail () const
 Returns a detailed text representation of this object. More...
 

Static Public Member Functions

static Isomorphism< dim > identity (unsigned nSimplices)
 Returns the identity isomorphism for the given number of simplices. More...
 
static Isomorphism< dim > random (unsigned nSimplices, bool even=false)
 Returns a random isomorphism for the given number of simplices. More...
 

Protected Attributes

unsigned nSimplices_
 The number of simplices in the source triangulation. More...
 
int * simpImage_
 Stores the simplex of the destination triangulation that each simplex of the source triangulation maps to. More...
 
Perm< dim+1 > * facetPerm_
 The permutation applied to the facets of each source simplex. More...
 

Detailed Description

template<int dim>
class regina::detail::IsomorphismBase< dim >


Provides core functionality for combinatorial isomorphisms between dim-manifold triangulations.

Such an isomorphism is represented by the class Isomorphism<dim>, which uses this as a base class. End users should not need to refer to IsomorphismBase directly.

See the Isomorphism class notes for further information.

Python
This base class is not present, but the "end user" class Isomorphism<dim> is.
Template Parameters
dimthe dimension of the triangulations that this isomorphism class works with. This must be between 2 and 15 inclusive.

Constructor & Destructor Documentation

◆ IsomorphismBase() [1/3]

template<int dim>
regina::detail::IsomorphismBase< dim >::IsomorphismBase ( unsigned  nSimplices)
inline

Creates a new isomorphism with no initialisation.

The images of the simplices and their vertices must be explicitly set using simpImage() and facetPerm().

Parameters
nSimplicesthe number of simplices in the source triangulation associated with this isomorphism. This is allowed to be zero.

◆ IsomorphismBase() [2/3]

template<int dim>
regina::detail::IsomorphismBase< dim >::IsomorphismBase ( const IsomorphismBase< dim > &  src)
inline

Creates a new copy of the given isomorphism.

This constructor induces a deep copy of src.

Parameters
srcthe isomorphism to copy.

◆ IsomorphismBase() [3/3]

template<int dim>
regina::detail::IsomorphismBase< dim >::IsomorphismBase ( IsomorphismBase< dim > &&  src)
inlinenoexcept

Moves the given isomorphism into this new isomorphism.

This is a fast (constant time) operation.

The isomorphism that is passed (src) will no longer be usable.

Parameters
srcthe isomorphism to move.

◆ ~IsomorphismBase()

template<int dim>
regina::detail::IsomorphismBase< dim >::~IsomorphismBase ( )
inline

Destroys this isomorphism.

Member Function Documentation

◆ apply()

template<int dim>
Triangulation< dim > * regina::detail::IsomorphismBase< dim >::apply ( const Triangulation< dim > *  original) const

Applies this isomorphism to the given triangulation, and returns the result as a new triangulation.

An isomorphism represents a combinatorial map from a triangulation T to a triangulation U. This routine treats the given triangulation as the domain T, and returns the corresponding range U. The given triangulation T is not modified in any way.

In more detail: A new triangulation U is returned, so that this isomorphism represents a one-to-one, onto and boundary complete isomorphism from T to U. That is, T and U will be combinatorially identical triangulations, and this isomorphism describes the mapping from the simplices of T and their facets to the simplices of U and their facets.

The resulting triangulation U is newly created, and must be destroyed by the caller of this routine.

There are several preconditions to this routine. This routine does a small amount of sanity checking (and returns 0 if an error is detected), but it certainly does not check the full set of preconditions. It is up to the caller of this routine to verify that all of the following preconditions are met.

Precondition
The number of simplices in the given triangulation is precisely the number returned by size() for this isomorphism.
The simplex images are precisely 0,1,...,size()-1 in some order (i.e., this isomorphism does not represent a mapping from a smaller triangulation into a larger triangulation).
Todo:
Lock the topological properties of the underlying manifold, to avoid recomputing them after the isomorphism is applied.
Parameters
originalthe triangulation to which this isomorphism should be applied.
Returns
the new isomorphic triangulation, or 0 if a problem was encountered (i.e., an unmet precondition was noticed).

◆ applyInPlace()

template<int dim>
void regina::detail::IsomorphismBase< dim >::applyInPlace ( Triangulation< dim > *  tri) const

Applies this isomorphism to the given triangulation, modifying the given triangulation directly.

This is similar to apply(), except that instead of creating a new triangulation, the simplices and vertices of the given triangulation are modified in-place.

See apply() for further details on how this operation is performed.

As with apply(), there are several preconditions to this routine. This routine does a small amount of sanity checking (and returns without changes if an error is detected), but it certainly does not check the full set of preconditions. It is up to the caller of this routine to verify that all of the following preconditions are met.

Precondition
The number of simplices in the given triangulation is precisely the number returned by size() for this isomorphism.
The simplex images are precisely 0,1,...,size()-1 in some order (i.e., this isomorphism does not represent a mapping from a smaller triangulation into a larger triangulation).
Todo:
Lock the topological properties of the underlying manifold, to avoid recomputing them after the isomorphism is applied.
Parameters
trithe triangulation to which this isomorphism should be applied.

◆ detail()

std::string regina::Output< IsomorphismBase< dim > , false >::detail ( ) const
inherited

Returns a detailed text representation of this object.

This text may span many lines, and should provide the user with all the information they could want. It should be human-readable, should not contain extremely long lines (which cause problems for users reading the output in a terminal), and should end with a final newline. There are no restrictions on the underlying character set.

Returns
a detailed text representation of this object.

◆ facetPerm() [1/2]

template<int dim>
Perm< dim+1 > & regina::detail::IsomorphismBase< dim >::facetPerm ( unsigned  sourceSimp)
inline


Returns a read-write reference to the permutation that is applied to the (dim + 1) facets of the given source simplex under this isomorphism.

Facet i of source simplex sourceSimp will be mapped to facet facetPerm(sourceSimp)[i] of simplex simpImage(sourceSimp).

Python
This is not available for Python users. However, the read-only version of this routine is.
Parameters
sourceSimpthe index of the source simplex containing the original (dim + 1) facets; this must be between 0 and size()-1 inclusive.
Returns
a read-write reference to the permutation applied to the facets of the source simplex.

◆ facetPerm() [2/2]

template<int dim>
Perm< dim+1 > regina::detail::IsomorphismBase< dim >::facetPerm ( unsigned  sourceSimp) const
inline

Determines the permutation that is applied to the (dim + 1) facets of the given source simplex under this isomorphism.

Facet i of source simplex sourceSimp will be mapped to face facetPerm(sourceSimp)[i] of simplex simpImage(sourceSimp).

Parameters
sourceSimpthe index of the source simplex containing the original (dim + 1) facets; this must be between 0 and size()-1 inclusive.
Returns
the permutation applied to the facets of the source simplex.

◆ identity()

template<int dim>
Isomorphism< dim > regina::detail::IsomorphismBase< dim >::identity ( unsigned  nSimplices)
inlinestatic

Returns the identity isomorphism for the given number of simplices.

This isomorphism sends every simplex and every vertex to itself.

Parameters
nSimplicesthe number of simplices that the new isomorphism should operate upon.
Returns
the identity isomorphism.

◆ isIdentity()

template<int dim>
bool regina::detail::IsomorphismBase< dim >::isIdentity ( ) const

Determines whether or not this is an identity isomorphism.

In an identity isomorphism, each simplex image is itself, and within each simplex the facet/vertex permutation is the identity permutation.

Returns
true if this is an identity isomorphism, or false otherwise.

◆ operator=() [1/2]

template<int dim>
IsomorphismBase< dim > & regina::detail::IsomorphismBase< dim >::operator= ( const IsomorphismBase< dim > &  src)

Copies the given isomorphism into this isomorphism.

It does not matter if this and the given isomorphism use different numbers of simplices; if they do then this isomorphism will be resized as a result.

This operator induces a deep copy of src.

Parameters
srcthe isomorphism to copy.
Returns
a reference to this isomorphism.

◆ operator=() [2/2]

template<int dim>
IsomorphismBase< dim > & regina::detail::IsomorphismBase< dim >::operator= ( IsomorphismBase< dim > &&  src)
noexcept

Moves the given isomorphism into this isomorphism.

This is a fast (constant time) operation.

It does not matter if this and the given isomorphism use different numbers of simplices; if they do then this isomorphism will be resized as a result.

The isomorphism that is passed (src) will no longer be usable.

Parameters
srcthe isomorphism to move.
Returns
a reference to this isomorphism.

◆ operator[]()

template<int dim>
FacetSpec< dim > regina::detail::IsomorphismBase< dim >::operator[] ( const FacetSpec< dim > &  source) const
inline

Determines the image of the given source simplex facet under this isomorphism.

This operator returns by value: it cannot be used to alter the isomorphism.

Parameters
sourcethe given source simplex facet; this must be one of the (dim + 1) facets of one of the size() simplices in the source triangulation.
Returns
the image of the source simplex facet under this isomorphism.

◆ random()

template<int dim>
Isomorphism< dim > regina::detail::IsomorphismBase< dim >::random ( unsigned  nSimplices,
bool  even = false 
)
static

Returns a random isomorphism for the given number of simplices.

This isomorphism will reorder simplices 0 to nSimplices-1 in a random fashion, and for each simplex a random permutation of its (dim + 1) vertices will be selected.

All possible isomorphisms for the given number of simplices are equally likely.

This routine is thread-safe, and uses RandomEngine for its random number generation.

Parameters
nSimplicesthe number of simplices that the new isomorphism should operate upon.
evenif true, then every simplex will have its vertices permuted with an even permutation. This means that, if the random isomorphism is applied to an oriented triangulation, it will preserve the orientation.
Returns
the new random isomorphism.

◆ simpImage() [1/2]

template<int dim>
int & regina::detail::IsomorphismBase< dim >::simpImage ( unsigned  sourceSimp)
inline


Determines the image of the given source simplex under this isomorphism.

Python
This is not available for Python users. However, the read-only version of this routine is.
Parameters
sourceSimpthe index of the source simplex; this must be between 0 and size()-1 inclusive.
Returns
a reference to the index of the destination simplex that the source simplex maps to.

◆ simpImage() [2/2]

template<int dim>
int regina::detail::IsomorphismBase< dim >::simpImage ( unsigned  sourceSimp) const
inline

Determines the image of the given source simplex under this isomorphism.

Parameters
sourceSimpthe index of the source simplex; this must be between 0 and size()-1 inclusive.
Returns
the index of the destination simplex that the source simplex maps to.

◆ size()

template<int dim>
unsigned regina::detail::IsomorphismBase< dim >::size ( ) const
inline

Returns the number of simplices in the source triangulation associated with this isomorphism.

Note that this is always less than or equal to the number of simplices in the destination triangulation.

Returns
the number of simplices in the source triangulation.

◆ str()

std::string regina::Output< IsomorphismBase< dim > , false >::str ( ) const
inherited


Returns a short text representation of this object.

This text should be human-readable, should fit on a single line, and should not end with a newline. Where possible, it should use plain ASCII characters.

Python
In addition to str(), this is also used as the Python "stringification" function __str__().
Returns
a short text representation of this object.

◆ utf8()

std::string regina::Output< IsomorphismBase< dim > , false >::utf8 ( ) const
inherited

Returns a short text representation of this object using unicode characters.

Like str(), this text should be human-readable, should fit on a single line, and should not end with a newline. In addition, it may use unicode characters to make the output more pleasant to read. This string will be encoded in UTF-8.

Returns
a short text representation of this object.

◆ writeTextLong()

template<int dim>
void regina::detail::IsomorphismBase< dim >::writeTextLong ( std::ostream &  out) const
inline


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

Python
Not present.
Parameters
outthe output stream to which to write.

◆ writeTextShort()

template<int dim>
void regina::detail::IsomorphismBase< dim >::writeTextShort ( std::ostream &  out) const
inline


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

Python
Not present.
Parameters
outthe output stream to which to write.

Member Data Documentation

◆ facetPerm_

template<int dim>
Perm<dim+1>* regina::detail::IsomorphismBase< dim >::facetPerm_
protected

The permutation applied to the facets of each source simplex.

This array has size nSimplices_.

◆ nSimplices_

template<int dim>
unsigned regina::detail::IsomorphismBase< dim >::nSimplices_
protected

The number of simplices in the source triangulation.

◆ simpImage_

template<int dim>
int* regina::detail::IsomorphismBase< dim >::simpImage_
protected

Stores the simplex of the destination triangulation that each simplex of the source triangulation maps to.

This array has size nSimplices_.


The documentation for this class was generated from the following file:

Copyright © 1999-2021, 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).