Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
75b99fa
Recognition for trivial I-bundle over torus
bobbycyiii Oct 20, 2020
d5a77dc
Implemented scaffolding for fault finding
bobbycyiii Oct 21, 2020
62740d4
Fixed separation testing
bobbycyiii Oct 28, 2020
34b3a3a
Finished tests for essential spheres
bobbycyiii Oct 28, 2020
43db969
Added Python bindings for fault tests
bobbycyiii Oct 28, 2020
8a0145d
Finished scaffolding for fault tests
bobbycyiii Oct 28, 2020
b705845
Essential sphere test
bobbycyiii Oct 28, 2020
4c9b729
Implement tests for essential Klein bottle test
bobbycyiii Oct 28, 2020
25f6eed
Add essential Klein bottle method
bobbycyiii Oct 28, 2020
cdcf428
Merge branch 'isTorusXInterval' into findFault_alt
bobbycyiii Oct 28, 2020
85b5002
Add small SF spaces to Klein bottle test
bobbycyiii Oct 28, 2020
9bc7cdc
Add essential torus test
bobbycyiii Oct 28, 2020
6a91a8a
Added preconditions for fault tests to documentation
bobbycyiii Oct 29, 2020
b188337
Fix nonseparating compressibility error
bobbycyiii Oct 29, 2020
69ae208
Add unit tests for isSolidTorusAnnulus
bobbycyiii Oct 29, 2020
0e2b8bd
Add fault tests
bobbycyiii Oct 29, 2020
e77c5a4
Implemented scaffolding for fault finding
bobbycyiii Oct 21, 2020
f032fb3
Fixed separation testing
bobbycyiii Oct 28, 2020
38e5c10
Finished tests for essential spheres
bobbycyiii Oct 28, 2020
8a89e44
Added Python bindings for fault tests
bobbycyiii Oct 28, 2020
fba8ec9
Finished scaffolding for fault tests
bobbycyiii Oct 28, 2020
2e760c2
Essential sphere test
bobbycyiii Oct 28, 2020
b1d77fa
Implement tests for essential Klein bottle test
bobbycyiii Oct 28, 2020
26c640a
Add essential Klein bottle method
bobbycyiii Oct 28, 2020
b05f259
Add small SF spaces to Klein bottle test
bobbycyiii Oct 28, 2020
c46ac3d
Add essential torus test
bobbycyiii Oct 28, 2020
1018fe1
Added preconditions for fault tests to documentation
bobbycyiii Oct 29, 2020
d09c673
Fix nonseparating compressibility error
bobbycyiii Oct 29, 2020
dbe7040
Add unit tests for isSolidTorusAnnulus
bobbycyiii Oct 29, 2020
893046a
Add fault tests
bobbycyiii Oct 29, 2020
ddccccc
Add placeholders and Python bindings for hyperbolicity test
bobbycyiii Oct 30, 2020
3f107d4
Revert "Add placeholders and Python bindings for hyperbolicity test"
bobbycyiii Oct 30, 2020
7d34957
Merge branch 'findFault_alt' of https://github.com/bobbycyiii/regina …
bobbycyiii Oct 30, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions engine/surfaces/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ SET ( FILES
disctype
enumerator
enumfilter
fault
links
normalsurface
normalsurfaces
Expand Down
189 changes: 189 additions & 0 deletions engine/surfaces/fault.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@

/**************************************************************************
* *
* Regina - A Normal Surface Theory Calculator *
* Computational Engine *
* *
* This file: Copyright (c) 2020, Robert C. Haraway, III *
* For further details contact Robert (bobbycyiii@fastmail.com). *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of the *
* License, or (at your option) any later version. *
* *
* As an exception, when this program is distributed through (i) the *
* App Store by Apple Inc.; (ii) the Mac App Store by Apple Inc.; or *
* (iii) Google Play by Google Inc., then that store may impose any *
* digital rights management, device limits and/or redistribution *
* restrictions that are required by its terms of service. *
* *
* This program is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* You should have received a copy of the GNU General Public *
* License along with this program; if not, write to the Free *
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
**************************************************************************/


#include "surfaces/normalsurface.h"
#include "triangulation/dim3.h"

namespace regina {
bool NormalSurface::separates() const{
int tri_cpts = triangulation()->countComponents();
Triangulation<3>* cut_up = cutAlong();
cut_up->intelligentSimplify();
int new_cpts = cut_up->countComponents();
delete cut_up;
return tri_cpts < new_cpts;
}

bool NormalSurface::isEssentialSphere() const{
if (!(isConnected()
&& isCompact()
&& eulerChar() == 2))
return false;

if (!separates())
return true;

Triangulation<3>* cut_up = cutAlong();
cut_up->intelligentSimplify();

// Cap sphere boundary components.
// Since the original triangulation has no sphere boundary components,
// this caps the sides of this sphere.
// That is, this undoes a (possibly trivial) connect-sum.
cut_up->finiteToIdeal();
cut_up->intelligentSimplify();
cut_up->idealToFinite();
cut_up->intelligentSimplify();

// There are two components,
// since the original triangulation was connected,
// and this surface is separating.
cut_up->splitIntoComponents();
Triangulation<3>* L = (Triangulation<3>*) cut_up->firstChild();
Triangulation<3>* R = (Triangulation<3>*) L->nextSibling();
bool bounds_ball = L->isThreeSphere() || R->isThreeSphere();
delete L;
delete R;
delete cut_up;
return !bounds_ball;
}

bool NormalSurface::isEssentialKleinBottle() const{
if (!(isConnected()
&& isCompact()
&& !isOrientable()
&& !hasRealBoundary()
&& eulerChar() == 0)){
return false;
}

if (!separates()){
Triangulation<3>* cut_up = cutAlong();
bool compressible = cut_up->hasCompressingDisc();
delete cut_up;
return !compressible;
}

/*
if (!isIncompressible())
return false;
*/
// is what we would like to write here,
// but presently `isIncompressible` requires closed triangulations.

// There are two components,
// since the original triangulation was connected,
// and this surface is separating.
Triangulation<3>* cut_up = cutAlong();
cut_up->splitIntoComponents();
Triangulation<3>* L = (Triangulation<3>*) cut_up->firstChild();
Triangulation<3>* R = (Triangulation<3>*) L->nextSibling();

bool compressible = true;
bool boundary_parallel = false;
compressible = L->hasCompressingDisc() || R->hasCompressingDisc();
if (!compressible){
L->makeDoubleCover();
R->makeDoubleCover();
boundary_parallel = L->isTorusXInterval() || R->isTorusXInterval();
}
delete L;
delete R;
delete cut_up;
return !(compressible || boundary_parallel);
}

bool NormalSurface::isEssentialTorus() const{
if (!(isConnected()
&& isCompact()
&& isOrientable()
&& !hasRealBoundary()
&& eulerChar() == 0))
return false;

if (!separates())
return true;
/*
if (!isIncompressible())
return false;
*/
// is what we would like to write here,
// but presently `isIncompressible` requires closed triangulations.

// There are two components,
// since the original triangulation was connected,
// and this surface is separating.
Triangulation<3>* cut_up = cutAlong();
cut_up->splitIntoComponents();
Triangulation<3>* L = (Triangulation<3>*) cut_up->firstChild();
Triangulation<3>* R = (Triangulation<3>*) L->nextSibling();

bool compressible = true;
bool boundary_parallel = false;
compressible = L->hasCompressingDisc() || R->hasCompressingDisc();
if (!compressible){
boundary_parallel = L->isTorusXInterval() || R->isTorusXInterval();
}
delete L;
delete R;
delete cut_up;
return !(compressible || boundary_parallel);
}

bool NormalSurface::isSolidTorusAnnulus() const{
if (!(isConnected()
&& isCompact()
&& isOrientable()
&& hasRealBoundary()
&& eulerChar() == 0))
return false;

Triangulation<3>* cut_up = cutAlong();
cut_up->intelligentSimplify();

bool solid_torus;
if (cut_up->isConnected())
solid_torus = cut_up->isSolidTorus();
else {
cut_up->splitIntoComponents();
Triangulation<3>* L = (Triangulation<3>*)(cut_up->firstChild());
Triangulation<3>* R = (Triangulation<3>*)(L->nextSibling());
solid_torus = L->isSolidTorus() && R->isSolidTorus();
delete L;
delete R;
}
delete cut_up;
return solid_torus;
}

}
51 changes: 51 additions & 0 deletions engine/surfaces/normalsurface.h
Original file line number Diff line number Diff line change
Expand Up @@ -1443,6 +1443,57 @@ class REGINA_API NormalSurface : public ShortOutput<NormalSurface> {
*/
bool isIncompressible() const;

/**
* Determines whether or not cutting along the surface
* yields a new component.
*/
bool separates() const;

/**
* Determines whether or not this surface is an essential sphere.
*
* \pre The underlying triangulation is connected
* and has no sphere boundary components.
* \pre This normal surface can be cut along.
*
* @return \c true if this is an essential sphere, otherwise \c false.
*/
bool isEssentialSphere() const;

/**
* Determines whether or not this surface is an essential Klein bottle.
*
* \pre The underlying triangulation is connected and irreducible,
* and has no compressing disc (i.e. is boundary-incompressible).
* \pre This normal surface can be cut along.
*
* @return \c true if this is an essential Klein bottle, else \c false.
*/
bool isEssentialKleinBottle() const;

/**
* Determines whether or not this surface is an essential torus.
*
* \pre The underlying triangulation is connected and irreducible,
* and has no compressing disc (i.e. is boundary-incompressible).
* \pre This normal surface can be cut along.
*
* @return \c true if this is an essential torus, else \c false.
*/
bool isEssentialTorus() const;

/**
* Determines whether or not this surface is an annulus
* cutting along which yields a disjoint union of at most two solid tori,
* which we call a \e solid \e torus \e annulus.
* This is easier to check than whether or not the annulus is essential.
*
* \pre This normal surface can be cut along.
*
* @return \c true if this surface is a solid torus annulus, else \c false.
*/
bool isSolidTorusAnnulus() const;

/**
* Cuts the associated triangulation along this surface and
* returns a newly created resulting triangulation.
Expand Down
Loading