Regina 7.0 Calculation Engine
|
Provides core functionality for facet pairings (that is, dual graphs) of dim-dimensional triangulations. More...
#include <triangulation/detail/facetpairing.h>
Public Types | |
using | IsoList = std::list< Isomorphism< dim > > |
A list of isomorphisms on facet pairings. More... | |
Public Member Functions | |
void | writeTextLong (std::ostream &out) const |
A default implementation for detailed output. More... | |
std::string | str () const |
Returns a short text representation of this object. More... | |
std::string | utf8 () const |
Returns a short text representation of this object using unicode characters. More... | |
std::string | detail () const |
Returns a detailed text representation of this object. More... | |
Constructors, Destructors and Assignment | |
FacetPairingBase (const FacetPairingBase &src) | |
Creates a new copy of the given facet pairing. More... | |
FacetPairingBase (FacetPairingBase &&src) noexcept | |
Moves the given facet pairing into this facet pairing. More... | |
FacetPairingBase (const Triangulation< dim > &tri) | |
Creates the facet pairing of given triangulation. More... | |
FacetPairingBase (std::istream &in) | |
Reads a new facet pairing from the given input stream. More... | |
~FacetPairingBase () | |
Deallocates any memory used by this structure. More... | |
FacetPairingBase & | operator= (const FacetPairingBase &src) |
Copies the given facet pairing into this facet pairing. More... | |
FacetPairingBase & | operator= (FacetPairingBase &&src) noexcept |
Moves the given facet pairing into this facet pairing. More... | |
void | swap (FacetPairingBase &other) noexcept |
Swaps the contents of this and the given facet pairing. More... | |
Basic Queries | |
size_t | size () const |
Returns the number of simplices whose facets are described by this facet pairing. More... | |
const FacetSpec< dim > & | dest (const FacetSpec< dim > &source) const |
Returns the other facet to which the given simplex facet is paired. More... | |
const FacetSpec< dim > & | dest (size_t simp, unsigned facet) const |
Returns the other facet to which the given simplex facet is paired. More... | |
const FacetSpec< dim > & | operator[] (const FacetSpec< dim > &source) const |
Returns the other facet to which the given simplex facet is paired. More... | |
bool | isUnmatched (const FacetSpec< dim > &source) const |
Determines whether the given simplex facet has been left deliberately unmatched. More... | |
bool | isUnmatched (size_t simp, unsigned facet) const |
Determines whether the given simplex facet has been left deliberately unmatched. More... | |
bool | isClosed () const |
Determines whether this facet pairing is closed. More... | |
bool | operator== (const FacetPairing< dim > &other) const |
Determines if this and the given facet pairing are identical. More... | |
bool | operator!= (const FacetPairing< dim > &other) const |
Determines if this and the given facet pairing are not identical. More... | |
Isomorphic Representations | |
bool | isCanonical () const |
Determines whether this facet pairing is in canonical form, i.e., is a lexicographically minimal representative of its isomorphism class. More... | |
IsoList | findAutomorphisms () const |
Returns the set of all combinatorial automorphisms of this facet pairing. More... | |
Protected Attributes | |
size_t | size_ |
The number of simplices under consideration. More... | |
FacetSpec< dim > * | pairs_ |
The other facet to which each simplex facet is paired. More... | |
Input and Output | |
void | writeTextShort (std::ostream &out) const |
Writes a human-readable representation of this facet pairing to the given output stream. More... | |
std::string | toTextRep () const |
Returns a text-based representation of this facet pairing that can be used to reconstruct the facet pairing. More... | |
void | writeDot (std::ostream &out, const char *prefix=nullptr, bool subgraph=false, bool labels=false) const |
Writes the graph corresponding to this facet pairing in the Graphviz DOT language. More... | |
std::string | dot (const char *prefix=nullptr, bool subgraph=false, bool labels=false) const |
Returns a Graphviz DOT representation of the graph that describes this facet pairing. More... | |
static FacetPairing< dim > | fromTextRep (const std::string &rep) |
Reconstructs a facet pairing from a text-based representation. More... | |
static void | writeDotHeader (std::ostream &out, const char *graphName=nullptr) |
Writes header information for a Graphviz DOT file that will describe the graphs for one or more facet pairings. More... | |
static std::string | dotHeader (const char *graphName=nullptr) |
Returns header information for a Graphviz DOT file that will describe the graphs for one or more facet pairings. More... | |
template<typename Action , typename... Args> | |
static void | findAllPairings (size_t nSimplices, BoolSet boundary, int nBdryFacets, Action &&action, Args &&... args) |
Generates all possible facet pairings satisfying the given constraints. More... | |
FacetPairingBase (size_t size) | |
Creates a new facet pairing. More... | |
FacetSpec< dim > & | dest (const FacetSpec< dim > &source) |
Returns the other facet to which the given simplex facet is paired. More... | |
FacetSpec< dim > & | dest (size_t simp, unsigned facet) |
Returns the other facet to which the given simplex facet is paired. More... | |
FacetSpec< dim > & | operator[] (const FacetSpec< dim > &source) |
Returns the other facet to which the given simplex facet is paired. More... | |
bool | noDest (const FacetSpec< dim > &source) const |
Determines whether the matching for the given simplex facet has not yet been determined. More... | |
bool | noDest (size_t simp, unsigned facet) const |
Determines whether the matching for the given simplex facet has not yet been determined. More... | |
bool | isCanonicalInternal (IsoList &list) const |
Determines whether this facet pairing is in canonical (smallest lexicographical) form, given a small set of assumptions. More... | |
Provides core functionality for facet pairings (that is, dual graphs) of dim-dimensional triangulations.
Such a facet pairing is represented by the class FacetPairing<dim>, which uses this as a base class. End users should not need to refer to FacetPairingBase directly.
See the FacetPairing class notes for further information.
Both this class and the "end user" class FacetPairing<dim> implement C++ move semantics, and FacetPairing<dim> also adheres to the C++ Swappable requirement. These classes are designed to avoid deep copies wherever possible, even when passing or returning objects by value.
dim | the dimension of the triangulation. This must be between 2 and 15 inclusive. |
using regina::detail::FacetPairingBase< dim >::IsoList = std::list<Isomorphism<dim> > |
A list of isomorphisms on facet pairings.
Such an isomorphism can be used to convert one facet pairing into another.
This type is used to store all automorphisms of a facet pairing; that is, all isomorphisms that map the facet pairing to itself.
|
inline |
Creates a new copy of the given facet pairing.
src | the facet pairing to clone. |
|
inlinenoexcept |
Moves the given facet pairing into this facet pairing.
This is a fast (constant time) operation.
The facet pairing that is passed (src) will no longer be usable.
src | the facet pairing to move. |
regina::detail::FacetPairingBase< dim >::FacetPairingBase | ( | const Triangulation< dim > & | tri | ) |
Creates the facet pairing of given triangulation.
This is the facet pairing that describes how the facets of simplices in the given triangulation are joined together, as described in the class notes.
tri | the triangulation whose facet pairing should be constructed. |
regina::detail::FacetPairingBase< dim >::FacetPairingBase | ( | std::istream & | in | ) |
Reads a new facet pairing from the given input stream.
This routine reads data in the format written by toTextRep().
This routine will skip any initial whitespace in the given input stream. Once it finds its first non-whitespace character, it will read the entire line from the input stream and expect that line to containin the text representation of a facet pairing.
InvalidInput | the data found in the input stream is invalid, incomplete, or incorrectly formatted. |
in | the input stream from which to read. |
|
inline |
Deallocates any memory used by this structure.
|
inlineprotected |
Creates a new facet pairing.
All internal arrays will be allocated but not initialised.
size | the number of simplices under consideration in this new facet pairing. |
|
inlineprotected |
Returns the other facet to which the given simplex facet is paired.
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
source | the facet under investigation. |
|
inline |
Returns the other facet to which the given simplex facet is paired.
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
source | the facet under investigation. |
|
inlineprotected |
Returns the other facet to which the given simplex facet is paired.
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
simp | the simplex under investigation (this must be strictly less than the total number of simplices under consideration). |
facet | the facet of the given simplex under investigation (between 0 and dim inclusive). |
|
inline |
Returns the other facet to which the given simplex facet is paired.
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
simp | the simplex under investigation (this must be strictly less than the total number of simplices under consideration). |
facet | the facet of the given simplex under investigation (between 0 and dim inclusive). |
|
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.
std::string regina::detail::FacetPairingBase< dim >::dot | ( | const char * | prefix = nullptr , |
bool | subgraph = false , |
||
bool | labels = false |
||
) | const |
Returns a Graphviz DOT representation of the graph that describes this facet pairing.
This routine simply returns the output of writeDot() as a string, instead of dumping it to an output stream.
All arguments are the same as for writeDot(); see the writeDot() notes for further details.
|
static |
Returns header information for a Graphviz DOT file that will describe the graphs for one or more facet pairings.
This routine simply returns the output of writeDotHeader() as a string, instead of dumping it to an output stream.
All arguments are the same as for writeDotHeader(); see the writeDotHeader() notes for further details.
|
inlinestatic |
Generates all possible facet pairings satisfying the given constraints.
Only connected facet pairings (pairings in which each simplex can be reached from each other via a series of individual matched facets) will be produced.
Each facet pairing will be produced precisely once up to isomorphism. Facet pairings are considered isomorphic if they are related by a relabelling of the simplices and/or a renumbering of the (dim + 1) facets of each simplex. Each facet pairing that is generated will be a lexicographically minimal representative of its isomorphism class, i.e., will be in canonical form as described by isCanonical().
For each facet pairing that is generated, this routine will call action (which must be a function or some other callable object).
void
.Because this class cannot represent an empty facet pairing, if the argument nSimplices is zero then no facet pairings will be generated at all.
Optimise (long-term): When generating facet pairings, do some checking to eliminate cases in which simplex (k > 0) can be swapped with simplex 0 to produce a smaller representation of the same pairing.
Feature: Allow cancellation of facet pairing generation.
nSimplices | the number of simplices whose facets should be (potentially) matched. |
boundary | determines whether any facets may be left unmatched. This set should contain true if pairings with at least one unmatched facet are to be generated, and should contain false if pairings with no unmatched facets are to be generated. |
nBdryFacets | specifies the precise number of facets that should be left unmatched. If this parameter is negative, it is ignored and no additional restriction is imposed. If parameter boundary does not contain true , this parameter is likewise ignored. If parameter boundary does contain true and this parameter is non-negative, only pairings with precisely this many unmatched facets will be generated. In particular, if this parameter is positive then pairings with no unmatched facets will not be produced irrespective of whether false is contained in parameter boundary. Note that, in order to produce any pairings at all, this parameter must be of the same parity as nSimplices * (dim+1) , and can be at most (dim-1) * nSimplices + 2 . |
action | a function (or other callable object) to call for each facet pairing that is found. |
args | any additional arguments that should be passed to action, following the initial facet pairing and automorphism arguments. |
|
inline |
Returns the set of all combinatorial automorphisms of this facet pairing.
An automorphism is a relabelling of the simplices and/or a renumbering of the (dim + 1) facets of each simplex resulting in precisely the same facet pairing.
This routine uses optimisations that can cause unpredictable breakages if this facet pairing is not in canonical form.
|
static |
Reconstructs a facet pairing from a text-based representation.
This text-based representation must be in the format produced by routine toTextRep().
InvalidArgument | the given string was not a valid text-based representation of a facet pairing on a positive number of simplices. |
rep | a text-based representation of a facet pairing, as produced by routine toTextRep(). |
bool regina::detail::FacetPairingBase< dim >::isCanonical | ( | ) | const |
Determines whether this facet pairing is in canonical form, i.e., is a lexicographically minimal representative of its isomorphism class.
Isomorphisms of facet pairings correspond to relabellings of simplices and relabellings of the (dim + 1) facets within each simplex.
Facet pairings are ordered by lexicographical comparison of dest(0,0)
, dest(0,1)
, ..., dest(size()-1,dim)
.
true
if and only if this facet pairing is in canonical form.
|
protected |
Determines whether this facet pairing is in canonical (smallest lexicographical) form, given a small set of assumptions.
If this facet pairing is in canonical form, the given list will be filled with the set of all combinatorial automorphisms of this facet pairing. If not, the given list will be left empty.
dest(t,i)
is greater than dest(t,i+1)
is where facets (t,i)
and (t,i+1)
are paired together. dest(t,0).simp < t
. dest(1,0)
, dest(2,0)
, ..., dest(n-1,0)
is strictly increasing, where n is the total number of simplices under investigation.list | the list into which automorphisms will be placed if appropriate. |
true
if and only if this facet pairing is in canonical form. bool regina::detail::FacetPairingBase< dim >::isClosed | ( | ) | const |
Determines whether this facet pairing is closed.
A closed facet pairing has no unmatched facets.
|
inline |
Determines whether the given simplex facet has been left deliberately unmatched.
source | the facet under investigation. |
true
if the given facet has been left unmatched, or false
if the given facet is paired with some other facet.
|
inline |
Determines whether the given simplex facet has been left deliberately unmatched.
simp | the simplex under investigation (this must be strictly less than the total number of simplices under consideration). |
facet | the facet of the given simplex under investigation (between 0 and dim inclusive). |
true
if the given facet has been left unmatched, or false
if the given facet is paired with some other facet.
|
inlineprotected |
Determines whether the matching for the given simplex facet has not yet been determined.
This is signalled by a facet matched to itself.
source | the facet under investigation. |
true
if the matching for the given facet has not yet been determined, or false
otherwise.
|
inlineprotected |
Determines whether the matching for the given simplex facet has not yet been determined.
This is signalled by a facet matched to itself.
simp | the simplex under investigation (this must be strictly less than the total number of simplices under consideration). |
facet | the facet of the given simplex under investigation (between 0 and dim inclusive). |
true
if the matching for the given facet has not yet been determined, or false
otherwise. bool regina::detail::FacetPairingBase< dim >::operator!= | ( | const FacetPairing< dim > & | other | ) | const |
Determines if this and the given facet pairing are not identical.
other | the facet pairing to compare with this. |
true
if and only if this and the given facet pairing are not identical.
|
inline |
Copies the given facet pairing into this facet pairing.
It does not matter if this and the given facet pairing use different numbers of top-dimensional simpilices; if they do then this facet pairing will be resized accordingly.
This operator induces a deep copy of src.
src | the facet pairing to copy. |
|
inlinenoexcept |
Moves the given facet pairing into this facet pairing.
This is a fast (constant time) operation.
It does not matter if this and the given facet pairing use different numbers of top-dimensional simpilices; if they do then this facet pairing will be resized accordingly.
The facet pairing that is passed (src) will no longer be usable.
src | the facet pairing to move. |
bool regina::detail::FacetPairingBase< dim >::operator== | ( | const FacetPairing< dim > & | other | ) | const |
Determines if this and the given facet pairing are identical.
other | the facet pairing to compare with this. |
true
if and only if this and the given facet pairing are identical.
|
inlineprotected |
Returns the other facet to which the given simplex facet is paired.
This is a convenience operator whose behaviour is identical to that of dest(const FacetSpec<dim>&).
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
source | the facet under investigation. |
|
inline |
Returns the other facet to which the given simplex facet is paired.
This is a convenience operator whose behaviour is identical to that of dest(const FacetSpec<dim>&).
If the given facet is left deliberately unmatched, the value returned will be boundary (as returned by FacetSpec<dim>::isBoundary()).
source | the facet under investigation. |
|
inline |
Returns the number of simplices whose facets are described by this facet pairing.
|
inherited |
Returns a short text representation of this object.
This text should be human-readable, should use plain ASCII characters where possible, and should not contain any newlines.
Within these limits, this short text ouptut should be as information-rich as possible, since in most cases this forms the basis for the Python str()
and repr()
functions.
str()
will use precisely this function, and for most classes the Python repr()
function will incorporate this into its output.
|
inlinenoexcept |
Swaps the contents of this and the given facet pairing.
other | the facet pairing whose contents are to be swapped with this. |
std::string regina::detail::FacetPairingBase< dim >::toTextRep | ( | ) | const |
Returns a text-based representation of this facet pairing that can be used to reconstruct the facet pairing.
This reconstruction is done through routine fromTextRep().
The text produced is not particularly readable; for a human-readable text representation, see routine str() instead.
The string returned will contain no newlines.
|
inherited |
Returns a short text representation of this object using unicode characters.
Like str(), this text should be human-readable, should not contain any newlines, and (within these constraints) should be as information-rich as is reasonable.
Unlike str(), this function may use unicode characters to make the output more pleasant to read. The string that is returned will be encoded in UTF-8.
void regina::detail::FacetPairingBase< dim >::writeDot | ( | std::ostream & | out, |
const char * | prefix = nullptr , |
||
bool | subgraph = false , |
||
bool | labels = false |
||
) | const |
Writes the graph corresponding to this facet pairing in the Graphviz DOT language.
Every vertex of this graph represents a simplex, and every edge represents a pair of simplex facets that are joined together. Note that for a closed triangulation this graph will be entirely (dim + 1)-valent; for triangulations with boundary facets, some graph vertices will have degree dim or less.
The graph can either be written as a complete DOT graph, or as a clustered subgraph within some larger DOT graph (according to whether the argument subgraph is passed as false
or true
).
If a complete DOT graph is being written, the output may be used as a standalone DOT file ready for use with Graphviz.
If a subgraph is being written, the output will contain a single subgraph
section that should be inserted into some larger DOT file. Note that the output generated by writeDotHeader(), followed by one or more subgraphs and then a closing curly brace will suffice. The subgraph name will begin with the string pairing_
.
The argument prefix will be prepended to the name of each graph vertex, and will also be used in the name of the graph or subgraph. Using unique prefixes becomes important if you are calling writeDot() several times to generate several subgraphs for use in a single DOT file. If the prefix argument is null or empty then a default prefix will be used.
Note that this routine generates undirected graphs, not directed graphs. The final DOT file should be used with either the neato or fdp programs shipped with Graphviz.
out | the output stream to which to write. |
prefix | a string to prepend to the name of each graph vertex, and to include in the graph or subgraph name; see above for details. |
subgraph | false if a complete standalone DOT graph should be output, or true if a clustered subgraph should be output for use in some larger DOT file. |
labels | indicates whether graph vertices will be labelled with the corresponding simplex numbers. This feature is currently experimental, and the default is false . |
|
static |
Writes header information for a Graphviz DOT file that will describe the graphs for one or more facet pairings.
See the writeDot() documentation for further information on such graphs.
The output will be in the Graphviz DOT language, and will include appropriate display settings for graphs, edges and nodes. The opening brace for a graph
section of the DOT file is included.
This routine may be used with writeDot() to generate a single DOT file containing the graphs for several different facet pairings. A complete DOT file can be produced by calling this routine, then calling writeDot() in subgraph mode for each facet pairing, then outputting a final closing curly brace.
Note that if you require a DOT file containing the graph for only a single facet pairing, this routine is unnecessary; you may simply call writeDot() in full graph mode instead.
This routine is suitable for generating undirected graphs, not directed graphs. The final DOT file should be used with either the neato or fdp programs shipped with Graphviz.
out | the output stream to which to write. |
graphName | the name of the graph in the DOT file. If this is null or empty then a default graph name will be used. |
|
inlineinherited |
A default implementation for detailed output.
This routine simply calls T::writeTextShort() and appends a final newline.
out | the output stream to which to write. |
void regina::detail::FacetPairingBase< dim >::writeTextShort | ( | std::ostream & | out | ) | const |
Writes a human-readable representation of this facet pairing to the given output stream.
The string returned will contain no newlines.
out | the output stream to which to write. |
|
protected |
The other facet to which each simplex facet is paired.
If a simplex facet is left unmatched, the corresponding element of this array will be boundary (as returned by FacetSpec<dim>::isBoundary()). If the destination for a particular facet has not yet been decided, the facet will be paired to itself.
|
protected |
The number of simplices under consideration.