The Geometry of Toric Varieties

Contents

Resolution of Singularities and Linear Systems

Resolution(X) : TorVar -> TorVar,TorMap
A resolution of singularities of the toric variety X together with the natural morphism from the resolution to X. The resolution is not necessarily minimal.
QFactorialisation(X) : TorVar -> TorVar, TorMap
A Q-factorialisation of X together with the natural morphism.
Terminalisation(X) : TorVar -> TorVar, TorMap
A Q-factorial terminal blowup of the toric variety X and the natural morphism.
Canonicalisation(X) : TorVar -> TorVar, TorMap
A Q-factorial canonical blowup of the toric variety X and the natural morphism.
ResolveLinearSystem(D) : DivTorElt -> TorVar
The toric variety Y whose fan lives in the same lattice as the fan of the toric variety X on which the divisor D is defined, such that Y resolves the map given by the linear system of D.

Mori Theory of Toric Varieties

MoriCone(X) : TorVar -> TorCon
The Mori Cone of toric variety X (as an abstract cone), that is, the cone generated by numerical classes of torus invariant curves on X.
NefCone(X) : TorVar -> TorCon
The nef Cone of toric variety X (as an abstract cone).
ExtremalRays(X) : TorVar -> SeqEnum
ExtremalRayContractions(X) : TorVar,RngIntElt -> SeqEnum
The images of extremal contractions of rays in the nef-cone of the toric variety X.
ExtremalRayContraction(X,i) : TorVar,RngIntElt -> TorVar,TorMap
The toric variety that is the image of the ith extremal contraction of the toric variety X; the contraction morphism is returned as a second value.
ExtremalRayContractionDivisor(X,i) : TorVar,RngIntElt -> DivTorElt
The toric divisor that gives the ith extremal contraction of the toric variety X (that is, the divisor is the pullback of an ample divisor on the image).
TypeOfContraction(X,i) : TorVar,RngIntElt -> MonStgElt
TypesOfContractions(X) : TorVar -> MonStgElt
A string describing the ith extremal contraction of the toric variety X (or all together in a sequence if i is not specified).
IsDivisorialContraction(X,i) : TorVar,RngIntElt -> BoolElt
True iff the contraction of the ith extremal ray of the toric variety X is a divisorial contraction.
IsMoriFibreSpace(X,i) : TorVar,RngIntElt -> BoolElt
Return true if and only if the ith extremal ray of the toric variety X gives an extremal contraction to a variety of lower dimension than X.
IsFlipping(X,i) : TorVar,RngIntElt -> BoolElt
Return true if and only if the ith extremal ray of the toric variety X gives a small contraction of X; in this case the intrinsic Flip(X,i) provides the flipped toric variety.
Flip(X,i) : TorVar,RngIntElt -> TorVar
The flipped variety of the ith extremal contraction of the toric variety X, assuming that this extremal contraction is of flipping type.
Flip(D) : DivTorElt -> TorVar
The (generalised) flip of the morphism given by the Q-Cartier divisor, assuming that this morphism is small.
WeightsOfFlip(X,i) : TorVar,RngIntElt -> SeqEnum
The weights of a Gm action whose variation would give the flip of the ith extremal contraction of the toric variety X, assuming that this extremal contraction is of flipping type.

Example Toric_toric-flipwts-example (H126E20)

> F0 := FanOfWPS([1,1,1,1]);
> L3 := Ambient(F0);
> F := Blowup(F0,L3 ! [2,-5,3]);
> X := ToricVariety(Rationals(),F);
> ExtremalRays(X);
[
    (0, -1),
    (1, 56)
]
> TypeOfContraction(X,1);
divisorial (K.C<0)
> TypeOfContraction(X,2);
flip
> WeightsOfFlip(X,2);
[
    [ 3, 2, -5, -1 ]
]

Example Toric_toric-weights-of-flip-example (H126E21)

We build a (nonsingular) variety X that is the projectivisation of the direct sum of line bundles (O)(0, 0, 0, 1, 1, 1, 1, 2) on the projective line P1.
> X<[x]> := RationalScroll(Rationals(),1,[0,0,0,1,1,1,1,2]);
> X;
Toric variety of dimension 8
Variables: x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10]
The components of the irrelevant ideal are:
    (x[10], x[9], x[8], x[7], x[6], x[5], x[4], x[3]), (x[2], x[1])
The 2 gradings are:
    1,  1,  0,  0,  0, -1, -1, -1, -1, -2,
    0,  0,  1,  1,  1,  1,  1,  1,  1,  1
We compute its nef cone simply to initiate all its Mori theoretic data.
> _ := NefCone(X);
We can consider various extreme rays of the Mori cone of X. (Our choice of parameters mean we consider rays [C] for which DC≤0, where D is the zero divisor: that is, we consider all rays.)
> IsFlipping(X,1: divisor:=ZeroDivisor(X), inequality:="weak");
false
> IsFlipping(X,2: divisor:=ZeroDivisor(X), inequality:="weak");
true
One of the rays corresponds to the fibration of X onto P1. The other is a ray of (anti-)flipping type. We can make the antiflip.
> Y<[y]> := Flip(X,2: divisor:=ZeroDivisor(X), inequality:="weak");
> Y;
Toric variety of dimension 8
Variables: y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8], y[9], y[10]
The components of the irrelevant ideal are:
    (y[10], y[9], y[8], y[7], y[6]), (y[5], y[4], y[3], y[2], y[1])
The 2 gradings are:
    0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 2, 2, 2, 1, 1, 1, 1, 0
> IsNonsingular(Y);
false
> IsTerminal(Y);
true
This antiflip can be regarded as coming from a change in the linearisation of a geometric invariant theory quotient: from a linearisation like (1, 1) (between variables 2 and 3 in the given order) to one like (2, 3) (between variables 5 and 6). To understand the antiflip better, sometimes it helps to consider its weights (the relation between vertices on the star of the flipping locus, or, in geometric invariant theory terms, the weights of the local Gm action that determine the flip).
> WeightsOfFlip(X,2: divisor:=ZeroDivisor(X), inequality:="weak");
[
    [ 1, 1, 0, 0, 0, -1, -1, -1, -1, -2 ],
    [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ]
]
Here we see that a P1 has been antiflipped in favour of a weighted P4(1, 1, 1, 1, 2), which is the source of the singularity on Y.
MMP(X) : TorVar -> SeqEnum,SeqEnum
    type: MonStgElt                     Default: "terminal"
A sequence of toric varieties that are all the varieties visited by making any sequence of extremal contractions from the toric variety X (and, if necessary, making the corresponding flip). A second sequence records the maps, in each case first by a sequence of the indices of the domain and codomain, and second by a string that describes the map.

The parameter type indicates which extremal rays are considered. It can be terminal, canonical or all. In each case, only toric varieties having these singularities will be allowed as images of the maps. (In particular, if the default value terminal is chosen, then only true KX-negative extremal contractions will be followed.)

Example Toric_toric-mmp-example1 (H126E22)

First make a toric variety X, in this case some blowup of P3.
> F := FanOfWPS([1,1,1,1]);
> G := Blowup(F, Ambient(F) ! [1,-1,1]);
> X := ToricVariety(Rationals(),G);
We compute all minimal model programs from X. There are two outputs: first a sequence containing those toric varieties encountered during these processes, and second a sequence containing all the maps encountered.
> models,mmp := MMP(X);
> #models;
3
> mmp;
[ [*
    [ 1, 2 ],
    divisorial (K.C<0)
*], [*
    [ 2, 3 ],
    map to point
*] ]
In this case there are three varieties. We could check that they are: (1) X itself, (2) P3, and (3) a point. We also see two maps: the first, labelled [1, 2], is the contraction of X back down to P3, and the second is the extremal contraction of P3 to a point.

The intrinsic call MMP(X) has a parameter, and the default is to search only for true absolute minimal model programs: those which proceed only by contracting extremal rays that are negative against the canonical class (and flipping them if necessary). To allow contractions of other extremal rays (and the possibility of requiring antiflips), we can set the parameter to type:="all".

> models,mmp := MMP(X : type:="all");
> models;
[
    Toric variety of dimension 3
    Variables: $.1, $.2, $.3, $.4, $.5
    The components of the irrelevant ideal are:
        ($.5, $.4), ($.3, $.2, $.1)
    The 2 gradings are:
        1, 0, 0, 2, 1,
        1, 1, 1, 1, 0,
    Toric variety of dimension 3
    Variables: $.1, $.2, $.3, $.4
    The irrelevant ideal is:
        ($.4, $.3, $.2, $.1)
    The grading is:
        1, 1, 1, 1,
    Toric variety of dimension 3
    Variables: $.1, $.2, $.3, $.4, $.5
    The components of the irrelevant ideal are:
        ($.3, $.2), ($.5, $.4, $.1)
    The 2 gradings are:
        1, 0, 0, 2, 1,
        1, 1, 1, 1, 0,
    Toric variety of dimension 0,
    Toric variety of dimension 1
    Variables: $.1, $.2
    The irrelevant ideal is:
        ($.2, $.1)
    The grading is:
        1, 1
]
> mmp;
[ [*
    [ 1, 2 ],
    divisorial (K.C<0)
*], [*
    [ 1, 3 ],
    flop
*], [*
    [ 2, 4 ],
    map to point
*], [*
    [ 3, 1 ],
    flop
*], [*
    [ 3, 5 ],
    fibration (K.C<0)
*] ]
Now we also see a flop from X to a new toric variety Y (model number 3), and then Y admits Mori fibration to P1 (which we could check is model number 5).

Decomposition of Toric Morphisms

The title of this section is that of a well-known paper of Reid [Rei83]. It applies Mori theory to toric varieties relatively over a base to compute a relative minimal model and the relative canonical model of a toric variety. Rather than wrap this up in intrinsics, we show how to apply the various components of this package to realise Reid's result.

Example Toric_toric-decomposition-example (H126E23)

We will compute a relative minimal model and a relative canonical model of the weighted projective space P3(1, 2, 5, 6), a 3-fold that does not have canonical (nor terminal) singularities.
> A := ProjectiveSpace(Rationals(),[1,2,5,6]);
> IsCanonical(A);
false
We find the relative models by running a minimal model program on a resolution of A relative to A itself (that is, we only allow morphisms V -> W if they factor the given morphism V -> A). So we start by constructing a resolution.
> V0,f0 := Resolution(A);
> V0;
Toric variety of dimension 3
Variables: $.1, $.2, $.3, $.4, $.5, $.6, $.7, $.8, $.9, $.10, $.11, $.12
The irrelevant ideal is:
   [... omitted... ]
The 9 gradings are:
    0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0,
    0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 0, 2, 3, 0, 0, 0, 0, 0, 1, 0, 0,
    0, 1, 2, 3, 0, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 1,
    0, 1, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 4, 5, 0, 1, 0, 0, 0, 0, 0, 0,
    1, 2, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0
We see that the resolution made 8=9 - 1 blowups. To compute everything, we would keep track of the morphisms (as we have started with f0 above); for brevity, we forego that.

We build a function which detects which of the extremal contractions from a given V (starting with V0) that factor V -> A. This code also reports whether the contraction is divisorial or of flipping type so that we can make the next step accordingly.

> raysOverA := func< W |
>     [ <i,TypeOfContraction(W,i)> :
>              i in [1..#ExtremalRays(W)] |
>     IsRegular(ToricVarietyMap(ExtremalRayContraction(W,i),A)) ] >;
And so we look for extremal rays over A that we can contract.
> raysOverA(V0);
[ <1, "divisorial (K.C<0)">, <2, "divisorial (K.C<0)">,
<3, "divisorial (K.C<0)"> ]
In other words, the extremal rays 1, 2 and 3 all determine extremal divisorial contractions. (If we were writing a faster routine, we would probably stop as soon as we'd found that ray 1 worked.) We can pick any of these: we choose ray 1 and repeat the process.
> V1 := ExtremalRayContraction(V0,1);
> raysOverA(V1);
[ <1, "divisorial (K.C<0)">, <2, "divisorial (K.C<0)">, <4, "divisorial
(K.C<0)"> ]
This time rays 1, 2, and 4 work; again these lead to divisorial contractions. We follow ray 1.
> V2 := ExtremalRayContraction(V1,1);
> raysOverA(V2);
[ <2, "divisorial (K.C<0)">, <3, "divisorial (K.C<0)"> ]
> V3 := ExtremalRayContraction(V2,2);
> raysOverA(V3);
[ <2, "divisorial (K.C<0)"> ]
> V4 := ExtremalRayContraction(V3,2);
> raysOverA(V4);
[ <2, "divisorial (K.C<0)"> ]
> V5<[w]> := ExtremalRayContraction(V4,2);
> assert #raysOverA(V5) eq 0;
There are no extremal rays over A to contract. We have reached a relatively minimal model, V5; we check its singularities, although there is no need.
> V5;
Toric variety of dimension 3
Variables: w[1], w[2], w[3], w[4], w[5], w[6]
The components of the irrelevant ideal are:
    (w[6], w[5]), (w[6], w[3]), (w[5], w[4], w[2]), (w[3], w[1]), (w[4], w[2],
        w[1])
The 3 gradings are:
    0, 0, 1, 1, 0, 1,
    0, 1, 2, 3, 1, 0,
    1, 2, 5, 6, 0, 0
> IsTerminal(V5);
true
To continue on to a relatively canonical model we must consider rays that are trivial against the canonical class, not negative as we have so far. We need to modify the relative rays function; we simply weaken the inequality used when evaluating against the canonical class.
> weakraysOverA := func< W |
>     [ <i,TypeOfContraction(W,i : inequality:="weak")> :
>                  i in [1..#ExtremalRays(W:inequality:="weak")] |
>  IsRegular(ToricVarietyMap(ExtremalRayContraction(W,i:inequality:="weak"),A))]>;
And so we continue.
> weakraysOverA(V5);
[ <2, "divisorial (K.C=0)"> ]
> V6<[u]> := ExtremalRayContraction(V5,2 : inequality:="weak");
> assert #weakraysOverA(V6) eq 0;
After one canonically-trivial divisorial contraction there are no rays left to contract. We have reached the relative canonical model.
> V6;
Toric variety of dimension 3
Variables: u[1], u[2], u[3], u[4], u[5]
The components of the irrelevant ideal are:
    (u[5], u[3]), (u[4], u[2], u[1])
The 2 gradings are:
    0, 0, 1, 1, 1,
    1, 2, 5, 6, 0
> IsTerminal(V6);
false
> IsCanonical(V6);
true
Of course, in this toric setting, it would have been simpler to find the single short vector in the fan of A that was causing all the trouble and blow that up.
V2.28, 13 July 2023