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.
A Q-factorialisation of X together with the natural morphism.
A Q-factorial terminal blowup of the toric variety X and the natural morphism.
A Q-factorial canonical blowup of the toric variety X and the natural morphism.
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.
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.
The nef Cone of toric variety X (as an abstract cone).
The images of extremal contractions of rays in the nef-cone of the toric variety X.
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.
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).
A string describing the ith extremal contraction of the toric variety X (or all together in a sequence if i is not specified).
True iff the contraction of the ith extremal ray of the toric variety X is a divisorial contraction.
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.
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.
The flipped variety of the ith extremal contraction of the toric variety X, assuming that this extremal contraction is of flipping type.
The (generalised) flip of the morphism given by the Q-Cartier divisor, assuming that this morphism is small.
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.
> 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 ]
]
> 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"); trueOne 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.
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.)
> 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).
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.
> A := ProjectiveSpace(Rationals(),[1,2,5,6]); > IsCanonical(A); falseWe 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.