polymake -A topaz
or, if you've already started ''%%polymake%%'', type
> application 'topaz';
in the ''%%polymake%%'' shell.
==== Simplicial complexes ====
The most important object of the ''%%topaz%%'' application is the simplicial complex. There are several ways of obtaining one.
=== From faces ===
For example, you can specify some faces of the complex. You can pass them as an ''%%Array< Set
> # $s = new SimplicialComplex(INPUT_FACES=>[new Set(0), new Set(0,1), new Set(1,2,3)]);
> $s = new SimplicialComplex(INPUT_FACES=>[[0],[0,1],[1,2,3]]);
As you can see, redundancies are allowed -- ''%%[0]%%'' is not a facet of the complex, and thus not necessary for encoding ''%%$s%%''. You can compute the inclusion maximal faces like this:
> print $s->FACETS;
{0 1}
{1 2 3}
You can also pass the ''%%FACETS%%'' to the constructor, but be aware that in that case the vertices must be numbered increasingly starting with ''%%0%%'' and redundancies are prohibited.
Take a look at your complex using
> $s->VISUAL;
> print $s->HASSE_DIAGRAM->DECORATION;
({-1} 4)
({0 1} 2)
({1 2 3} 3)
({0} 1)
({1} 1)
({1 2} 2)
({1 3} 2)
({2 3} 2)
({} 0)
({2} 1)
({3} 1)
The first entry of each pair denotes the face, the second is the rank. The ''%%{-1}%%''-node is a dummy representing the whole complex. the ''%%{}%%''-node is the empty face. If you want to look at a pretty graph representation, try the visualization:
> $s->VISUAL_FACE_LATTICE;
{{ tutorials:feature:tutorials:threejs_glitches:apps_topaz:output_0.svg }}
=== Using clients ===
There are several clients that construct common simplicial complexes (for a comprehensive list, see the [[documentation:latest:topaz|topaz documentation]]). An example is the torus client:
> $t = torus();
Of course, ''%%polymake%%'' can compute the reduced integer homology groups of a simplicial complex, so we can convice ourselves this is a torus:
> print $t->MANIFOLD;
true
> print $t->HOMOLOGY;
({} 0)
({} 2)
({} 1)
The ''%%i%%''-th line represents the $i$-th homology module. The curly braces contain torsion coefficients with multiplicity, the second pair entry denotes the Betti number. The empty curly braces indicate that ''%%$t%%'' is torsion-free. You can see a non-empty torsion group here (using the ''%%rows_numbered%%'' client for a pretty print with the corresponding dimensions):
> print rows_numbered( real_projective_plane()->HOMOLOGY );
0:{} 0
1:{(2 1)} 0
2:{} 0
As expected, the first homology group has torsion coefficient ''%%2%%'' with multiplicity ''%%1%%'' and all Betti numbers are zero.
=== As boundary complex ===
If your complex is a pseudo-manifold, you can obtain a new complex from its boundary. For example, this produces a triangulation of the $2$-sphere:
> $bs = simplex(3)->BOUNDARY;
> print $bs->SPHERE;
true
=== Triangulating polytopes ===
The triangulation of a polytope is a simplicial complex, too. The ''%%TRIANGULATION%%'' gets stored in a property of the polytope. We use the ''%%cube%%'' client from the ''%%polytope%%'' application to demonstrate:
> $c = polytope::cube(3);
> $tc = $c->TRIANGULATION;
> print $tc->FACETS;
{0 1 2 4}
{1 2 3 4}
{1 3 4 5}
{2 3 4 6}
{3 4 5 6}
{3 5 6 7}
==== Geometric realizations ====
The ''%%topaz%%'' application is primarily designed to deal with abstract simplicial complexes that do not come with coordinates for an embedding in euclidean space. There is a special object subtype named ''%%GeometricSimplicialComplex%%'' that has extra properties for dealing with coodinates.
You can pass the coordinates to the constructor. Take care to choose an embedding without crossings!
> $s = new GeometricSimplicialComplex(INPUT_FACES=>[[0],[0,1],[1,2,3]], COORDINATES=>[[1,0],[1,1],[0,2],[2,2]]);
Some clients produce complexes with geometric realization...
> $b = ball(3);
> # print a dense representation of the sparse matrix
> print dense( $b->COORDINATES );
0 0 0
1 0 0
0 1 0
0 0 1
...some others provide the option ''%%geometric_realization%%'' so you can decide whether to invest the extra computing time.
> $bs = barycentric_subdivision($b,geometric_realization=>1);
Again, see the [[documentation:latest:topaz|topaz documentation]] for a comprehensive list.
==== Visualization ====
Visualization of simplicial complexes uses the ''%%VISUAL%%'' property. Check out
> help 'objects/SimplicialComplex/methods/Visualization/VISUAL';
VISUAL(Options) -> Visual::SimplicialComplex
Visualizes the complex.
If G_DIM < 4, the GRAPH and the facets
are visualized using the COORDINATES.
Otherwise, the spring embedder and the GRAPH are used to
produce coordinates for the visualization.
If JavaView is used to visualize the complex, all faces of
one facet build a geometry in the jvx-file, so you may use
Method -> Effect -> Explode Group of Geometries in the JavaView menu.
Options:
mixed_graph => Bool use the MIXED_GRAPH for the spring embedder
seed => Int random seed value for the string embedder
Options: Attributes modifying the appearance of filled polygons.
FacetColor => Color filling color of the polygon
FacetTransparency => Float transparency factor of the polygon between 0 (opaque) and 1 (completely translucent)
FacetStyle => String if set to "hidden", the inner area of the polygon is not rendered
EdgeColor => Color color of the boundary lines
EdgeThickness => Float scaling factor for the thickness of the boundary lines
EdgeStyle => String if set to "hidden", the boundary lines are not rendered
Title => String the name of the drawing
Name => String the name of this visual object in the drawing
Hidden => Bool if set to true, the visual object is not rendered
(useful for interactive visualization programs allowing for switching details on and off)
PointLabels => String if set to "hidden", no point labels are displayed
VertexLabels => String alias for PointLabels
PointColor => Flexible color of the spheres or rectangles representing the points
VertexColor => Flexible alias for PointColor
PointThickness => Flexible scaling factor for the size of the spheres or rectangles representing the points
VertexThickness => Flexible alias for PointThickness
PointBorderColor => Flexible color of the border line of rectangles representing the points
VertexBorderColor => Flexible alias for PointBorderColor
PointBorderThickness => Flexible scaling factor for the thickness of the border line of rectangles representing the points
VertexBorderThickness => Flexible alias for PointBorderThickness
PointStyle => Flexible if set to "hidden", neither point nor its label is rendered
VertexStyle => Flexible alias for PointStyle
ViewPoint => Vector ViewPoint for Sketch visualization
ViewDirection => Vector ViewDirection for Sketch visualization
ViewUp => Vector ViewUp for Sketch visualization
Scale => Float scale for Sketch visualization
LabelAlignment => Flexible Defines the alignment of the vertex labels: left, right or center
Options: Attributes modifying the appearance of graphs
Coord => Matrix 2-d or 3-d coordinates of the nodes.
If not specified, a random embedding is generated using a pseudo-physical spring model
NodeColor => Flexible alias for PointColor
NodeThickness => Flexible alias for PointThickness
NodeBorderColor => Flexible alias for PointBorderColor
NodeBorderThickness => Flexible alias for PointBorderThickness
NodeStyle => Flexible alias for PointStyle
NodeLabels => String alias for PointLabels
ArrowStyle => Flexible How to draw directed edges: 0 (like undirected), 1 (with an arrow pointing towards the edge),
or -1 (with an arrow pointing against the edge). Default is 1 for directed graphs and lattices.
EdgeColor => Flexible color of the lines representing the edges
EdgeThickness => Flexible scaling factor for the thickness of the lines representing the edges
EdgeLabels => EdgeMap textual labels to be placed along the edges
EdgeStyle => Flexible if set to "hidden", neither the edge nor its label is rendered
Title => String the name of the drawing
Name => String the name of this visual object in the drawing
Hidden => Bool if set to true, the visual object is not rendered
(useful for interactive visualization programs allowing for switching details on and off)
PointLabels => String if set to "hidden", no point labels are displayed
VertexLabels => String alias for PointLabels
PointColor => Flexible color of the spheres or rectangles representing the points
VertexColor => Flexible alias for PointColor
PointThickness => Flexible scaling factor for the size of the spheres or rectangles representing the points
VertexThickness => Flexible alias for PointThickness
PointBorderColor => Flexible color of the border line of rectangles representing the points
VertexBorderColor => Flexible alias for PointBorderColor
PointBorderThickness => Flexible scaling factor for the thickness of the border line of rectangles representing the points
VertexBorderThickness => Flexible alias for PointBorderThickness
PointStyle => Flexible if set to "hidden", neither point nor its label is rendered
VertexStyle => Flexible alias for PointStyle
ViewPoint => Vector ViewPoint for Sketch visualization
ViewDirection => Vector ViewDirection for Sketch visualization
ViewUp => Vector ViewUp for Sketch visualization
Scale => Float scale for Sketch visualization
LabelAlignment => Flexible Defines the alignment of the vertex labels: left, right or center
Returns Visual::SimplicialComplex
{{:tutorials:feature:tutorials:threejs_glitches:apps_topaz:ball_triang.png}} for a list of available options and this [[visual_tutorial|tutorial]] for a general intro to visualization in polymake.
If your complex is of dimension three or lower, you can visualize a geometric realization together with the ''%%GRAPH%%'' of the complex using the ''%%VISUAL%%'' property. Note that if your complex is not a ''%%GeometricSimplicialComplex%%'', ''%%polymake%%'' will use the spring embedder to find an embedding of the graph of the complex, which is not guaranteed to result in an intersection-free visualization.
> $bs->VISUAL;
> $a = new Array>(1); $a->[0] = $bs->FACETS->[4];
> $bs->VISUAL->FACES($a, FacetColor => 'pink');
> $k = klein_bottle();
> svg($k->VISUAL_FACE_LATTICE->MORSE_MATCHING->FACES($k->MORSE_MATCHING->CRITICAL_FACES));
{{ tutorials:feature:tutorials:threejs_glitches:apps_topaz:output_1.svg }}
{{:tutorials:feature:tutorials:threejs_glitches:apps_topaz:kb_mm_faces.gif}} Here the matching of faces is denoted by reversed red arrows and the critical faces are marked red. Check that the graph remains acyclic.
For higher dimensional complexes that cannot be visualized in 3D, you can still have a look at the graphs while ignoring any specified coordinates by using ''%%VISUAL_GRAPH%%'', ''%%VISUAL_DUAL_GRAPH%%'', or ''%%VISUAL_MIXED_GRAPH%%''. An easy example:
> polytope::cube(3)->TRIANGULATION->VISUAL_MIXED_GRAPH;
tikz($s->VISUAL_FACE_LATTICE, File=>"/path/to/file.tikz");