from application fan
A polyhedral fan. The current restriction is that each cone in the fan has to be pointed. This will be relaxed later. If a fan is specified via INPUT_RAYS
and INPUT_CONES
each input cone must list all the input rays incident. Once non-trivial linealities are allowed the following will apply: The RAYS
always lie in a linear subspace which is complementary to the LINEALITY_SPACE
.
Scalar
: numeric data type used for the coordinates, must be an ordered field. Default is Rational
.
PolyhedralFan<Rational>
: Unnamed full specialization of PolyhedralFan
A typical example is the normal fan of a convex polytope.
> $f=normal_fan(polytope::cube(3)); > print $f->F_VECTOR; 6 12 8
permuting the MAXIMAL_CONES
permuting the RAYS
These properties are for input only. They allow redundant information.
INPUT_CONES
Maybe redundant list of not necessarily maximal cones. Indices refer to INPUT_RAYS
. Each cone must list all rays of INPUT_RAYS
it contains. Any incident cones will automatically be added. The cones are allowed to contain lineality. Cones which do not have any rays correspond to the trivial cone (contains only the origin). An empty fan does not have any cones. Input section only. Ask for MAXIMAL_CONES
if you want to know the maximal cones (indexed by RAYS
).
In 3-space, we construct the fan containing the closure of the all-positive octant and the (x⇐0, y>=0, z=0) quadrant with the following input (note that we do not have to state the combinatorics for cones contained in a given cone of higher dimension, e.g. the the (x>=0, z>=0) quadrant in the y=0 plane):
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[0,0,1],[-1,0,0]],INPUT_CONES=>[[0,1,2],[1,3]]); > print rows_labeled($f->RAYS); 0:1 0 0 1:0 1 0 2:0 0 1 3:-1 0 0
> print $f->CONES; <{1} {3} {2} {0} > <{1 3} {1 2} {0 2} {0 1} > <{0 1 2} >
INPUT_LINEALITY
Vectors whose linear span defines a subset of the lineality space of the fan; redundancies are allowed. Input section only. Ask for LINEALITY_SPACE
if you want to know the lineality space.
Matrix<Scalar,NonSymmetric>
In 3-space, we can “stretch” the (x>=0, y>=0) quadrant in the z=0 hyperplane to obtain the joint of the two octants where x and y are non-negative by adding linearity in z-direction:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0]],INPUT_CONES=>[[0,1]],INPUT_LINEALITY=>[[0,0,1]]);
INPUT_RAYS
Rays from which the cones are formed. May be redundant. All vectors in the input must be non-zero. You also need to provide INPUT_CONES
to define a fan completely. Input section only. Ask for RAYS
if you want a list of non-redundant rays.
Matrix<Scalar,NonSymmetric>
When constructing the fan which displays the division of the plane into quadrants, we can use redundant rays such that the indices given in INPUT_CONES
suggest that two rays form the border of our fan, but due to our choice in INPUT_RAYS
, they actually are the same ray adjacent to two distinct 2-dimensional cones:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1],[-1,0],[0,-1],[2,0]],INPUT_CONES=>[[0,1],[1,2],[2,3],[3,4]]); > print rows_labeled($f->RAYS); 0:1 0 1:0 1 2:-1 0 3:0 -1
> print $f->CONES; <{0} {1} {2} {3} > <{0 1} {1 2} {2 3} {0 3} >
These properties capture combinatorial information of the object. Combinatorial properties only depend on combinatorial data of the object like, e.g., the face lattice.
COMBINATORIAL_DIM
Combinatorial dimension of the fan.
The normal fan of the 6-cube has combinatorial dimension 5:
> print normal_fan(cube(6))->COMBINATORIAL_DIM; 5
COMPLETE
The polyhedral fan is complete if its suport is the whole space. Due to undecidability issues this is checked heuristically only. See the remarks on SPHERE for details. Note that in the case of a polyhedral complex, this refers to the underlying fan, so should always be false.
The normal fan of a polytope always is complete; here we see this for the 8-cube:
> print normal_fan(cube(8))->COMPLETE; true
CONES
List of all cones of the fan of each dimension. Indices refer to RAYS
.
A fan constructed with a 2-dimensional cone in INPUT_CONES
also contains the incident 1-dimensional cones.
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1]],INPUT_CONES=>[[0,1]]); > print $f->CONES; <{0} {1} > <{0 1} >
CONES_COMBINATORIAL_DIMS
The combinatorial dimensions of the cones.
DUAL_GRAPH
The graph whose nodes are the maximal cones which are connected if they share a common facet. Only defined if PURE
.
F2_VECTOR
fik is the number of incident pairs of i-dimensional cones and k-dimensional cones; the main diagonal contains the F_VECTOR
.
F_VECTOR
fk is the number of k-dimensional cones starting from dimension k=1. The f-vector of a polytope and the f-vector of any of its face fans coincide; for the 3-cube: > print face_fan(cube(3))→F_VECTOR; | 8 12 6
GRAPH
The graph of the fan intersected with a sphere, that is, the vertices are the rays which are connected if they are contained in a common two-dimensional cone.
HASSE_DIAGRAM
To compute the Hasse diagram of the normal fan of the 2-cube and display its decoration, we can do the following. Note the artificial node on top and the empty node at the bottom. The latter represents the trivial cone consisting only of the origin.
> $h = normal_fan(cube(2))->HASSE_DIAGRAM;
print $h→DECORATION;
MAXIMAL_CONES
Non redundant list of maximal cones. Indices refer to RAYS
. Cones which do not have any rays correspond to the trivial cone (contains only the origin). An empty fan does not have any cones.
The maximal cones of the normal fan of the 3-cube describe which faces share a common vertex:
> print normal_fan(cube(3))->MAXIMAL_CONES; {0 2 4} {1 2 4} {0 3 4} {1 3 4} {0 2 5} {1 2 5} {0 3 5} {1 3 5}
MAXIMAL_CONES_COMBINATORIAL_DIMS
The combinatorial dimensions of the maximal cones.
Here we construct a fan with a 3-dimensional and a 2-dimensional maximal cone, of which the latter contains lineality, and then display the corresponding combinatorial dimensions:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[0,0,1],[-1,0,0],[0,-1,0]],INPUT_CONES=>[[0,1,2],[1,3,4]]); > print $f->MAXIMAL_CONES; {0 1 2} {3}
> print $f->MAXIMAL_CONES_COMBINATORIAL_DIMS; 2 0
MAXIMAL_CONES_INCIDENCES
Array of incidence matrices of all maximal cones. Indices refer to RAYS
.
Here we construct a fan with a 3-dimensional and a 2-dimensional maximal cone and then display the incident cones:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[0,0,1],[-1,0,0]],INPUT_CONES=>[[0,1,2],[1,3]]); > print $f->MAXIMAL_CONES; {0 1 2} {1 3}
> print $f->MAXIMAL_CONES_INCIDENCES; <{1 2} {0 2} {0 1} > <{1} {3} >
MAXIMAL_CONES_THRU_RAYS
Transposed to MAXIMAL_CONES
. Notice that this is a temporary property; it will not be stored in any file.
N_CONES
Number of CONES
.
N_MAXIMAL_CONES
Number of MAXIMAL_CONES
.
The number of facets of a polytope is the same as the number of maximal cones of its face fan; here we can see this for the 3-cube:
> print face_fan(cube(3))->N_MAXIMAL_CONES; 6
PURE
The polyhedral fan is pure if all maximal cones are of the same dimension.
Generating a fan from two distinct 2-dimensional cones gives a pure fan:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1],[-1,0],[0,-1]],INPUT_CONES=>[[0,1],[2,3]]); > print $f->PURE; true
Gnerating a fan from a 2-dimensional and a 1-dimensional cone results in the fan not being pure if the latter is a ray not contained in the former:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,1],[-1,1],[0,-1]],INPUT_CONES=>[[0,1],[2]]); > print $f->PURE; false
SIMPLICIAL
The polyhedral fan is simplicial if all maximal cones are simplicial.
The normal fan of a d-cube is simplicial; here we see this for the 3-cube:
> print normal_fan(cube(3))->SIMPLICIAL; true
These properties capture geometric information of the object. Geometric properties depend on geometric information of the object, like, e.g., vertices or facets.
FACET_NORMALS
The possible facet normals of all maximal cones.
Matrix<Scalar,NonSymmetric>
The two facet normals of the complete fan dividing the plane into the four quadrants (which can be obtained by computing the normal fan of the 2-cube) point in x- and in y-direction, respectively:
> print normal_fan(cube(2))->FACET_NORMALS; 1 0 0 1
FAN_AMBIENT_DIM
Dimension of the space which contains the polyhedral fan. Note: To avoid confusion in context of (in-)homogenuous coordinates it is generally advised to use the method AMBIENT_DIM
.
The fan living in the plane containing only the cone which consists of the ray pointing in positive x-direction is by definition embedded in the plane:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0]],INPUT_CONES=>[[0]]); > print $f->FAN_AMBIENT_DIM; 2
FAN_DIM
Dimension of the polyhedral fan. # Note: To avoid confusion in context of (in-)homogenuous coordinates it is generally advised to use the method DIM
.
The fan living in the plane containing only the cone which consists of the ray pointing in positive x-direction is 1-dimensional:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0]],INPUT_CONES=>[[0]]); > print $f->FAN_DIM; 1
FULL_DIM
A fan is full-dimensional if its dimension and ambient dimension coincide.
The normal fan of a polytope is always full-dimensional, which we see here for the 5-dimensional cross polytope:
> $nf = normal_fan(cross(5)); > print $nf->FULL_DIM; true
LINEALITY_DIM
Dimension of the lineality space.
LINEALITY_SPACE
Since we do not require our cones to be pointed: a basis of the lineality space of the fan. Co-exists with RAYS
.
Matrix<Scalar,NonSymmetric>
We can create a fan in 3-space from the two 2-dimensional cones which are the (x,y)- and (x,z)-halfspaces where y and z are non-negative, respectively. Both cones and thus the fan contain lineality in x-direction:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[0,0,1],[-1,0,0]],INPUT_CONES=>[[0,1,3],[0,2,3]]); > print $f->LINEALITY_SPACE; 1 0 0
LINEAR_SPAN_NORMALS
The possible linear span normals of all maximal cones. Empty if PURE
and FULL_DIM
, i.e. each maximal cone has the same dimension as the ambient space.
Matrix<Scalar,NonSymmetric>
We construct a fan in 3-space with two 2-dimensional maximal cones and a 1-dimensional maximal cone. Note that there are two possible normals for the latter, but one of these also is a normal for one of the 2-dimensional cones; thus we receive three normals:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[-1,0,1],[-1,-1,0]],INPUT_CONES=>[[0,1],[1,2],[3]]); > print $f->LINEAR_SPAN_NORMALS; 0 0 1 1 0 1 -1 1 0
MAXIMAL_CONES_FACETS
Tells for each maximal cone what are its facet normals, thus implying the facets. Each row corresponds to a maximal cone and each column to the row with the same index of FACET_NORMALS
. A negative number means that the corresponding row of FACET_NORMALS
has to be negated.
The two facet normals of the complete fan dividing the plane into the four quadrants (which can be obtained by computing the normal fan of the 2-cube) point in x- and in y-direction, respectively. Each quadrant has both of these as normals only differing by the combination of how they point in- or outside:
> $f = normal_fan(cube(2)); > print $f->MAXIMAL_CONES; {0 2} {1 2} {0 3} {1 3}
> print rows_numbered($f->FACET_NORMALS); 0:1 0 1:0 1
> print $f->MAXIMAL_CONES_FACETS; 1 1 -1 1 1 -1 -1 -1
MAXIMAL_CONES_LINEAR_SPAN_NORMALS
Tells for each maximal cone what is its linear span by naming its normals. Indices refer to LINEAR_SPAN_NORMALS
. Rows correspond to MAXIMAL_CONES
. An empty row corresponds to a full-dimensional cone.
We construct a fan in 3-space with two 2-dimensional maximal cones and a 1-dimensional maximal cone. This way we receive two cones with one normal and one cone with two normals:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0],[0,1,0],[-1,0,1],[-1,-1,0]],INPUT_CONES=>[[0,1],[1,2],[3]]); > print $f->MAXIMAL_CONES; {0 1} {1 2} {3}
> print rows_numbered($f->LINEAR_SPAN_NORMALS); 0:0 0 1 1:1 0 1 2:-1 1 0
> print $f->MAXIMAL_CONES_LINEAR_SPAN_NORMALS; {0} {1} {0 2}
N_FACET_NORMALS
The number of possible facet normals of all maximal cones.
The facets of the normal fan of the 3-cube are each spanned by a ray pointing in positive or negative direction of one axis and another ray pointing in positive or negative direction of another axis; thus, the third axis is normal to this facet. This leaves us with three possible facet normals:
> print normal_fan(cube(3))->N_FACET_NORMALS; 3
N_INPUT_RAYS
Number of INPUT_RAYS
.
To determine the combined amount of redundant and unused rays given by INPUT_RAYS
, we compare this number to N_RAYS
:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1],[-1,0],[0,-1],[2,0],[1,1]],INPUT_CONES=>[[0,1],[1,2],[2,3],[3,4]]); > print ($f->N_INPUT_RAYS-$f->N_RAYS); 2
N_RAYS
Number of RAYS
.
The number of facets of a polytope is the number of rays of the corresponding normal fan. Here we see this for the 3-cube:
> print normal_fan(cube(3))->N_RAYS; 6
ORTH_LINEALITY_SPACE
A basis of the orthogonal complement to LINEALITY_SPACE
.
Matrix<Scalar,NonSymmetric>
In 3-space, we build a fan containing only the ray pointing in positive x-direction, together with lineality in y-direction. The definition of the cones yields no additional lineality, thus the orthogonal complement to the lineality space is spanned by (1,0,0) and (0,0,1):
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0,0]],INPUT_CONES=>[[0]],INPUT_LINEALITY=>[[0,1,0]]); > print $f->ORTH_LINEALITY_SPACE; 1 0 0 0 0 1
POINTED
A fan is pointed if the lineality space is trivial.
The normal fan of a polytope is pointed if and only if the polytope is full-dimensional. Here we confirm this for the normal fans of the 2-cube living in 2- and in 3-space, respectively:
> $nf_full = normal_fan(cube(2)); > print $nf_full->POINTED; true
> $nf_not_full = normal_fan(product(cube(2),new Polytope(POINTS=>[[1,0]]))); > print $nf_not_full->POINTED; false
PSEUDO_REGULAR
True if the fan is a subfan of a REGULAR
fan
Here we build a fan in the plane with the non-negative quadrant and the ray pointing in negative y-direction as its maximal cones. This is a subfan of the fan with all four quadrants as its maximal cones which is the normal fan of the 2-cube; thus, our fan is pseudo regular:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1],[-1,0]],INPUT_CONES=>[[0,1],[2]]); > print $f->PSEUDO_REGULAR; true
RAYS
Rays of the PolyhedralFan
. Non-redundant. Co-exists with LINEALITY_SPACE
.
Matrix<Scalar,NonSymmetric>
The rays of the face fan of a 3-dimensioanl cube. This fan has one ray in the direcction of each vertex of the cube.
> print face_fan(cube(3))->RAYS; -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1 1
REGULAR
True if the fan is the normal fan of a bounded polytope.
The face fan of the centered d-dimensional cross polytope w.r.t. the origin is the normal fan of the d-cube; here we confirm the regularity of the face fan for d=7:
> print face_fan(cross(7))->REGULAR; true
A normal fan always is complete; thus a fan which is not complete can not be regular:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0],[0,1]],INPUT_CONES=>[[0,1]]); > print $f->REGULAR; false
These properties capture information of the object that is concerned with the action of permutation groups.
GROUP
REPRESENTATIVE_INPUT_CONES
explicit representatives of equivalence classes of INPUT_CONES
under a group action
REPRESENTATIVE_INPUT_RAYS
explicit representatives of equivalence classes of INPUT_RAYS
under a group action
CONES_ORBIT_SIZES
Number of CONES
in each orbit represented by the elements of REPRESENTATIVE_CONES
.
MATRIX_ACTION
MatrixActionOnVectors<Scalar>
MAXIMAL_CONES_ACTION
REPRESENTATIVE_COMBINATORIAL_DIMS
dimensions of representatives of maximal cones
REPRESENTATIVE_F_VECTOR
counts how many representatives of maximal cones there are in each dimension
ORBITS_F_VECTOR
fk is the number of k-dimensional cones up to symmetry.
REPRESENTATIVE_CONES
List of all cones of all dimensions of the fan, one from each orbit, sorted by dimension. Indices in the IncidenceMatrix's refer to RAYS
.
REPRESENTATIVE_MAXIMAL_CONES
One representative from every orbit of the MAXIMAL_CONES
under the group action.
REPRESENTATIVE_RAYS
One representative from every orbit of the RAYS
under the group action.
Matrix<Scalar,NonSymmetric>
The following properties are topological invariants.
HOMOLOGY
The homology of the intersection of the fan with the unit sphere. # @example When intersecting, the normal fan of the 3-cube gives us a simplicial complex which is a topological 2-sphere: > print normal_fan(cube(3))→HOMOLOGY; | ({} 0) | ({} 0) | ({} 1)
INTERSECTION_COMPLEX
If the fan is SIMPLICIAL
the simplicial complex obtained by intersecting the fan with the unit sphere. If the fan is not SIMPLICIAL
the crosscut complex of the intersection.
When intersecting, the normal fan of the 3-cube gives us a simplicial complex which is a topological 2-sphere:
> $ic = normal_fan(cube(3))->INTERSECTION_COMPLEX;
print $ic→SPHERE;
Properties coming from associated toric varieties
GORENSTEIN
A fan is Gorenstein if it is Q_GORENSTEIN
with Q_GORENSTEIN_INDEX
equal to one.
Q_GORENSTEIN
A fan is Q-GORENSTEIN if each maximal cone is Q_Gorenstein.
Q_GORENSTEIN_INDEX
If a fan is Q_GORENSTEIN
, then its Q-Gorenstein index is the least common multiple of the Q-Gorenstein indices of its maximal cones. Otherwise Q_GORENSTEIN_INDEX is undefined.
SMOOTH_FAN
A fan is smooth if all cones of the fan are smooth.
These properties are for visualization.
INPUT_RAY_LABELS
Unique names assigned to the INPUT_RAYS
. Similar to RAY_LABELS
for RAYS
.
MAXIMAL_CONE_LABELS
Unique names assigned to the MAXIMAL_CONES
. Similar to RAY_LABELS
for RAYS
.
RAY_LABELS
Unique names assigned to the RAYS
. If specified, they are shown by visualization tools instead of vertex indices. For a polyhedral fan built from scratch, you should create this property by yourself, either manually in a text editor, or with a client program.
The normal fan of the 2-cube has 4 rays; to assign the labels 'a', 'b' and 'any label' to the first three entries of RAYS
, do this (note that the unspecified label of the last ray is blank when visualizing, and that, depending on your visualization settings, not the whole string of the third label might be displayed):
> $f = normal_fan(cube(2)); > $f->RAY_LABELS=['a','b','any label'];
These methods capture combinatorial information of the object. Combinatorial properties only depend on combinatorial data of the object like, e.g., the face lattice.
CONES_DIMS()
The dimensions of the cones.
cone(Int i)
Returns the i-th maximal cone.
Int
i
To obtain the cone generated by the x-, y- and z-axis, we can take the first cone of the normal fan of the 3-cube:
> $c = normal_fan(cube(3))->cone(0); > print $c->RAYS; 1 0 0 0 1 0 0 0 1
cones_of_dim(Int k)
Returns an incidence matrix containing the cones of dimension k
These methods capture geometric information of the object. Geometric properties depend on geometric information of the object, like, e.g., vertices or facets.
AMBIENT_DIM()
Returns the dimension of the ambient space.
The fan living in the plane containing only the cone which consists of the ray pointing in positive x-direction is by definition embedded in the plane:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0]],INPUT_CONES=>[[0]]); > print $f->AMBIENT_DIM; 2
DIM()
Returns the dimension of the linear space spanned by the fan.
The fan living in the plane containing only the cone which consists of the ray pointing in positive x-direction is 1-dimensional:
> $f = new PolyhedralFan(INPUT_RAYS=>[[1,0]],INPUT_CONES=>[[0]]); > print $f->DIM; 1
These methods are for visualization.
VISUAL()
Visualizes the fan, intersected with the unit ball.
geometric_options_linear