Regina 7.3 Calculation Engine
|
A specialised class that computes a large amount of detailed homological information for a 3-manifold triangulation. More...
#include <triangulation/dim3/homologicaldata.h>
Public Member Functions | |
HomologicalData (const Triangulation< 3 > &input) | |
Takes as input a triangulation. More... | |
HomologicalData (const HomologicalData &)=default | |
Creates a new copy of the given object. More... | |
HomologicalData (HomologicalData &&) noexcept=default | |
Moves the contents of the given object into this new object. More... | |
HomologicalData & | operator= (const HomologicalData &)=default |
Sets this to be a copy of the given object. More... | |
HomologicalData & | operator= (HomologicalData &&) noexcept=default |
Moves the contents of the given object into this object. More... | |
void | swap (HomologicalData &other) noexcept |
Swaps the contents of this and the given object. More... | |
void | writeTextShort (std::ostream &out) const |
Writes a short text representation of this object to the given output stream. More... | |
const MarkedAbelianGroup & | homology (unsigned q) |
This routine gives access to the manifold's homology computed with the regular CW-decomposition. More... | |
const MarkedAbelianGroup & | bdryHomology (unsigned q) |
This routine gives access to the homology of the boundary of the manifold, computed with the regular CW-decomposition. More... | |
const HomMarkedAbelianGroup & | bdryHomologyMap (unsigned q) |
This routine gives access to the homomorphism from the homology of the boundary to the homology of the manifold. More... | |
const MarkedAbelianGroup & | dualHomology (unsigned q) |
This routine gives access to the manifold's homology computed with the dual CW-decomposition. More... | |
const HomMarkedAbelianGroup & | h1CellAp () |
Returns the isomorphism from dualHomology(1) to homology(1) given by a cellular approximation to the identity map on the manifold. More... | |
unsigned long | countStandardCells (unsigned dimension) |
Returns the number of cells of the given dimension in the standard genuine CW-decomposition of the manifold. More... | |
unsigned long | countDualCells (unsigned dimension) |
Returns the number of cells of the given dimension in the dual CW-decomposition of the manifold. More... | |
unsigned long | countBdryCells (unsigned dimension) |
Returns the number of cells of the given dimension in the standard CW-decomposition of the boundary of the manifold. More... | |
long | eulerChar () |
The proper Euler characteristic of the manifold, computed from the dual CW-decomposition. More... | |
const std::vector< std::pair< Integer, std::vector< unsigned long > > > & | torsionRankVector () |
Returns the torsion form rank vector. More... | |
const std::string & | torsionRankVectorString () |
Same as torsionRankVector() but returns as a human-readable string. More... | |
const std::vector< LargeInteger > & | torsionSigmaVector () |
Returns the 2-torsion sigma vector. More... | |
const std::string & | torsionSigmaVectorString () |
Same as torsionSigmaVector() but returns as a human-readable string. More... | |
const std::vector< std::pair< Integer, std::vector< int > > > & | torsionLegendreSymbolVector () |
Returns the odd p-torsion Legendre symbol vector. More... | |
const std::string & | torsionLegendreSymbolVectorString () |
Same as torsionLegendreSymbolVector() but returns as a human-readable string. More... | |
bool | formIsHyperbolic () |
Returns true iff torsion linking form is ‘hyperbolic’ in the linking-form sense of the word. More... | |
bool | formIsSplit () |
Returns true iff the torsion linking form is split. More... | |
bool | formSatKK () |
Returns true iff the torsion linking form satisfies the Kawauchi-Kojima 2-torsion condition. More... | |
const std::string & | embeddabilityComment () |
Returns a comment on whether the manifold might embed in a homology 3-sphere or 4-sphere. More... | |
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... | |
A specialised class that computes a large amount of detailed homological information for a 3-manifold triangulation.
This class is both heavyweight and specialised. If you just wish to compute homology or Euler characteristic, or even map faces of the skeleton to classes in the homology groups, the Triangulation class has simpler and slicker member functions that can do this for you. See for example the Triangulation functions homology(), eulerCharTri(), eulerCharManifold(), and markedHomology().
The most important thing that HomologicalData adds is the ability to work with the torsion linking form. Be aware however that the code that computes the torsion linking form includes some floating-point arithmetic, and this could be subject to round-off error. Such errors are not expected, since the floating-point code is simply distinguishing different multiples of a known irrational, but nevertheless these results should be considered non-rigorous.
Currently, the information computed by HomologicalData includes:
This class takes a "least effort" approach to all computations. It only computes what is neccessary for your requests. It also keeps a record of all previous computations you've made. If a computation can be sped up by not recomputing some data, it takes that short-cut.
All these algorithms use two transverse CW decompositions of the manifold. They correspond to the (possibly ideal) triangulation native to Regina, and the dual polyhedral (CW) decomposition which appears in Seifert and Threlfall's textbook.
In the following lists we describe the canonical ordering of both the cells and the dual cells of the given triangulation.
First we list the cell orderings for the standard CW decomposition, which most closely resembles the ideal triangulation.
Next we list the cell orderings for the dual CW decomposition: if the standard CW decomposition came from a morse function f, this would be the one for -f.
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. Be aware, however, that it contains an enormous amount of internal data, and even moves will still be relatively expensive - you should try to use just the one HomologicalData object and not copy or move it at all, if possible.
This class will eventually be removed in a future release of Regina.
|
inline |
Takes as input a triangulation.
This class will maintain a fixed snapshot of the given triangulation as it is at this point in time. You are free to edit or even destroy the input triangulation later on; if you do then this HomologicalData object will automatically take its own deep copy of the original and continue to use that for its own internal reference.
input | the triangulation to use. |
|
default |
Creates a new copy of the given object.
This constructor induces a deep copy of the given object; moreover, this is expensive since HomologicalData objects are very large.
|
defaultnoexcept |
Moves the contents of the given object into this new object.
This operation is constant time, but it is still expensive constant time because HomologicalData objects are very large.
The object that was passed will no longer be usable.
const MarkedAbelianGroup & regina::HomologicalData::bdryHomology | ( | unsigned | q | ) |
This routine gives access to the homology of the boundary of the manifold, computed with the regular CW-decomposition.
q | the dimension of the homology group: can be 0, 1 or 2. |
const HomMarkedAbelianGroup & regina::HomologicalData::bdryHomologyMap | ( | unsigned | q | ) |
This routine gives access to the homomorphism from the homology of the boundary to the homology of the manifold.
q | the dimension of the map: can be 0, 1 or 2. |
|
inline |
Returns the number of cells of the given dimension in the standard CW-decomposition of the boundary of the manifold.
This is a subcomplex of the complex used in countStandardCells().
dimension | the dimension of the cells in question; this must be 0, 1 or 2. |
|
inline |
Returns the number of cells of the given dimension in the dual CW-decomposition of the manifold.
This is typically much smaller than countStandardCells().
dimension | the dimension of the cells in question; this must be 0, 1, 2 or 3. |
|
inline |
Returns the number of cells of the given dimension in the standard genuine CW-decomposition of the manifold.
In the case that the triangulation is a proper triangulation of a manifold (or delta-complex decomposition) it simply returns the same information as in the Triangulation<3> vertex, edge, face and tetrahedron lists.
In the case that this is an ideal triangulation, this algorithm returns the details of the corresponding compact manifold with boundary a union of closed surfaces.
dimension | the dimension of the cells in question; this must be 0, 1, 2 or 3. |
|
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.
const MarkedAbelianGroup & regina::HomologicalData::dualHomology | ( | unsigned | q | ) |
This routine gives access to the manifold's homology computed with the dual CW-decomposition.
This routine is typically faster than homology() since the dual CW-decomposition generally has far fewer cells.
Note that the groups returned by homology() and dualHomology() are isomorphic, though they are generally described by different presentations.
q | the dimension of the homology group: can be 0, 1, 2 or 3. |
|
inline |
Returns a comment on whether the manifold might embed in a homology 3-sphere or 4-sphere.
Basically, this routine runs through all the Kawauchi-Kojima conditions, plus a few other ‘elementary’ conditions.
Each comment will be formatted as one or more English sentences (i.e., with capitalisation and punctuation). The comments themselves are subject to change between releases of Regina, since later releases may have more detailed tests at their disposal.
This routine is available for both orientable and non-orientable triangulations. In the non-orientable case it may return additional information regarding the orientable double cover.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
The proper Euler characteristic of the manifold, computed from the dual CW-decomposition.
This routine calculates the Euler characteristic of the corresponding compact triangulated 3-manifold, with each ideal vertex treated as a surface boundary component.
This routine returns the same value as Triangulation<3>::eulerCharManifold(), though it computes it in a different way.
On the other hand, this routine differs from Triangulation<3>::eulerCharTri(), which handles ideal triangulations in a non-standard way (treating each ideal vertex as just a single vertex).
bool regina::HomologicalData::formIsHyperbolic | ( | ) |
Returns true iff torsion linking form is ‘hyperbolic’ in the linking-form sense of the word.
To be a little more precise, Poincare-duality in a compact orientable boundaryless manifold gives an isomorphism between the torsion subgroup of H_1(M) denoted tH_1(M) and Hom(tH_1(M),Q/Z), where Q is the rationals and Z the integers. The associated bilinear form (with values in Q/Z) is said to be ‘hyperbolic’ if tH_1(M) splits as a direct sum A+B such that Poincare duality sends A to Hom(B,Q/Z) and B to Hom(A,Q/Z).
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
true
iff the torsion linking form is hyperbolic.
|
inline |
Returns true iff the torsion linking form is split.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
true
iff the linking form is split.
|
inline |
Returns true iff the torsion linking form satisfies the Kawauchi-Kojima 2-torsion condition.
This condition states that on all elements x of order 2^k, 2^{k-1}form(x,x) = 0.
This is a neccessary condition for an orientable 3-manifold perhaps with boundary to embed in a homology 4-sphere.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
true
iff the form satisfies the 2-torsion condition of Kawauchi-Kojima. const HomMarkedAbelianGroup & regina::HomologicalData::h1CellAp | ( | ) |
Returns the isomorphism from dualHomology(1) to homology(1) given by a cellular approximation to the identity map on the manifold.
const MarkedAbelianGroup & regina::HomologicalData::homology | ( | unsigned | q | ) |
This routine gives access to the manifold's homology computed with the regular CW-decomposition.
This routine is typically slower than dualHomology(), since dualHomology() uses the dual CW-decomposition which typically has an order of magnitude fewer cells.
Note that the groups returned by homology() and dualHomology() are isomorphic, though they are generally described by different presentations.
q | the dimension of the homology group: can be 0, 1, 2 or 3. |
|
default |
Sets this to be a copy of the given object.
This operator induces a deep copy of the given object; moreover, this is expensive since HomologicalData objects are very large.
|
defaultnoexcept |
Moves the contents of the given object into this object.
This operation is constant time, but it is still expensive constant time because HomologicalData objects are very large.
The object that was passed will no longer be usable.
|
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.
|
noexcept |
Swaps the contents of this and the given object.
other | the object whose contents should be swapped with this. |
|
inline |
Returns the odd p-torsion Legendre symbol vector.
This is the last of the three Kawauchi-Kojima invariants.
For details, see "Algebraic classification of linking pairings on 3-manifolds", Akio Kawauchi and Sadayoshi Kojima, Math. Ann. 253 (1980), 29–42.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
Same as torsionLegendreSymbolVector() but returns as a human-readable string.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
Returns the torsion form rank vector.
This is the first of the three Kawauchi-Kojima complete invariants of the torsion linking form.
This vector describes the rank of the torsion subgroup of H1, given in prime power form. It is a vector of pairs (p, x), where p is a prime and x is its exponent.
For details, see "Algebraic classification of linking pairings on 3-manifolds", Akio Kawauchi and Sadayoshi Kojima, Math. Ann. 253 (1980), 29–42.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
Same as torsionRankVector() but returns as a human-readable string.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
Returns the 2-torsion sigma vector.
This is the second of the three Kawauchi-Kojima invariants. It is orientation-sensitive.
For details, see "Algebraic classification of linking pairings on 3-manifolds", Akio Kawauchi and Sadayoshi Kojima, Math. Ann. 253 (1980), 29–42.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
inline |
Same as torsionSigmaVector() but returns as a human-readable string.
This is an orientation-sensitive invariant.
UnsolvedCase | The torsion linking form could not be computed. This should be rare: the only way it can occur is during an internal rational-to-double conversion if the rational is out of range. |
|
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.
|
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::HomologicalData::writeTextShort | ( | std::ostream & | out | ) | const |
Writes a short text representation of this object to the given output stream.
Note this only writes pre-computed data. Thus if you have not yet asked HomologicalData to compute anything about this triangulation, writeTextShort may be empty.
out | the output stream to which to write. |