Fans in Toric Lattices

A fan F (in a toric lattice L) is a collection of cones in L satisfying typical conditions of cell decompositions (the inclusion of faces of cones is part of the data, and the requirement that any two cones of the fan intersect in a common face is enforced, for instance). The support of F is the union of all the cones as a subset of L. The main two cases are when either the support of F is the support of a single cone (which is regarded as being subdivided by the cones of the fan) or it is the whole of L. Other cases do occur and are allowed by our package---even having cones of different dimensions lying in complementary linear subspaces of L, although that is not commonly interpreted geometrically.

There are several constructors for well-known fans, and also standard methods for modifying fans. If these are not enough, then one can simply list the top-dimensional cones of a fan; Magma will check that they intersect correctly and will add the lower-dimensional cones as necessary.

Fans are of type TorFan.

Contents

Construction of Fans

We first list the comprehensive constructors for fans. After that, we have a collection of constructors for well-known fans, and there also are methods for modifying fans.

Fan(Q) : [TorCon] -> TorFan
    define_fan: BoolElt                 Default: false
    max_cones: BoolElt                  Default: false
The fan generated by the cones in the sequence Q.

The optional parameter define_fan (by default false) can be set to true, so that the verification whether the input data is correct is skipped. The optional parameter max_cones (by default false) can be set to true to skip the verification whether the cones are maximal. Both will lead to errors later if the cones do not in fact determine a fan as claimed.

Fan(R,S) : [TorLatElt],[[RngIntElt]] -> TorFan
    define_fan: BoolElt                 Default: false
The fan whose rays are the sequence of toric lattice points R (or sequences of sequences of integer coefficients of such points) and whose maximal cones correspond to the sequence S of sequences of integers: each such sequence is interpreted as the indices of a collection of rays of R, and these rays are used to generate a cone.

This constructor checks that the given data does indeed define a fan. This check can be lengthy. It can be omitted by setting the parameter define_fan to be false, although this should be used with extreme care: there is no telling what might go wrong if incorrect data is assumed to be a fan.

Fan(C) : TorCon -> TorFan
The fan comprising all faces of the cone C.
FanOfAffineSpace(n) : RngIntElt -> TorFac
The standard fan of affine space of dimension n, where n is a positive integer.
FanOfWPS(W) : SeqEnum -> TorFan
A standard fan for the weighted projective space with weights W, a sequence of positive integers.
[Future release] FanOfProjectiveSpace(n) : RngIntElt -> TorFac
The standard fan of projective space of dimension n, a positive integer.
FanOfFakeProjectiveSpace(W,Q) : SeqEnum, SeqEnum -> TorFan
A standard fan for the fake weighted projective space with weights W, a sequence of positive integers, and finite cyclic group actions given by Q, a sequence of sequences of rational numbers. The finite cyclic actions are determined as follows: for Z/r to act diagonally with weights (a1, ..., an), include the sequence [a1/r,...,an/r] as an element of Q.
ZeroFan(L) : TorLat -> TorFan
The fan in the toric lattice L supported at the origin.
NormalFan(F,C) : TorFan,TorCon -> TorFan,Map
The normal fan to a cone C in a fan F in the toric lattice that is the quotient of the ambient lattice of F by the span of C; the quotient map of lattices is the second return value.
NormalFan(P) : TorPol -> TorFan
DualFan(P) : TorPol -> TorFan
The normal fan to the polyhedron P; in particular, the rays of the fan are normal to the facets of P. The resulting fan lies in the lattice dual to the ambient lattice of P.
SpanningFan(P) : TorPol -> TorFan
The toric fan that spans the polyhedron P; in particular, the rays of the fan are generated by the vertices of P. The resulting fan lies in the same ambient lattice as P.

Example Toric_toric-spanning-fan-example (H126E6)

The spanning fan of a polytope P is a fan in the same lattice as P with rays passing through its vertices. Here we make the fan of the Hirzebruch surface F1 as a spanning fan.
> P := Polytope([ [0,1], [1,0], [1,-1], [-1,0] ]);
> SpanningFan(P);
Fan with 4 rays:
    ( 0,  1),
    ( 1,  0),
    ( 1, -1),
    (-1,  0)
and 4 cones with indices:
    [ 1, 4 ],
    [ 1, 2 ],
    [ 2, 3 ],
    [ 3, 4 ]
The dual fan of a polytope P is a fan in the dual lattice to that of P whose rays are constant when evaluated on some facet of P. Here we make the fan of projective 3-space as a dual fan.
> Q := StandardSimplex(3);
> DualFan(Q);
Fan with 4 rays:
    (-1, -1, -1),
    ( 1,  0,  0),
    ( 0,  1,  0),
    ( 0,  0,  1)
and 4 cones with indices:
    [ 2, 3, 4 ],
    [ 1, 3, 4 ],
    [ 1, 2, 4 ],
    [ 1, 2, 3 ]
Mapping from: 3-dimensional toric lattice (Z^3)^* to 3-dimensional toric lattice
(Z^3)^* given by a rule
FanWithWeights(W) : SeqEnum -> TorFan
    ample: [RngIntElt]                  Default: the sum of weights
    define_fan: BoolElt                 Default: false
The fan generated by the weights (or gradings) W, where W is a sequence of sequences of integers. The optional parameter ample can be used to specify the ample divisor to use. By default this is equal to the sum of the weights. If the optional parameter define_fan is set to true then the verification that the weights define a fan is skipped.
Blowup(F,v): TorFan,TorLatElt -> TorFan
The blowup of the toric fan F at the point v that is an element of the ambient toric lattice of F.

Example Toric_toric-fan-with-weights-example (H126E7)

We construct a toric Fano three-fold X directly from the weight (or grading) data:
> F:=FanWithWeights([
>     [ 1, 1,-1, 0,-2, 0 ],
>     [ 0, 0, 1, 1, 0, 0 ],
>     [ 0, 0, 0, 0, 1, 1 ]
> ]);
> X<[x]>:=ToricVariety(Rationals(),F);
> X;
Toric variety of dimension 3 over Rational Field
Variables: x[1], x[2], x[3], x[4], x[5], x[6]
The components of the irrelevant ideal are:
    (x[4], x[3]), (x[5], x[2]), (x[3], x[2]), (x[6], x[5], x[1]),
    (x[6], x[4], x[1])
The 3 gradings are:
    0, 0, 1, 1, 0, 0,
    0, 1, 0, 0, 1, 0,
    1, 0, 0, 2, 1, 1
> IsFano(X);
true
> IsNonsingular(X);
false
> IsQFactorial(X);
true
> IsTerminal(X);
true
Now we begin by taking P = P(1, 1, 1, 2) and blowing up twice. We obtain a Q-factorial terminal Fano three-fold Y.
> P:=WPS(Rationals(),[1,1,1,2]);
> F:=Fan(P);
> F;
Fan F with 4 rays:
    ( 0, -1, -1),
    (-1,  0,  1),
    (-1,  1,  0),
    ( 1,  0,  0)
and 4 cones with indices:
    [ 1, 2, 3 ],
    [ 1, 2, 4 ],
    [ 1, 3, 4 ],
    [ 2, 3, 4 ]
> N:=Ambient(F);
> pt1:=N ! [1,-1,0];
> pt2:=N ! [-1,0,0];
> Y1:=Blowup(P,pt1);
> Y<[y]>:=Blowup(Y1,pt2);
> Y;
Toric variety of dimension 3 over Rational Field
Variables: y[1], y[2], y[3], y[4], y[5], y[6]
The components of the irrelevant ideal are:
    (y[6], y[5]), (y[6], y[4]), (y[5], y[3]), (y[4], y[2], y[1]),
    (y[3], y[2], y[1])
The 3 gradings are:
    0, 0, 0, 1, 0, 1,
    0, 0, 1, 0, 1, 0,
    1, 1, 1, 2, 0, 0
> IsFano(Y);
true
We want to show that X and Y are isomorphic. Since they are both Fano, we will work with the polytopes generated by the rays of the fans. It is then trivial to construct an isomorphism between these two polytopes; equivalently, we have an isomorphism between the fans of X and Y.
> PX:=Polytope(Rays(Fan(X)));
> PY:=Polytope(Rays(Fan(Y)));
> bool,phi:=IsIsomorphic(PX,PY);
> bool;
true
> phi;
Mapping from: 3-dimensional toric lattice Z^3 to TorLat: N given by a rule
> DefiningMatrix(phi);
[ 0 -1  0]
[-1  0  1]
[ 1 -1  0]
> Image(phi,Fan(X)) eq Fan(Y);
true
IsInSupport(v,F) : TorLatElt,TorFan -> BoolElt,RngIntElt
Return true if and only if the support of the fan F contains the element v of its ambient toric lattice. In this case, the index of the first cone of F that contains v is also returned.
OneSkeleton(F) : TorFan -> TorFan
The fan generated by the rays of the fan F.
Fan(F1,F2) : TorFan,TorFan -> TorFan
F1 * F2 : TorFan,TorFan -> TorFan
Fan(Q) : [TorFan] -> TorFan
F ^ n : TorFan,RngIntElt -> TorFan
The nth Cartesian product of the fan F.
F eq G : TorFan,TorFan -> BoolElt
Return true if and only if the two fans F and G are equal as objects in Magma (not simply isomorphic as fans).

Components of Fans

One can retrieve all the usual components of fans: their cones, rays and other dimensional skeletons, and so on.

Note the novelty of `virtual' rays. Virtual rays occur when the rays of the fan in question do not span the ambient lattice, and so one may easily never encounter them. They occur if and only if the underlying toric variety is a product of C * times X for a smaller toric variety X. If this the case, the fan is contained in a hyperplane (or smaller linear space, if there are more factors of C * ). Virtual rays will be in the direction transversal to this hyperplane. Thus a virtual ray is not an honest ray, but a formal object introduced to allow C * as a toric variety and give meaning to its coordinate. If virtual rays are not specified on creation, then Magma will decide where to put them (later, when it needs them).

Skeleton(F,n) : TorFan,RngIntElt -> TorFan
The fan generated by cones of the fan F of dimension at most the integer n.
C in F : TorCon,TorFan -> BoolElt
Return true if and only if the cone C is one of the cones of the fan F.
Cones(F) : TorFan -> SeqEnum
A sequence of the maximal cones of the fan F.
Cones(F,i) : TorFan,RngIntElt -> SeqEnum
The sequence of all i-dimensional cones in the fan F.
ConesOfCodimension(F,i) : TorFan,RngIntElt -> SeqEnum
The sequence of all codimension i cones in the fan F.
MaxCones(F) : TorFan -> SeqEnum
The cones of maximum dimension in the fan F.
AllCones(F) : TorFan -> SeqEnum
A sequence of all the cones of the fan F.
Cone(F,i) : TorFan,RngIntElt -> TorCon
The ith cone of the sequence of maximal cones of the fan F.
Cone(F,S) : TorFan,[RngIntElt] -> TorCon
    in_fan: BoolElt                     Default: true
    extend: BoolElt                     Default: false
The cone C spanned by those rays in the fan F whose indices appear in S. By default C must be a cone in F. If the optional parameter extend is set to true then the smallest cone in F containing C will be found (if such a cone exists). If the parameter in_fan is set to false then the cone is forcibly created even if it failed previous tests.
NonSimplicialCones(F) : TorFan -> SeqEnum, SeqEnum
The minimum sequence of non-simplicial (i.e. non-Q-factorial) cones of the fan F. Also gives the sequences of indices of the rays of F defining each non-simplicial cone.
SingularCones(F) : TorFan -> SeqEnum,SeqEnum
A sequence containing the minimal singular cones of the fan F. A second (parallel) sequence contains sets of the indices of the rays that generate these cones.

Example Toric_toric-singular-cones-example (H126E8)

The weighted projective space P(1, 2, 2, 3) has a singular line (with stabiliser Z/2) and a singular point (with stabiliser Z/3).
> F := FanOfWPS([1,2,2,3]);
> SingularCones(F);
[
    2-dimensional simplicial cone with 2 minimal generators:
        (-1, -1,  0),
        (-1,  1,  0),
    3-dimensional simplicial cone with 3 minimal generators:
        (-1, -1,  0),
        ( 1, -1, -1),
        ( 1,  0,  1)
]
[
    { 1, 4 },
    { 1, 2, 3 }
]
The two cones correspond to these two singular strata; the point strata lying on the line are not returned, since they can be recovered, if needed, as the cones having this 2-dimensional cone in their boundary.
ConeIndices(F) : TorFan -> SeqEnum
The sequence S of sets of integers, such that ith cone of the fan F is generated by rays with indices S[i].
ConeIndices(F,C) : TorFan, TorCon -> SeqEnum
The sequence of integers that are the indices of the rays which generate the cone C of the fan F.
ConeIntersection(F,C1,C2) : TorFan,TorCon,TorCon -> TorCon
The intersection of the two cones C1 and C2, both of which are members of the fan F. (This is usually more efficient than C1 meet C2 given that the fan F exists.)
Face(F,C) : TorFan,TorCon -> TorCon
The smallest cone in the fan F which contains the cone C. (An error is returned if there is no such cone in the fan.)
InnerNormals(F) : TorFan -> SeqEnum
OuterNormals(F) : TorFan -> SeqEnum
If all the cones of the fan F are Q-Gorenstein, this returns a sequence of elements in the dual lattice where the i-th element is the inner (resp. outer) normal of the i-th cone of F.
DualFaceInDualFan(P,Q) : TorPol,[RngIntElt] -> TorFan
The cone in the toric fan dual to the polyhedron P which is dual to the face of P determined by the sequence of integers Q.
Rays(F) : TorFan -> SeqEnum
A sequence containing the rays of the fan F (as a sequence of primitive lattice points on each ray).
Ray(F,i) : TorFan,RngIntElt -> TorLatElt
The ith ray of the fan F (regarded as the primitive ambient toric lattice point on the ray).
AllRays(F) : TorFan -> SeqEnum
A sequence of the rays of the fan F (including all virtual rays).
PureRays(F) : TorFan -> SeqEnum
A sequence of the (non-virtual) rays of the fan F.
PureRayIndices(F) : TorFan -> SeqEnum
A sequence of the indices of the non-virtual rays of the fan F among all its rays.
CreateVirtualRays(S) : [TorLatElt] -> SeqEnum
Given a sequence S of rays of a fan, computes the remaining virtual rays which form a basis of the lattice complementary to the linear span of S. Virtual rays are useful, for example, when calculating the coordinate ring of the toric variety associated to the fan when the variety is a product of a torus and a smaller toric variety.
VirtualRays(F) : TorFan -> SeqEnum
A sequence of the virtual rays of the fan F.
VirtualRayIndices(F) : TorFan -> SeqEnum
A sequence of the indices of the virtual rays of the fan F among all its rays.

Properties of Fans

Ambient(F) : TorFan -> TorLat
The ambient toric lattice of the toric fan F.
IsComplete(F) : TorFan -> BoolElt
Return true if and only if the toric fan F has its entire ambient toric lattice; that is, the cones of F cover the whole ambient space.
IsSingular(F) : TorFan -> BoolElt
Return false if and only if all the cones of the fan F are nonsingular.
IsNonsingular(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are nonsingular.
IsQFactorial(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are Q-factorial.
IsIsolated(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are isolated.
IsTerminal(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are terminal.
IsCanonical(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are canonical.
IsGorenstein(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are Gorenstein.
IsQGorenstein(F) : TorFan -> BoolElt
Return true if and only if all the cones of the fan F are Q-Gorenstein.

Maps of Fans

F @ f : TorFan,Map -> TorFan
The image of the fan F by the map f of toric lattices.
SimplicialSubdivision(F) : TorFan -> TorFan
SimplicialSubdivision(C) : TorCon -> TorFan
A toric fan that is a simplicial subdivision of the toric fan F (or of the toric cone C).

Example Toric_toric-simplicial-example (H126E9)

If C is a cone on a square, then it has two small simplicial subdivisions---the two sides of a standard flop, in fact. The simplicial subdivision intrinsic selects one of these.
> L := ToricLattice(3);
> C := Cone([L| [1,0,0], [0,1,0], [0,0,1],[1,-1,1]]);
> SiC := SimplicialSubdivision(C);
> #Cones(SiC);
2
> [ ZGenerators(B) : B in Cones(SiC) ];
[
    [
        (0, 1, 0),
        (1, -1, 1),
        (1, 0, 0)
    ],
    [
        (0, 1, 0),
        (1, -1, 1),
        (0, 0, 1)
    ]
]
IsFanMap(F1,F2) : TorFan,TorFan -> BoolElt
Return true if and only if the two fans F1 and F2 lie in the same toric lattice, and each cone of F1 is a subcone of some cone of F2.
IsFanMap(F1,F2,f) : TorFan,TorFan,Map -> BoolElt
Return true if and only if the toric lattice map f between the ambient toric lattices of the two fans F1 and F2 maps every cone of F1 into a cone of F2.
ResolveFanMap(F1,F2) : TorFan,TorFan -> TorFan
A toric fan F that resolves the identity map of lattices restricted to the toric fans F1 and F2. The two fans Fi are expected to lie in the same lattice and to have the same support, and the resulting toric fan F gives a common refinement of them; in particular, F will admit a fan map into each of the Fi. (If the Fi have different supports, the fan F will be supported on their intersection and will only refine this part of each of them. Geometrically speaking, this will produce a non-proper resolution.)
Resolution(F) : TorFan -> TorFan
    deterministic: BoolElt              Default: true
A resolution of singularities of the fan F. If the optional parameter deterministic is set to false then a potentially much faster non-deterministic algorithm will be used to calculate the resolution.
Terminalisation(F) : TorFan -> TorFan
A Q-factorial terminal refinement of the fan F.
Canonicalisation(F) : TorFan -> TorFan
A Q-factorial canonical refinement of the fan F.
V2.28, 13 July 2023