Regina 7.0 Calculation Engine
Public Member Functions | Static Public Member Functions | List of all members
regina::SFSAlt Class Reference

Provides an alternative representation of a single bounded Seifert fibred space. More...

#include <manifold/sfsalt.h>

Inheritance diagram for regina::SFSAlt:
regina::ShortOutput< SFSAlt > regina::Output< T, supportsUtf8 >

Public Member Functions

 SFSAlt (const SFSpace &original)
 Creates a "basic" alternative representation for the given Seifert fibred space. More...
 
 SFSAlt (const SFSAlt &base, bool reflect, bool negate=false)
 Creates a new alternative representation from the given alternative representation. More...
 
 SFSAlt (const SFSAlt &)=default
 Creates a new copy of the given alternative. More...
 
 SFSAlt (SFSAlt &&) noexcept=default
 Moves the contents of the given alternative into this new alternative. More...
 
SFSAltoperator= (const SFSAlt &)=default
 Sets this to be a copy of the given alternative. More...
 
SFSAltoperator= (SFSAlt &&) noexcept=default
 Moves the contents of the given alternative into this alternative. More...
 
void swap (SFSAlt &other) noexcept
 Swaps the contents of this and the given alternative. More...
 
const SFSpacealt () const &
 Returns the alternative representation of the original Seifert fibred space. More...
 
SFSpacealt () &
 Returns a non-const reference to the alternative representation of the original Seifert fibred space. More...
 
SFSpace && alt () &&
 Returns an rvalue reference to the alternative representation of the original Seifert fibred space. More...
 
const Matrix2conversion () const
 Returns the conversion matrix for this alternative space. More...
 
bool reflected () const
 Returns whether or not a reflection was used when creating this alternative space. More...
 
bool operator== (const SFSAlt &other) const
 Determines whether this and the given alternative representation have identical presentations. More...
 
bool operator!= (const SFSAlt &other) const
 Determines whether this and the given alternative representation do not have identical presentations. 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
 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...
 

Static Public Member Functions

static std::vector< SFSAltaltSet (const SFSpace &sfs)
 Returns a set of alternatives for the given Seifert fibred space. More...
 
static bool canNegate (const SFSpace &sfs)
 Determines whether the SFSAlt class constructor will be able to negate all exceptional fibres without reflecting the underlying Seifert fibred space. More...
 

Detailed Description

Provides an alternative representation of a single bounded Seifert fibred space.

Such alternatives are made possible by altering the curves made by the fibre and base orbifold on a boundary torus.

This class is designed to help in finding simple representations of graph manifolds (or, indeed, any non-geometric manifolds containing Seifert fibred blocks).

Each alternative comes with its own representation of the original Seifert fibred space, along with instructions for converting fibre/base curves on the boundary tori between the original and alternative spaces.

The alternative representation will generally be as simple as possible (and indeed the hope is that it will be simpler than the original). In particular, each alternative space is guaranteed to have obstruction constant zero. The base orbifold may be changed entirely (for instance, an orientable Seifert fibred space over the Mobius band with no exceptional fibres will be converted to a Seifert fibred space over the disc with two exceptional fibres).

The conversions between boundary curves are described by a conversion matrix M as follows. Consider the first boundary torus. Let f_old and o_old be directed curves on this boundary representing the fibre and base orbifold of the original space, and let f_alt and o_alt be directed curves on this same boundary representing the fibre and base orbifold of the new alternative space. Then

    [f_alt]         [f_old]
    [     ]  =  M * [     ].
    [o_alt]         [o_old]

Note that this only applies to the first boundary torus! If the Seifert fibred space has more than one boundary, then for the remaining boundaries the unoriented fibre and base curves remain the same. More specifically, the directed fibre remains identical, and the directed curve representing the base orbifold is reversed if and only if a reflection was used in creating the alternative space, as returned by reflected().

See the page on Notation for Seifert fibred spaces for details on some of the terminology used above.

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. Note, however, that SFSAlt still requires a non-trivial (but constant sized) amount of data to be copied even in a move operation.

Constructor & Destructor Documentation

◆ SFSAlt() [1/4]

regina::SFSAlt::SFSAlt ( const SFSpace original)

Creates a "basic" alternative representation for the given Seifert fibred space.

This will:

  • reduce the parameters via SFSpace::reduce(), without reflecting;
  • add twists to the first boundary torus so that the obstruction constant b in the Seifert fibred space becomes zero;
  • if the Seifert fibred space is over M/n2 with no exceptional fibres (where M represents the Mobius band), it will switch the fibre and orbifold curves to give a Seifert fibred space over the disc with two exception fibres.
Precondition
The given Seifert fibred space has at least one torus boundary.
Parameters
originalthe original Seifert fibred space for which we are creating a set of alternative representations.

◆ SFSAlt() [2/4]

regina::SFSAlt::SFSAlt ( const SFSAlt base,
bool  reflect,
bool  negate = false 
)

Creates a new alternative representation from the given alternative representation.

The changes will include:

  • if reflect is true, then this will reflect the Seifert fibred space;
  • if negate is true, then this will attempt to replace all fibres (alpha, beta) with (alpha, alpha - beta), without any further reflections (but see below for conditions on when this is possible);
  • in all cases, this will reduce the parameters via SFSpace::reduce() and add twists to give obstruction constant zero.

Asking for reflection is always valid. However, the option to negate without reflection is possible only if:

  • it is possible to negate an exceptional fibre by sliding it around the base orbifold (as in SFSpace::fibreNegating()); and
  • the number of exceptional fibres is odd.

For convenience, you can test these conditions using the static function canNegate().

Precondition
If negate is true, then the underlying Seifert fibred space satisfies the requirements outlined above, or equivalently, canNegate(base.sfs()) is true.
Note
This constructor only makes sense if at least one of reflect or negate is true, since base should already be in a reduced form with zero obstruction constant.
Parameters
basethe Seifert fibred space representation that will be used as a starting point for this new alternative.
reflecttrue if we should reflect the Seifert fibred space.
negatetrue if we should attempt to negate all exceptional fibres without reflecting, as described above.

◆ SFSAlt() [3/4]

regina::SFSAlt::SFSAlt ( const SFSAlt )
default

Creates a new copy of the given alternative.

◆ SFSAlt() [4/4]

regina::SFSAlt::SFSAlt ( SFSAlt &&  )
defaultnoexcept

Moves the contents of the given alternative into this new alternative.

This is a fast (constant time) operation.

The alternative that was passed will no longer be usable.

Member Function Documentation

◆ alt() [1/3]

SFSpace & regina::SFSAlt::alt ( ) &
inline

Returns a non-const reference to the alternative representation of the original Seifert fibred space.

Returns
the alternative representation.

◆ alt() [2/3]

SFSpace && regina::SFSAlt::alt ( ) &&
inline

Returns an rvalue reference to the alternative representation of the original Seifert fibred space.

Returns
the alternative representation.

◆ alt() [3/3]

const SFSpace & regina::SFSAlt::alt ( ) const &
inline

Returns the alternative representation of the original Seifert fibred space.

Returns
the alternative representation.

◆ altSet()

std::vector< SFSAlt > regina::SFSAlt::altSet ( const SFSpace sfs)
inlinestatic

Returns a set of alternatives for the given Seifert fibred space.

These will consist of (1) the alternative base created by passing the original Seifert fibred space to the SFSAlt constructor; and (2) all alternatives created by passing base with appropriate reflection and negation arguments to the SFSAlt constructor. The combinations of reflection and negation arguments that are used (and hence the size of the set that is returned) will depend on the properties of the original space.

Note that in general, none of the alternatives will have a representation identical to the original (generally these alternative representations will be simpler if possible).

It is guaranteed that the set that is returned will be non-empty.

Precondition
The given Seifert fibred space has at least one torus boundary.
Parameters
sfsthe original Seifert fibred space.
Returns
the resulting set of alternative representations for sfs.

◆ canNegate()

bool regina::SFSAlt::canNegate ( const SFSpace sfs)
inlinestatic

Determines whether the SFSAlt class constructor will be able to negate all exceptional fibres without reflecting the underlying Seifert fibred space.

See the constructor SFSAlt(const SFSAlt&, bool, bool) for further details.

Precondition
The given Seifert fibred space has at least one torus boundary.
Parameters
sfsthe Seifert fibred space that we are attempting to represent.
Returns
true if and only if it is possible to set the negation argument to true in the SFSAlt class constructor.

◆ conversion()

const Matrix2 & regina::SFSAlt::conversion ( ) const
inline

Returns the conversion matrix for this alternative space.

This matrix describes the fibre and base curves of the alternative space on the first boundary torus in terms of the fibre and base curves of the original space (which was passed to the SFSAlt constructor). See the class notes above for details.

Note that this conversion matrix applies only to the first boundary torus! If there is more than one boundary, the remaining boundary conversions are simpler and depend only on whether a reflection has been used or not. See reflected() or the class notes for details.

Returns
the conversion matrix for this alternative space.

◆ detail()

template<class T , bool supportsUtf8 = false>
std::string regina::Output< T, supportsUtf8 >::detail ( ) const
inherited

Returns a detailed text representation of this object.

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

Returns
a detailed text representation of this object.

◆ operator!=()

bool regina::SFSAlt::operator!= ( const SFSAlt other) const
inline

Determines whether this and the given alternative representation do not have identical presentations.

To be considered identical, the two alternatives must have equal alternative SFSpace representations, equal conversion matrices, and either both must have used a reflection or both must have not used a reflection. In other words, this is equivalent to testing all of alt(), conversion() and reflected() for equality.

Parameters
otherthe alternative to compare against this.
Returns
true if and only if this and the given alternative do not have identical presentations, as described above.

◆ operator=() [1/2]

SFSAlt & regina::SFSAlt::operator= ( const SFSAlt )
default

Sets this to be a copy of the given alternative.

Returns
a reference to this alternative.

◆ operator=() [2/2]

SFSAlt & regina::SFSAlt::operator= ( SFSAlt &&  )
defaultnoexcept

Moves the contents of the given alternative into this alternative.

This is a fast (constant time) operation.

The alternative that was passed will no longer be usable.

Returns
a reference to this alternative.

◆ operator==()

bool regina::SFSAlt::operator== ( const SFSAlt other) const
inline

Determines whether this and the given alternative representation have identical presentations.

To be considered identical, the two alternatives must have equal alternative SFSpace representations, equal conversion matrices, and either both must have used a reflection or both must have not used a reflection. In other words, this is equivalent to testing all of alt(), conversion() and reflected() for equality.

Parameters
otherthe alternative to compare against this.
Returns
true if and only if this and the given alternative have identical presentations, as described above.

◆ reflected()

bool regina::SFSAlt::reflected ( ) const
inline

Returns whether or not a reflection was used when creating this alternative space.

This determines the conversion between boundary curves for all boundary tori after the first.

More specifically, if no reflection was used then the directed fibre and base curves are identical for the original and alternative spaces. If a reflection was used, then the directed fibres are identical but the directed base curves are reversed.

The conversion between curves on the first boundary torus is generally more complex, and is returned as a matrix by the conversion() routine.

You can also test whether a reflection was used by examining whether the conversion matrix has determinant 1 or -1. However, calling reflected() is both simpler and a little faster.

Returns
true if a reflection was used in creating this alternative space, or false if no reflection was used.

◆ str()

template<class T , bool supportsUtf8 = false>
std::string regina::Output< T, supportsUtf8 >::str ( ) const
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.

Python
The Python "stringification" function str() will use precisely this function, and for most classes the Python repr() function will incorporate this into its output.
Returns
a short text representation of this object.

◆ swap()

void regina::SFSAlt::swap ( SFSAlt other)
inlinenoexcept

Swaps the contents of this and the given alternative.

Parameters
otherthe alternative whose contents should be swapped with this.

◆ utf8()

template<class T , bool supportsUtf8 = false>
std::string regina::Output< T, supportsUtf8 >::utf8 ( ) const
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.

Returns
a short text representation of this object.

◆ writeTextLong()

void regina::ShortOutput< SFSAlt , false >::writeTextLong ( std::ostream &  out) const
inlineinherited

A default implementation for detailed output.

This routine simply calls T::writeTextShort() and appends a final newline.

Python
Not present; instead you can call detail() from the subclass T, which returns this output as a string.
Parameters
outthe output stream to which to write.

◆ writeTextShort()

void regina::SFSAlt::writeTextShort ( std::ostream &  out) const
inline

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

Python
Not present; use str() instead.
Parameters
outthe output stream to which to write.

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

Copyright © 1999-2021, The Regina development team
This software is released under the GNU General Public License, with some additional permissions; see the source code for details.
For further information, or to submit a bug or other problem, please contact Ben Burton (bab@maths.uq.edu.au).