Regina Calculation Engine

Represents a general Seifert fibred space, which may be orientable or nonorientable. More...
#include <manifold/nsfs.h>
Public Types  
enum  classType { o1 = 101, o2 = 102, n1 = 201, n2 = 202, n3 = 203, n4 = 204, bo1 = 301, bo2 = 302, bn1 = 401, bn2 = 402, bn3 = 403 } 
Lists the six classes o1 , o2 , n1 , n2 , n3 , n4 for base orbifolds without boundaries, plus five classes bo1 , b02 , bn1 , bn2 , bn3 for base orbifolds with boundaries. More...  
Public Member Functions  
NSFSpace ()  
Creates a new Seifert fibred space with base orbifold the 2sphere and no exceptional fibres. More...  
NSFSpace (classType useClass, unsigned long genus, unsigned long punctures=0, unsigned long puncturesTwisted=0, unsigned long reflectors=0, unsigned long reflectorsTwisted=0)  
Creates a new Seifert fibred space of the given class with the given base orbifold and no exceptional fibres. More...  
NSFSpace (const NSFSpace &cloneMe)  
Creates a new Seifert fibred space that is a clone of the given space. More...  
virtual  ~NSFSpace () 
Destroys this Seifert fibred space. More...  
void  operator= (const NSFSpace &cloneMe) 
Modifies this Seifert fibred space to be a clone of the given space. More...  
classType  baseClass () const 
Returns which of the eleven predefined classes this space belongs to. More...  
unsigned long  baseGenus () const 
Returns the genus of the base orbifold. More...  
bool  baseOrientable () const 
Returns whether or not the base surface is orientable. More...  
bool  fibreReversing () const 
Returns whether or not this space contains any fibrereversing paths. More...  
bool  fibreNegating () const 
Returns whether or not we can negate an exceptional fibre by passing it around the interior of the base orbifold. More...  
unsigned long  punctures () const 
Returns the total number of punctures in the base orbifold. More...  
unsigned long  punctures (bool twisted) const 
Returns the number of punctures of the given type in the base orbifold. More...  
unsigned long  reflectors () const 
Returns the total number of reflector boundary components of the base orbifold. More...  
unsigned long  reflectors (bool twisted) const 
Returns the number of reflector boundary components of the given type in the base orbifold. More...  
unsigned long  fibreCount () const 
Returns the number of exceptional fibres in this Seifert fibred space. More...  
NSFSFibre  fibre (unsigned long which) const 
Returns the requested exceptional fibre. More...  
long  obstruction () const 
Returns the obstruction constant b for this Seifert fibred space. More...  
void  addHandle (bool fibreReversing=false) 
Inserts a new handle into the base orbifold. More...  
void  addCrosscap (bool fibreReversing=false) 
Inserts a new crosscap into the base orbifold. More...  
void  addPuncture (bool twisted=false, unsigned long nPunctures=1) 
Inserts one or more new punctures into the base orbifold. More...  
void  addReflector (bool twisted=false, unsigned long nReflectors=1) 
Adds one or more new reflector boundary components to the base orbifold. More...  
void  insertFibre (const NSFSFibre &fibre) 
Adds the given fibre to this Seifert fibred space. More...  
void  insertFibre (long alpha, long beta) 
Adds the given fibre to this Seifert fibred space. More...  
void  reflect () 
Replaces this space with its mirror image. More...  
void  complementAllFibres () 
Replaces each exceptional fibre of the form (alpha, beta) with a fibre of the form (alpha, alpha  beta). More...  
void  reduce (bool mayReflect=true) 
Reduces the parameters of this Seifert fibred space to a simpler form if possible, without changing the underlying fibration. More...  
NLensSpace *  isLensSpace () const 
Determines if this Seifert fibred space is a Lens space. More...  
bool  operator== (const NSFSpace &compare) const 
Determines whether this and the given structure contain precisely the same representations of precisely the same Seifert fibred spaces. More...  
bool  operator< (const NSFSpace &compare) const 
Determines in a fairly adhoc fashion whether this representation of this space is "smaller" than the given representation of the given space. More...  
NTriangulation *  construct () const 
Returns a triangulation of this 3manifold, if such a construction has been implemented. More...  
NAbelianGroup *  getHomologyH1 () const 
Returns the first homology group of this 3manifold, if such a routine has been implemented. More...  
bool  isHyperbolic () const 
Returns whether or not this is a finitevolume hyperbolic manifold. More...  
std::ostream &  writeName (std::ostream &out) const 
Writes the common name of this 3manifold as a humanreadable string to the given output stream. More...  
std::ostream &  writeTeXName (std::ostream &out) const 
Writes the common name of this 3manifold in TeX format to the given output stream. More...  
std::ostream &  writeStructure (std::ostream &out) const 
Writes details of the structure of this 3manifold that might not be evident from its common name to the given output stream. More...  
std::string  getName () const 
Returns the common name of this 3manifold as a humanreadable string. More...  
std::string  getTeXName () const 
Returns the common name of this 3manifold in TeX format. More...  
std::string  getStructure () const 
Returns details of the structure of this 3manifold that might not be evident from its common name. More...  
bool  operator< (const NManifold &compare) const 
Determines in a fairly adhoc fashion whether this representation of this 3manifold is "smaller" than the given representation of the given 3manifold. More...  
virtual void  writeTextShort (std::ostream &out) const 
Writes this object in short text format to the given output stream. More...  
virtual void  writeTextLong (std::ostream &out) const 
Writes this object in long text format to the given output stream. More...  
Input and Output  
std::string  str () const 
Returns the output from writeTextShort() as a string. More...  
std::string  toString () const 
A deprecated alias for str(), which returns the output from writeTextShort() as a string. More...  
std::string  detail () const 
Returns the output from writeTextLong() as a string. More...  
std::string  toStringLong () const 
A deprecated alias for detail(), which returns the output from writeTextLong() as a string. More...  
Represents a general Seifert fibred space, which may be orientable or nonorientable.
Punctures and reflector boundaries in the base orbifold are supported.
A Seifert fibred space whose base orbifold has no punctures or reflector boundaries can be placed into one of the six classes o1
, o2
, n1
, n2
, n3
and n4
, as detailed on page 88 of "Seifert Manifolds", Peter Orlik, SpringerVerlag, 1972. These classes describe whether this base surface is orientable, as well as how many of its generators give fibrereversing paths in the 3manifold.
In the case where the base orbifold has punctures and/or reflector boundaries, we use the five simplified classes bo1
, bo2
, bn1
, bn2
and bn3
. These classes are not standard terminology (i.e., they have been created explicitly for Regina), and generally they do not provide enough information to uniquely identify the 3manifold. They do however identify whether or not the base orbifold is orientable, and whether or not it contains any fibrereversing paths.
When describing punctures and reflector boundaries, a twisted boundary is one that gives a fibrereversing path, and an untwisted boundary is one around which the direction of fibres is preserved.
Exceptional fibres are sorted first by alpha (the index) and then by beta. The obstruction constant b is stored separately, though in output routines such as getName() and getStructure() it is merged in with the exceptional fibres. Specifically, it is merged in with the beta of the final exceptional fibre (replacing it with beta + b.alpha
), or if there are no exceptional fibres then it is presented as a single (1,b) fibre.
The NManifold routines getHomologyH1() and construct() are only implemented in some cases. The getHomologyH1() routine is implemented if and only if the base orbifold has no punctures. The construct() routine is implemented only for lens spaces and Seifert fibred spaces over the 2sphere without punctures or reflector boundaries.
Feature (longterm): Implement recognition of more common names.
Feature (longterm): Implement triangulation construction and homology calculation for more Seifert fibred spaces.
Lists the six classes o1
, o2
, n1
, n2
, n3
, n4
for base orbifolds without boundaries, plus five classes bo1
, b02
, bn1
, bn2
, bn3
for base orbifolds with boundaries.

inline 
Creates a new Seifert fibred space with base orbifold the 2sphere and no exceptional fibres.

inline 
Creates a new Seifert fibred space of the given class with the given base orbifold and no exceptional fibres.
o1
, o2
, n1
, n2
, n3
or n4
. Likewise, if there are punctures and/or reflector boundary components, then useClass is one of the five classes bo1
, bo2
, bn1
, bn2
or bn3
. bo2
or bn3
.useClass  indicates whether the base orbifold is closed and/or orientable, and gives information about fibrereversing paths in the 3manifold. See the NSFSpace class notes and the classType enumeration notes for details. 
genus  the genus of the base orbifold (the number of tori or projective planes that it contains). Note that for nonorientable base surfaces, this is the nonorientable genus. 
punctures  the number of untwisted ordinary boundary components of the base orbifold. Here "ordinary" means that the puncture gives rise to a real 3manifold boundary (i.e., this is not a reflector boundary of the base orbifold). 
puncturesTwisted  the number of twisted ordinary boundary components of the base orbifold. Here "ordinary" means that the puncture gives rise to a real 3manifold boundary (i.e., this is not a reflector boundary of the base orbifold). 
reflectors  the number of untwisted reflector boundary components of the base orbifold. These are in addition to the ordinary boundary components described by punctures. 
reflectorsTwisted  the number of twisted reflector boundary components of the base orbifold. These are in addition to the ordinary boundary components described by puncturesTwisted. 

inline 
Creates a new Seifert fibred space that is a clone of the given space.
cloneMe  the Seifert fibred space to clone. 

inlinevirtual 
Destroys this Seifert fibred space.
void regina::NSFSpace::addCrosscap  (  bool  fibreReversing = false  ) 
Inserts a new crosscap into the base orbifold.
This makes the base orbifold nonorientable, and increases its nonorientable genus by one. It is equivalent to removing a disc from the base orbifold and replacing it with a Mobius band.
Note that this operation may alter which of the classes described by classType this space belongs to.
The exceptional fibres and the obstruction constant b are not modified by this routine.
fibreReversing  true if the generator of the new crosscap should give a fibrereversing curve in the overall 3manifold, or false (the default) if it should preserve the directions of the fibres. 
void regina::NSFSpace::addHandle  (  bool  fibreReversing = false  ) 
Inserts a new handle into the base orbifold.
This increases the orientable genus of the base orbifold by one, or the nonorientable genus by two. It is equivalent to removing a disc from the base orbifold and replacing it with a punctured torus.
Note that this operation may alter which of the classes described by classType this space belongs to.
The exceptional fibres and the obstruction constant b are not modified by this routine.
fibreReversing  true if one or both generators of the new handle should give fibrereversing curves in the overall 3manifold, or false (the default) if both generators should preserve the directions of the fibres. 
void regina::NSFSpace::addPuncture  (  bool  twisted = false , 
unsigned long  nPunctures = 1 

) 
Inserts one or more new punctures into the base orbifold.
The punctures may be twisted or untwisted.
Each puncture insertion is equivalent to removing a disc from the base orbifold. In the untwisted case this results in a new torus boundary for the 3manifold, and in the twisted case it results in a new Klein bottle boundary.
The exceptional fibres and the obstruction constant b are not modified by this routine.
twisted  true if the new punctures should be twisted (i.e., their boundaries should be fibrereversing), or false if the new punctures should be untwisted. 
nPunctures  the number of new punctures to insert. 
void regina::NSFSpace::addReflector  (  bool  twisted = false , 
unsigned long  nReflectors = 1 

) 
Adds one or more new reflector boundary components to the base orbifold.
The new reflector boundaries may be twisted or untwisted.
Each addition of a reflector boundary component is equivalent to removing a disc from the base orbifold and replacing it with an annulus with one reflector boundary.
In the untwisted case, it has the effect of removing a trivially fibred solid torus from the overall 3manifold and replacing it with an appropriately fibred twisted Ibundle over the torus.
The exceptional fibres and the obstruction constant b are not modified by this routine.
twisted  true if the new reflector boundaries should be twisted (i.e., the boundaries should be fibrereversing), or false if the new reflector boundaries should be untwisted. 
nReflectors  the number of new reflector boundaries to add. 

inline 
Returns which of the eleven predefined classes this space belongs to.
The specific class indicates whether the base orbifold has punctures and/or reflector boundaries, whether the base orbifold is orientable, and gives information on fibrereversing paths.
The class can be (indirectly) modified by calling addHandle(), addCrosscap(), addPuncture() or addReflector().
For more information on the eleven predefined classes, see the NSFSpace class notes or the classType enumeration notes.

inline 
Returns the genus of the base orbifold.
All punctures and reflector boundaries in the base orbifold are ignored (i.e., they are treated as though they had been replaced with ordinary filled discs).
The genus is the number of tori or projective planes that the base surface is formed from. In particular, if the base surface is nonorientable then this is the nonorientable genus.

inline 
Returns whether or not the base surface is orientable.
Reflector boundary components of the base orbifold are not considered here.
The orientability of the base surface can be (indirectly) modified by calling addCrosscap().
true
if and only if the base surface is orientable. void regina::NSFSpace::complementAllFibres  (  ) 
Replaces each exceptional fibre of the form (alpha, beta) with a fibre of the form (alpha, alpha  beta).
The obstruction constant b is not touched.

virtual 
Returns a triangulation of this 3manifold, if such a construction has been implemented.
If no construction routine has yet been implemented for this 3manifold (for instance, if this 3manifold is a Seifert fibred space with sufficiently many exceptional fibres) then this routine will return 0.
The details of which 3manifolds have construction routines can be found in the notes for the corresponding subclasses of NManifold. The default implemention of this routine returns 0.
Reimplemented from regina::NManifold.

inherited 
Returns the output from writeTextLong() as a string.
NSFSFibre regina::NSFSpace::fibre  (  unsigned long  which  )  const 
Returns the requested exceptional fibre.
Fibres are stored in sorted order by alpha (the index) and then by beta. See the NSFSpace class notes for details.
which  determines which fibre to return; this must be between 0 and getFibreCount()1 inclusive. 

inline 
Returns the number of exceptional fibres in this Seifert fibred space.
Note that the obstruction parameter b is not included in this count. That is, any (1,k) fibres are ignored.

inline 
Returns whether or not we can negate an exceptional fibre by passing it around the interior of the base orbifold.
That is, this routine determines whether a (p, q) exceptional fibre can become a (p, q) exceptional fibre simply by sliding it around.
This is possible if either
Note that reflector boundary components, whilst making the overall 3manifold nonorientable, have no bearing on the outcome of this routine.
true
if and only an exceptional fibre can be reflected as described above.

inline 
Returns whether or not this space contains any fibrereversing paths.
true
if and only if a fibrereversing path exists.

virtual 
Returns the first homology group of this 3manifold, if such a routine has been implemented.
If the calculation of homology has not yet been implemented for this 3manifold then this routine will return 0.
The details of which 3manifolds have homology calculation routines can be found in the notes for the corresponding subclasses of NManifold. The default implemention of this routine returns 0.
The homology group will be newly allocated and must be destroyed by the caller of this routine.
Reimplemented from regina::NManifold.

inherited 
Returns the common name of this 3manifold as a humanreadable string.

inherited 
Returns details of the structure of this 3manifold that might not be evident from its common name.
For instance, for an orbit space S^3/G this routine might return the full Seifert structure.
This routine may return the empty string if no additional details are deemed necessary.

inherited 
Returns the common name of this 3manifold in TeX format.
No leading or trailing dollar signs will be included.

inline 
Adds the given fibre to this Seifert fibred space.
This may be an exceptional fibre (alpha > 1) or it may be a regular fibre (alpha = 1). If it is a regular fibre, the obstruction constant b will be adjusted according to the value of beta.
Note that there is no restriction on the range of the second parameter beta. If it is out of the usual range 0 <= beta < alpha, it will be pulled back into this range and the excess will be pushed into the obstruction constant b.
fibre  the fibre to insert. The first parameter of this fibre (i.e., its index) must be strictly positive, and the two parameters of this fibre must be coprime. 
void regina::NSFSpace::insertFibre  (  long  alpha, 
long  beta  
) 
Adds the given fibre to this Seifert fibred space.
This may be an exceptional fibre (alpha > 1) or it may be a regular fibre (alpha = 1). If it is a regular fibre, the obstruction constant b will be adjusted according to the value of beta.
Note that there is no restriction on the range of the second parameter beta. If it is out of the usual range 0 <= beta < alpha, it will be pulled back into this range and the excess will be pushed into the obstruction constant b.
alpha  the first parameter (i.e., the index) of the fibre to insert; this must be strictly positive. 
beta  the second parameter of the fibre to insert; this must have no common factors with the first parameter alpha. 

inlinevirtual 
Returns whether or not this is a finitevolume hyperbolic manifold.
true
if this is a finitevolume hyperbolic manifold, or false
if not. Implements regina::NManifold.
NLensSpace* regina::NSFSpace::isLensSpace  (  )  const 
Determines if this Seifert fibred space is a Lens space.
If this is a Lens space, the NLensSpace returned will be newly created and it will be up to the caller of this routine to destroy it.
null
if this is not a Lens space.

inline 
Returns the obstruction constant b for this Seifert fibred space.
The obstruction constant corresponds to the insertion of an additional (1,b) fibre. It can be modified by calling insertFibre() with a value of alpha = 1. It will also be modified whenever insertFibre() is called with beta out of range (beta < 0 or beta >= alpha), since each exceptional fibre must be stored in standard form (0 <= beta < alpha).

inherited 
Determines in a fairly adhoc fashion whether this representation of this 3manifold is "smaller" than the given representation of the given 3manifold.
The ordering imposed on 3manifolds is purely aesthetic on the part of the author, and is subject to change in future versions of Regina.
The ordering also depends on the particular representation of the 3manifold that is used. As an example, different representations of the same Seifert fibred space might well be ordered differently.
All that this routine really offers is a welldefined way of ordering 3manifold representations.
compare  the 3manifold representation with which this will be compared. 
true
if and only if this is "smaller" than the given 3manifold representation. bool regina::NSFSpace::operator<  (  const NSFSpace &  compare  )  const 
Determines in a fairly adhoc fashion whether this representation of this space is "smaller" than the given representation of the given space.
The ordering imposed on Seifert fibred space representations is purely aesthetic on the part of the author, and is subject to change in future versions of Regina. It also depends upon the particular representation, so that different representations of the same space may be ordered differently.
All that this routine really offers is a welldefined way of ordering Seifert fibred space representations.
compare  the representation with which this will be compared. 
true
if and only if this is "smaller" than the given Seifert fibred space representation. void regina::NSFSpace::operator=  (  const NSFSpace &  cloneMe  ) 
Modifies this Seifert fibred space to be a clone of the given space.
cloneMe  the Seifert fibred space to clone. 
bool regina::NSFSpace::operator==  (  const NSFSpace &  compare  )  const 
Determines whether this and the given structure contain precisely the same representations of precisely the same Seifert fibred spaces.
Note that this routine examines the particular representation of the Seifert fibred space. Different Seifert parameters that give the same 3manifold will be regarded as not equal by this routine.
compare  the representation with which this will be compared. 
true
if and only if this and the given Seifert fibred space representations are identical.

inline 
Returns the total number of punctures in the base orbifold.
In other words, this routine returns the total number of real torus or Klein bottle boundary components in the overall 3manifold.
Note that reflector boundaries on the base orbifold are not counted here; only the ordinary boundary components that give rise to real 3manifold boundaries are included.
Both untwisted and twisted punctures (giving rise to torus and Klein bottle boundaries respectively in the 3manifold) are counted by this routine.

inline 
Returns the number of punctures of the given type in the base orbifold.
In other words, this routine returns the number of real boundary components of the given type in the overall 3manifold.
This routine either counts only twisted punctures (which give rise to Klein bottle boundaries), or only untwisted punctures (which give rise to torus boundaries).
Either way, reflector boundaries on the base orbifold are not counted here; only ordinary boundary components that give rise to real 3manifold boundaries are considered.
twisted  true if only twisted punctures should be counted (those that give fibrereversing paths and Klein bottle boundaries), or false if only untwisted punctures should be counted (those that are fibrepreserving and give torus boundaries). 
void regina::NSFSpace::reduce  (  bool  mayReflect = true  ) 
Reduces the parameters of this Seifert fibred space to a simpler form if possible, without changing the underlying fibration.
In some cases the parameters of the Seifert fibred space may be simplified by taking a mirror image of the entire 3manifold. The argument mayReflect signifies whether this is allowed.
This routine will not change the curves made by the fibres and the base orbifold on any boundary components (i.e., boundaries caused by punctures in the base orbifold).
true
then the entire 3manifold might be replaced with its mirror image, in which case any subsequent modifications (such as inserting additional fibres or altering the base orbifold) may give unexpected results.mayReflect  true if we are allowed to take a mirror image of the entire 3manifold, or false if we are not. 

inline 
Replaces this space with its mirror image.
Specifically, all exceptional fibres and the obstruction constant b will be negated. Note that the obstruction constant will generally undergo further change as the exceptional fibres are standardised into the usual 0 <= beta < alpha form.
This routine will not change the curves made by the fibres and the base orbifold on any boundary components (i.e., boundaries caused by punctures in the base orbifold), with the exception that each base curve will be reflected.

inline 
Returns the total number of reflector boundary components of the base orbifold.
This includes both twisted and untwisted reflector boundaries.

inline 
Returns the number of reflector boundary components of the given type in the base orbifold.
This either counts only twisted reflector boundaries, or only untwisted reflector boundaries.
twisted  true if only twisted reflector boundaries should be counted (those that give fibrereversing paths), or false if only untwisted reflector boundaries should be counted. 

inherited 
Returns the output from writeTextShort() as a string.
__str__()
function.

inlineinherited 
A deprecated alias for str(), which returns the output from writeTextShort() as a string.

inlineinherited 
A deprecated alias for detail(), which returns the output from writeTextLong() as a string.

inlinevirtual 
Writes the common name of this 3manifold as a humanreadable string to the given output stream.
out  the output stream to which to write. 
Implements regina::NManifold.

inlinevirtual 
Writes details of the structure of this 3manifold that might not be evident from its common name to the given output stream.
For instance, for an orbit space S^3/G this routine might write the full Seifert structure.
This routine may write nothing if no additional details are deemed necessary. The default implementation of this routine behaves in this way.
out  the output stream to which to write. 
Reimplemented from regina::NManifold.

inlinevirtual 
Writes the common name of this 3manifold in TeX format to the given output stream.
No leading or trailing dollar signs will be included.
out  the output stream to which to write. 
Implements regina::NManifold.

inlinevirtualinherited 
Writes this object in long text format to the given output stream.
The output should provide the user with all the information they could want. The output should be humanreadable, should not contain extremely long lines (so users can read the output in a terminal), and should end with a final newline.
The default implementation of this routine merely calls writeTextShort() and adds a newline.
out  the output stream to which to write. 
Reimplemented from regina::ShareableObject.

inlinevirtualinherited 
Writes this object in short text format to the given output stream.
The output should be humanreadable, should fit on a single line, and should not end with a newline.
out  the output stream to which to write. 
Implements regina::ShareableObject.