user_guide:tutorials:hyperbolic_surface_tutorial

This tutorial is probably also available as a Jupyter notebook in the demo folder in the polymake source and on github.

Different versions of this tutorial: latest release, release 4.11, release 4.10, release 4.9, release 4.8, release 4.7, release 4.6, release 4.5, release 4.4, release 4.3, release 4.2, release 4.1, release 4.0, release 3.6, nightly master

Tutorial on hyperbolic surfaces

A hyperbolic surface with cusps is a topological surface together with a hyperbolic structure of finite area. polymake can deal with hyperbolic surfaces in view of Penners coordinates of the decorated Teichmüller space (lambda lengths). These allow to pick a hyperbolic surface by choosing a triangulation of the surface along with one positive parameter for each edge.

The secondary fan of a hyperbolic surface stratifies the space of weight vectors (horocyclic decorations) according to which Delaunay triangulations are induced by the Epstein-Penner convex hull construction. For each point on the surface, there is a secondary polyhedron whose normal fan is the secondary fan.

This tutorial shows how to deal with secondary fans and secondary polyhedra of hyperbolic surfaces.

Construction of hyperbolic surfaces

To define a hyperbolic surface we need to specify (a) a triangulation and (b) Penner coordinates.

(a) The triangulation is obtained by specifying the DCEL as an Matrix<Int>. This constructs a doubly connected edge list as follows: Each row of the nput of DCEL reads { (2i).head , (2i+1).head , (2i).next , (2i+1).next }. In general, for each edge i of the triangulation there are two half edges 2i and 2i+1, one for each orientation.

(b) The PENNER_COORDINATES assign a positive rational number to each edge of the triangulation, ordered in the same sense as prescribed by the DCEL.

Example 1: hyperbolic sphere with three cusps

> application 'fan';
> application 'topaz';
> $S3 = new Matrix<Int>([[1,0,2,5],[2,1,4,1],[0,2,0,3]]);
> $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1]);

In this example the doubly connected edge list looks like this:

The secondary fan

The secondary fan of the hyperbolic sphere from above can now be computed as follows.

> $f = $s->SECONDARY_FAN;
> $f->properties;
type: PolyhedralFan<Rational>
 
MAXIMAL_CONES
{0 1 2}
{0 1 3}
{1 2 4}
{0 2 5}
 
 
RAYS
0 1 1
1 0 1
1 1 0
0 0 1
1 0 0
0 1 0
 
> $f->VISUAL;
fan:
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s->properties;
name: s
type: HyperbolicSurface
 
DCEL
N_vertices: 3
Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex)
0: 1 2 4 1 (0 ---> 1)
1: 0 5 3 0 (1 ---> 0)
2: 3 4 0 2 (1 ---> 2)
3: 2 1 5 1 (2 ---> 1)
4: 5 0 2 0 (2 ---> 0)
5: 4 3 1 2 (0 ---> 2)
 
 
FLIP_WORDS
{}
{0}
{1}
{2}
 
 
PENNER_COORDINATES
1 1 1
 
SECONDARY_FAN
type: PolyhedralFan<Rational>

The FLIP_WORDS indicate how to obtain the Delaunay triangulations. The k-th flip word is a list of integers (the indices of the edges) that describe which edge flips produce the k-th Delaunay triangulation. Note that the k-th Delaunay triangulation also corresponds to the k-th maximal cone of the SECONDARY_FAN.

GKZ vectors & secondary polyhedra

In order to compute GKZ_VECTORS or a secondary_polyhedron of a hyperbolic surface one needs to additionally specify a SPECIAL_POINT on the surface. This is done by choosing two rational numbers.

Continuing with the above example, lets look at the following.

> $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1],SPECIAL_POINT=>[1,0]);

Now we may compute an approximation of the GKZ_VECTORS of the surface. The approximation depends on a parameter depth that restricts the depth of the (covering) triangles that are summed over in the definition of the GKZ vectors.

> print $s->GKZ_VECTORS(3);
1 33346854621/25672050625 33346854621/25672050625 19782163/27238250
1 2361/3250 3955357/5447650 33346854621/25672050625
1 10549213550005124385885122/6365327663846199230365625 11433978/13287625 30327974429709/105771923977850
1 11433978/13287625 10549213550005124385885122/6365327663846199230365625 30327974429709/105771923977850

The secondary polyhedron can be computed similarly using the function secondary_polyhedron.

> $p = secondary_polyhedron($s,10);
> $p->properties;
name: p
type: Polytope<Float>
 
CONE_AMBIENT_DIM
4
 
VERTICES
1 1.315301353 1.315301353 0.7316378744
1 0.7316489581 0.7316267908 1.315301353
1 1.752046187 0.8750928112 0.2910011302
1 0.8750928112 1.752046187 0.2910011302
0 -1 0 0
0 0 -1 0
0 0 0 -1
 
 
VERTICES_IN_FACETS
{0 1 3 4}
{0 1 2 5}
{0 2 3 6}
{1 4 5}
{2 5 6}
{3 4 6}
 
> $p->VISUAL(FacetColor=>'255 180 80');
p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab

We may look at the GKZ domes of the individual Delaunay triangulations.

> $d0 = $s->gkz_dome(0,5);
> $d0->VISUAL(FacetColor=>'80 180 255');
pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d1 = $s->gkz_dome(1,5);
> $d1->VISUAL(FacetColor=>'80 180 255');
pcom:d1
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab

Example 2: a hyperbolic torus with three cusps

> $T3 = new Matrix<Int>([[1,0,2,17],[2,1,4,14],[0,2,0,6],[1,2,8,16],[0,1,5,10],[2,1,12,1],[0,2,9,3],[0,1,13,7],[0,2,15,11]]);
> $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[1,0]);

> $f = $s->SECONDARY_FAN;
> $f->VISUAL;
fan:
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s->properties;
name: s
type: HyperbolicSurface
 
DCEL
N_vertices: 3
Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex)
0: 1 2 4 1 (0 ---> 1)
1: 0 17 11 0 (1 ---> 0)
2: 3 4 0 2 (1 ---> 2)
3: 2 14 13 1 (2 ---> 1)
4: 5 0 2 0 (2 ---> 0)
5: 4 6 8 2 (0 ---> 2)
6: 7 8 5 1 (2 ---> 1)
7: 6 16 15 2 (1 ---> 2)
8: 9 5 6 0 (1 ---> 0)
9: 8 10 12 1 (0 ---> 1)
10: 11 12 9 2 (1 ---> 2)
11: 10 1 17 1 (2 ---> 1)
12: 13 9 10 0 (2 ---> 0)
13: 12 3 14 2 (0 ---> 2)
14: 15 13 3 0 (1 ---> 0)
15: 14 7 16 1 (0 ---> 1)
16: 17 15 7 0 (2 ---> 0)
17: 16 11 1 2 (0 ---> 2)
 
 
FLIP_WORDS
{0}
{}
{0 3}
{0 4 7}
{0 6}
{3}
{6}
{0 3 1 5}
{0 6 2 8}
{3 1 5}
{6 2 8}
{0 3 1 5 0 1}
{0 6 2 8 0 2}
 
 
PENNER_COORDINATES
2 1 1 1 1 1 1 1 1
 
SECONDARY_FAN
type: PolyhedralFan<Rational>
 
SPECIAL_POINT
1 0
> $p = secondary_polyhedron($s,7);
> $p->VISUAL(FacetColor=>'255 180 80');
p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d0 = $s->gkz_dome(0,5);
> $d0->VISUAL(FacetColor=>'80 180 255');
pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[new Rational(1.5196714),new Rational(-0.5773503)]);
> $p = secondary_polyhedron($s,7);
> $p->VISUAL(FacetColor=>'255 180 80');
p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d0 = $s->gkz_dome(0,5);
> $d0->VISUAL(FacetColor=>'80 180 255');
pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab

More examples can be studied via the following:

> # a torus with two cusps (6 edges)
> $T2 = new Matrix<Int>([[0,0,6,5],[0,0,1,10],[0,0,8,2],[1,0,11,4],[1,0,7,3],[1,0,9,0]]);
> 
> # a sphere with four cusps (6 edges)
> $S4 = new Matrix<Int>([[1,0,2,6],[2,1,4,9],[0,2,0,11],[3,0,8,5],[1,3,1,10],[2,3,3,7]]);
> 
> # a double torus with two cusps (12 edges)
> $DT2 = new Matrix<Int>([[0,0,8,10],[0,0,12,14],[0,0,16,18],[0,0,20,22],[1,0,23,2],[1,0,13,3],[1,0,9,1],[1,0,11,4],[1,0,15,6],[1,0,21,7],[1,0,17,5],[1,0,19,0]]);

To study 4-dim. secondary fans the following method is useful. It intersects the secondary fan with the 3-dim. standard simplex.

> sub norm($){
>    my $B = new Matrix(shift);
>    for (my $i = 0; $i < $B->rows(); ++$i) {
>       my $sum = 0;
>       for (my $j = 1; $j < $B->cols(); ++$j) {
>          $sum = $sum + $B->elem($i,$j);
>       }
>       $x = 1/$sum;
>       $B->row($i) = $x * $B->row($i);
>    }
>    return $B;
> }
> $s = new HyperbolicSurface(DCEL=>$S4,PENNER_COORDINATES=>[1,1,1,1,1,1],SPECIAL_POINT=>[1,0]);
> $f = $s->SECONDARY_FAN;
> $v = ones_vector | $f->RAYS;
> $a = norm($v);
> $b = $a->minor(All,~[0]);
> $c = ones_vector | $b;
> $q = new fan::PolyhedralComplex(POINTS=>$c,INPUT_POLYTOPES=>rows($f->MAXIMAL_CONES));
> $pro = fan::project_full($q);
> $pro->VISUAL;
pcom:pro
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
  • user_guide/tutorials/hyperbolic_surface_tutorial.txt
  • Last modified: 2019/02/04 22:55
  • by 127.0.0.1