Regina 7.3 Calculation Engine
|
A collection of normal surfaces in a 3-manifold triangulation. More...
#include <surface/normalsurfaces.h>
Classes | |
class | VectorIterator |
A bidirectional iterator that runs through the raw vectors for surfaces in this list. More... | |
Public Member Functions | |
NormalSurfaces (const Triangulation< 3 > &triangulation, NormalCoords coords, NormalList which=NS_LIST_DEFAULT, NormalAlg algHints=NS_ALG_DEFAULT, ProgressTracker *tracker=nullptr) | |
A unified "enumeration constructor" for enumerating various classes of normal surfaces within a given triangulation. More... | |
NormalSurfaces (const NormalSurfaces &src, NormalTransform transform) | |
A unified "transform constructor" for transforming one normal surface list into another. More... | |
NormalSurfaces (const NormalSurfaces &src, const SurfaceFilter &filter) | |
A "filter constructor" that creates a new list filled with those surfaces from the given list that pass the given filter. More... | |
NormalSurfaces (const NormalSurfaces &)=default | |
Constructs a new copy of the given list. More... | |
NormalSurfaces (NormalSurfaces &&src) noexcept=default | |
Moves the given list into this new list. More... | |
NormalSurfaces & | operator= (const NormalSurfaces &src) |
Sets this to be a (deep) copy of the given list. More... | |
NormalSurfaces & | operator= (NormalSurfaces &&src) |
Moves the contents of the given list into this list. More... | |
void | swap (NormalSurfaces &other) |
Swaps the contents of this and the given list. More... | |
NormalCoords | coords () const |
Returns the coordinate system that was originally used to enumerate the surfaces in this list. More... | |
NormalList | which () const |
Returns details of which normal surfaces this list represents within the underlying triangulation. More... | |
NormalAlg | algorithm () const |
Returns details of the algorithm that was used to enumerate this list. More... | |
bool | allowsAlmostNormal () const |
Determines if the coordinate system that was used for enumeration allows for almost normal surfaces. More... | |
bool | allowsNonCompact () const |
Determines if the coordinate system that was used for enumeration allows for non-compact normal surfaces. More... | |
bool | isEmbeddedOnly () const |
Returns whether this list was constructed to contain only properly embedded surfaces. More... | |
const Triangulation< 3 > & | triangulation () const |
Returns the triangulation in which these normal surfaces live. More... | |
size_t | size () const |
Returns the number of surfaces stored in this list. More... | |
const NormalSurface & | surface (size_t index) const |
Returns the surface at the requested index in this list. More... | |
const NormalSurface & | operator[] (size_t index) const |
Returns the surface at the requested index in this list. More... | |
auto | begin () const |
Returns a C++ iterator at the beginning of this list of surfaces. More... | |
auto | end () const |
Returns a C++ iterator beyond the end of this list of surfaces. More... | |
auto | __iter__ () const |
Returns a Python iterator over the normal surfaces in this list. More... | |
bool | operator== (const NormalSurfaces &other) const |
Determines whether this and the given list contain the same set of normal (or almost normal) surfaces. More... | |
bool | operator!= (const NormalSurfaces &other) const |
Determines whether this and the given list contain different sets of normal (or almost normal) surfaces. 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... | |
template<typename Comparison > | |
void | sort (Comparison &&comp) |
Sorts the surfaces in this list according to the given criterion. More... | |
MatrixInt | recreateMatchingEquations () const |
Returns the matching equations that were used to create this normal surface list. More... | |
bool | saveCSVStandard (const char *filename, SurfaceExport additionalFields=regina::surfaceExportAll) const |
Exports this list of normal surfaces as a plain text CSV (comma-separated value) file, using standard coordinates. More... | |
bool | saveCSVEdgeWeight (const char *filename, SurfaceExport additionalFields=regina::surfaceExportAll) const |
Exports the given list of normal surfaces as a plain text CSV (comma-separated value) file, using edge weight coordinates. More... | |
VectorIterator | beginVectors () const |
A C++ iterator that gives access to the raw vectors for surfaces in this list, pointing to the beginning of this surface list. More... | |
VectorIterator | endVectors () const |
A C++ iterator that gives access to the raw vectors for surfaces in this list, pointing past the end of this surface list. More... | |
auto | vectors () const |
Returns a Python iterable object that iterates over the raw vectors for all surfaces in this list. More... | |
std::shared_ptr< PacketOf< NormalSurfaces > > | packet () |
Returns the packet that holds this data, if there is one. More... | |
std::shared_ptr< const PacketOf< NormalSurfaces > > | packet () const |
Returns the packet that holds this data, if there is one. More... | |
std::string | anonID () const |
A unique string ID that can be used in place of a packet ID. More... | |
std::string | str () const |
Returns a short text representation of this object. More... | |
std::string | utf8 () const |
Returns a short text representation of this object using unicode characters. More... | |
std::string | detail () const |
Returns a detailed text representation of this object. More... | |
Protected Member Functions | |
NormalSurfaces (NormalCoords coords, NormalList which, NormalAlg algorithm, const Triangulation< 3 > &triangulation) | |
Creates an empty list of normal surfaces with the given parameters. More... | |
NormalSurfaces (NormalCoords coords, NormalList which, NormalAlg algorithm, const SnapshotRef< Triangulation< 3 > > &triangulation) | |
Creates an empty list of normal surfaces with the given parameters. More... | |
Protected Attributes | |
std::vector< NormalSurface > | surfaces_ |
Contains all normal surfaces in this list. More... | |
SnapshotRef< Triangulation< 3 > > | triangulation_ |
The triangulation in which these normal surfaces lie. More... | |
NormalCoords | coords_ |
The coordinate system that was originally used to enumerate the normal surfaces in this list. More... | |
NormalList | which_ |
Indicates which normal surfaces these represent within the underlying triangulation. More... | |
NormalAlg | algorithm_ |
Stores the details of the enumeration algorithm that was used to generate this list. More... | |
PacketHeldBy | heldBy_ |
Indicates whether this Held object is in fact the inherited data for a PacketOf<Held>. More... | |
Friends | |
class | XMLNormalSurfacesReader |
class | XMLLegacyNormalSurfacesReader |
class | XMLWriter< NormalSurfaces > |
A collection of normal surfaces in a 3-manifold triangulation.
There are some important changes to this class as of Regina 7.0:
Since Regina 7.0, this is no longer a "packet type" that can be inserted directly into the packet tree. Instead a normal surface list is now a standalone mathematatical object, which makes it slimmer and faster for ad-hoc use. The consequences of this are:
See the NormalSurface class notes for details of what to do when introducing a new coordinate system.
This class implements C++ move semantics and adheres to the C++ Swappable requirement. It is designed to avoid deep copies wherever possible, even when passing or returning objects by value.
Feature: Allow custom matching equations.
Feature: Allow enumeration with some coordinates explicitly set to zero.
Feature: Allow generating only closed surfaces.
Feature: Generate facets of the solution space representing embedded surfaces.
|
inline |
A unified "enumeration constructor" for enumerating various classes of normal surfaces within a given triangulation.
The NormalCoords argument allows you to specify an underlying coordinate system in which to do the enumeration (e.g., standard coordinates, quadrilateral coordinates or almost normal coordinates). This choice of coordinate system will affect which surfaces are produced, since vertex/fundamental surfaces in one system are not necessarily vertex/fundamental in another.
The NormalList argument is a combination of flags that allows you to specify exactly which normal surfaces you require. This includes (i) whether you want all vertex surfaces or all fundamental surfaces, which defaults to NS_VERTEX if you specify neither or both; and (ii) whether you want only properly embedded surfaces or you also wish to include immersed and/or singular surfaces, which defaults to NS_EMBEDDED_ONLY if you specify neither or both.
The NormalAlg argument is a combination of flags that allows you to control the underlying enumeration algorithm. These flags are treated as hints only: if your selection of algorithm is invalid, unavailable or unsupported then Regina will choose something more appropriate. Unless you have some specialised need, the default NS_ALG_DEFAULT (which makes no hints at all) will allow Regina to choose what it thinks will be the most efficient method.
The enumerated surfaces will be stored in this new normal surface list, and their representations will be scaled down to use the smallest possible integer coordinates.
Unlike the old enumerate() function, the new normal surface list will not be inserted into the packet tree. Moreover, the given triangulation may change or even be destroyed without causing problems. See the class notes for details.
If a progress tracker is passed, this routine will declare and work through a series of stages whose combined weights sum to 1; typically this means that the given tracker must not have been used before.
This constructor will not return until the enumeration of surfaces is complete, regardless of whether a progress tracker was passed. If you need the behaviour of the old enumerate() (where passing a progress tracker caused the enumeration to start in the background), simply call this constructor in a new detached thread. Note that this enumeration can be extremely slow for larger triangulations, and so there could be good reasons to do this.
If an error occurs, then this routine will thrown an exception. In this case, no normal surface list will be created, and the progress tracker (if passed) will be marked as finished. See the exception specifications below for details.
InvalidArgument | The matching equations could not be created for the given triangulation in the given coordinate system, due to an error that should have been preventable with the right checks in advance. This can only happen in certain coordinate systems, and for all such coordinate systems this is explicitly described in the NormalCoords enum documentation. |
UnsolvedCase | The list of hypersurfaces could not be be created for the given triangulation in the given coordinate system, due to an error that was "genuinely" unforseeable. Currently there are two scenarios in which this could happen: (i) the matching equations could not be constructed, which can only happen in certain coordinate systems where this is explicitly described in the NormalCoords enum documentation; or (ii) the arguments require enumerating fundamental normal surfaces using the primal Hilbert basis algorithm, and Normaliz was unable to complete its portion of the task, which in theory should never happen at all. |
triangulation | the triangulation upon which this list of normal surfaces will be based. |
coords | the coordinate system to be used. This must be one of the system that Regina is able to use for enumeration; this is documented alongside each NormalCoords enum value. |
which | indicates which normal surfaces should be enumerated. |
algHints | passes requests to Regina for which specific enumeration algorithm should be used. |
tracker | a progress tracker through which progress will be reported, or null if no progress reporting is required. |
regina::NormalSurfaces::NormalSurfaces | ( | const NormalSurfaces & | src, |
NormalTransform | transform | ||
) |
A unified "transform constructor" for transforming one normal surface list into another.
The available transformations include:
Each transformation comes with its own set of preconditions, as documented alongside the various NormalTransform enumeration constants. These preconditions will be checked, and if any of them fails then this constructor will throw an exception (see below).
Unlike the old conversion and filter functions, this constructor will not insert the new normal surface list into the packet tree.
FailedPrecondition | The preconditions for the given transformation were not met. See each NormalTransform enum constant for the corresponding set of preconditions. |
src | the normal surface list that we wish to transform; this will not be modified. |
transform | the specific transformation to apply. |
regina::NormalSurfaces::NormalSurfaces | ( | const NormalSurfaces & | src, |
const SurfaceFilter & | filter | ||
) |
A "filter constructor" that creates a new list filled with those surfaces from the given list that pass the given filter.
Unlike the old filter() function, this constructor will not insert the new normal surface list into the packet tree.
For this new filtered list, which() will include the NS_CUSTOM flag, and algorithm() will include the NS_ALG_CUSTOM flag.
src | the normal surface list that we wish to filter; this will not be modified. |
filter | the filter to apply to the given list. |
|
default |
Constructs a new copy of the given list.
|
defaultnoexcept |
Moves the given list into this new list.
This is a fast (constant time) operation.
The list that is passed will no longer be usable.
noexcept
, and in particular does not fire any change events. This is because this list is freshly constructed (and therefore has no listeners yet), and because we assume that src is about to be destroyed (an action that will fire a packet destruction event).src | the list to move. |
|
inlineprotected |
Creates an empty list of normal surfaces with the given parameters.
|
inlineprotected |
Creates an empty list of normal surfaces with the given parameters.
auto regina::NormalSurfaces::__iter__ | ( | ) | const |
Returns a Python iterator over the normal surfaces in this list.
In Python, a normal surface list can be treated as an iterable object:
for
loop.
|
inline |
Returns details of the algorithm that was used to enumerate this list.
These may not be the same NormalAlg flags that were passed to the class constructor. In particular, default values will have been explicitly filled in, invalid and/or redundant values will have been removed, and unavailable and/or unsupported combinations of algorithm flags will be replaced with whatever algorithm was actually used.
|
inline |
Determines if the coordinate system that was used for enumeration allows for almost normal surfaces.
This does not test whether any of the surfaces in this list actually contain octagons: it simply returns a basic property of the coordinate system that was used for enumeration.
true
if and only if almost normal surfaces are supported.
|
inline |
Determines if the coordinate system that was used for enumeration allows for non-compact normal surfaces.
This does not test whether any of the surfaces in this list are actually non-compact: it simply returns a basic property of the coordinate system that was used for enumeration.
true
if and only if non-compact normal surfaces are supported.
|
inherited |
A unique string ID that can be used in place of a packet ID.
This is an alternative to Packet::internalID(), and is designed for use when Held is not actually wrapped by a PacketOf<Held>. (An example of such a scenario is when a normal surface list needs to write its triangulation to file, but the triangulation is a standalone object that is not stored in a packet.)
The ID that is returned will:
These IDs are not preserved when copying or moving one object to another, and are not preserved when writing to a Regina data file and then reloading the file contents.
See Packet::internalID() for further details.
|
inline |
Returns a C++ iterator at the beginning of this list of surfaces.
These begin() and end() functions allow you to iterate through all surfaces in this list using a range-based for
loop:
The type that is returned will be a lightweight iterator type, guaranteed to satisfy the C++ LegacyRandomAccessIterator requirement. The precise C++ type of the iterator is subject to change, so C++ users should use auto
(just like this declaration does).
|
inline |
A C++ iterator that gives access to the raw vectors for surfaces in this list, pointing to the beginning of this surface list.
|
inline |
Returns the coordinate system that was originally used to enumerate the surfaces in this list.
|
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.
|
inline |
Returns a C++ iterator beyond the end of this list of surfaces.
These begin() and end() routines allow you to iterate through all surfaces in this list using a range-based for
loop. See the begin() documentation for further details.
|
inline |
A C++ iterator that gives access to the raw vectors for surfaces in this list, pointing past the end of this surface list.
This iterator is not dereferenceable.
|
inline |
Returns whether this list was constructed to contain only properly embedded surfaces.
If this returns false
, it does not guarantee that immersed and/or singular surfaces are present; it merely indicates that they were not deliberately excluded (for instance, the quadrilateral constraints were not enforced).
true
if this list was constructed to contain only properly embedded surfaces, or false
otherwise.
|
inline |
Determines whether this and the given list contain different sets of normal (or almost normal) surfaces.
The lists will be compared as multisets: the order of the surfaces in each list does not matter; however, in the unusual scenario where a list the same surface multiple times, multiplicity does matter.
Like the comparison operators for NormalSurface, it does not matter whether the lists work with different triangulations, or different encodings, or if one but not the other supports almost normal and/or spun-normal surfaces. The individual surfaces will simply be compared by examining or computing the number of discs of each type.
In particular, this routine is safe to call even if this and the given list work with different triangulations:
true
(i.e., the lists will be considered different).other | the list to be compared with this list. |
true
if both lists do not represent the same multiset of normal or almost normal surfaces, or false
if they do.
|
inline |
Sets this to be a (deep) copy of the given list.
src | the list to copy. |
|
inline |
Moves the contents of the given list into this list.
This is a fast (constant time) operation.
The list that is passed (src) will no longer be usable.
noexcept
, since it fires change events on this list which may in turn call arbitrary code via any registered packet listeners. It deliberately does not fire change events on src, since it assumes that src is about to be destroyed (which will fire a destruction event instead).src | the list to move. |
bool regina::NormalSurfaces::operator== | ( | const NormalSurfaces & | other | ) | const |
Determines whether this and the given list contain the same set of normal (or almost normal) surfaces.
The lists will be compared as multisets: the order of the surfaces in each list does not matter; however, in the unusual scenario where a list the same surface multiple times, multiplicity does matter.
Like the comparison operators for NormalSurface, it does not matter whether the lists work with different triangulations, or different encodings, or if one but not the other supports almost normal and/or spun-normal surfaces. The individual surfaces will simply be compared by examining or computing the number of discs of each type.
In particular, this routine is safe to call even if this and the given list work with different triangulations:
false
.other | the list to be compared with this list. |
true
if both lists represent the same multiset of normal or almost normal surfaces, or false
if not.
|
inline |
|
inlineinherited |
Returns the packet that holds this data, if there is one.
If this object is being held by a packet p of type PacketOf<Held>, then that packet p will be returned. Otherwise, if this is a "standalone" object of type Held, then this routine will return null
.
There is a special case when dealing with a packet q that holds a SnapPea triangulation. Here q is of type PacketOf<SnapPeaTriangulation>, and it holds a Triangulation<3> "indirectly" in the sense that Packetof<SnapPeaTriangulation> derives from SnapPeaTriangulation, which in turn derives from Triangulation<3>. In this scenario:
null
, since there is no "direct" PacketOf<Triangulation<3>>;The function inAnyPacket() is specific to Triangulation<3>, and is not offered for other Held types.
null
if this data is not (directly) held by a packet.
|
inlineinherited |
Returns the packet that holds this data, if there is one.
See the non-const version of this function for further details, and in particular for how this functions operations in the special case of a packet that holds a SnapPea triangulation.
null
if this data is not (directly) held by a packet. MatrixInt regina::NormalSurfaces::recreateMatchingEquations | ( | ) | const |
Returns the matching equations that were used to create this normal surface list.
The matrix is not cached: multiple calls to this routine will result in the construction of multiple matrices. This routine in fact merely calls makeMatchingEquations() with the appropriate parameters.
The format of the matrix is identical to that returned by makeMatchingEquations().
Note that there are situations in which makeMatchingEquations() throws an exception (because the triangulation is not supported by the chosen coordinate system). However, this routine will always succeed, because if makeMatchingEquations() had failed then this normal surface list would not have been created in the first place.
bool regina::NormalSurfaces::saveCSVEdgeWeight | ( | const char * | filename, |
SurfaceExport | additionalFields = regina::surfaceExportAll |
||
) | const |
Exports the given list of normal surfaces as a plain text CSV (comma-separated value) file, using edge weight coordinates.
CSV files are human-readable and human-editable, and are suitable for importing into spreadsheets and databases.
The surfaces will be exported in edge weight coordinates. Thus there will be one coordinate for each edge of the underlying triangulation; each such coordinate will become a separate field in the CSV file.
As well as the normal surface coordinates, additional properties of the normal surfaces (such as Euler characteristic, orientability, and so on) can be included as extra fields in the export. Users can select precisely which properties to include by passing a bitwise OR combination of constants from the regina::SurfaceExportFields enumeration type.
The CSV format used here begins with a header row, and uses commas as field separators. Text fields with arbitrary contents are placed inside double quotes, and the double quote character itself is represented by a pair of double quotes. Thus the string my "normal" surface's name
would be stored as "my ""normal"" surface's name"
.
filename | the name of the CSV file to export to. |
additionalFields | a bitwise OR combination of constants from regina::SurfaceExportFields indicating which additional properties of surfaces should be included in the export. |
true
if the export was successful, or false
otherwise. bool regina::NormalSurfaces::saveCSVStandard | ( | const char * | filename, |
SurfaceExport | additionalFields = regina::surfaceExportAll |
||
) | const |
Exports this list of normal surfaces as a plain text CSV (comma-separated value) file, using standard coordinates.
CSV files are human-readable and human-editable, and are suitable for importing into spreadsheets and databases.
The surfaces will be exported in standard coordinates (tri-quad coordinates for normal surfaces, or tri-quad-oct coordinates for almost normal surfaces). Each coordinate will become a separate field in the CSV file.
As well as the normal surface coordinates, additional properties of the normal surfaces (such as Euler characteristic, orientability, and so on) can be included as extra fields in the export. Users can select precisely which properties to include by passing a bitwise OR combination of constants from the regina::SurfaceExportFields enumeration type.
The CSV format used here begins with a header row, and uses commas as field separators. Text fields with arbitrary contents are placed inside double quotes, and the double quote character itself is represented by a pair of double quotes. Thus the string my "normal" surface's name
would be stored as "my ""normal"" surface's name"
.
filename | the name of the CSV file to export to. |
additionalFields | a bitwise OR combination of constants from regina::SurfaceExportFields indicating which additional properties of surfaces should be included in the export. |
true
if the export was successful, or false
otherwise.
|
inline |
Returns the number of surfaces stored in this list.
|
inline |
Sorts the surfaces in this list according to the given criterion.
This sort is stable, i.e., surfaces that are equivalent under the given criterion will remain in the same relative order.
The implementation of this routine uses std::stable_sort.
comp | a binary function (or other callable object) that accepts two const NormalSurface references, and returns true if and only if the first surface should appear before the second in the sorted list. |
|
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.
|
inline |
Returns the surface at the requested index in this list.
This is identical to using the square bracket operator.
index | the index of the requested surface in this list; this must be between 0 and size()-1 inclusive. |
void regina::NormalSurfaces::swap | ( | NormalSurfaces & | other | ) |
Swaps the contents of this and the given list.
This routine will behave correctly if other is in fact this list.
noexcept
, since it fires change events on both lists which may in turn call arbitrary code via any registered packet listeners.other | the list whose contents should be swapped with this. |
|
inline |
Returns the triangulation in which these normal surfaces live.
This will be a snapshot frozen in time of the triangulation that was originally passed to the NormalSurfaces constructor.
This will return a correct result even if the original triangulation has since been modified or destroyed. However, in order to ensure this behaviour, it is possible that at different points in time this function may return references to different C++ objects.
The rules for using the triangulation() reference are:
|
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.
auto regina::NormalSurfaces::vectors | ( | ) | const |
Returns a Python iterable object that iterates over the raw vectors for all surfaces in this list.
For example:
|
inline |
Returns details of which normal surfaces this list represents within the underlying triangulation.
This may not be the same NormalList that was passed to the class constructor. In particular, default values will have been explicitly filled in (such as NS_VERTEX and/or NS_EMBEDDED_ONLY), and invalid and/or redundant values will have been removed.
void regina::NormalSurfaces::writeTextLong | ( | std::ostream & | out | ) | const |
Writes a detailed text representation of this object to the given output stream.
out | the output stream to which to write. |
void regina::NormalSurfaces::writeTextShort | ( | std::ostream & | out | ) | const |
Writes a short text representation of this object to the given output stream.
out | the output stream to which to write. |
|
protected |
Stores the details of the enumeration algorithm that was used to generate this list.
This might not be the same as the algHints flag that was originally passed to the enumeration routine (e.g., if invalid or inappropriate flags were passed).
|
protected |
The coordinate system that was originally used to enumerate the normal surfaces in this list.
|
protectedinherited |
Indicates whether this Held object is in fact the inherited data for a PacketOf<Held>.
As a special case, this field is also used to indicate when a Triangulation<3> is in fact the inherited data for a SnapPeaTriangulation. See the PacketHeldBy enumeration for more details on the different values that this data member can take.
|
protected |
Contains all normal surfaces in this list.
|
protected |
The triangulation in which these normal surfaces lie.
|
protected |
Indicates which normal surfaces these represent within the underlying triangulation.